@ledgerhq/context-module 0.0.0-develop-20260715002034 → 0.0.0-develop-20260716133720

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 (73) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +1 -1
  3. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +1 -1
  4. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +1 -1
  5. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +2 -2
  6. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +1 -1
  7. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +3 -3
  8. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  9. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +3 -3
  10. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  11. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +3 -3
  12. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +1 -1
  13. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +3 -3
  14. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +1 -1
  15. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +2 -2
  16. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +1 -1
  17. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +2 -2
  18. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +1 -1
  19. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  20. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +1 -1
  21. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
  22. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
  23. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
  24. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +3 -3
  25. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +1 -1
  26. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +1 -1
  27. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  28. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
  29. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  30. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
  31. package/lib/esm/package.json +1 -1
  32. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +1 -1
  33. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +1 -1
  34. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +1 -1
  35. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +2 -2
  36. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +1 -1
  37. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +3 -3
  38. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  39. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +3 -3
  40. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  41. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +3 -3
  42. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +1 -1
  43. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +3 -3
  44. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +1 -1
  45. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +2 -2
  46. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +1 -1
  47. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +2 -2
  48. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +1 -1
  49. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  50. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +1 -1
  51. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
  52. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
  53. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
  54. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +3 -3
  55. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  56. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
  57. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  58. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
  59. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts.map +1 -1
  60. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +50 -56
  61. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -1
  62. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts +4 -1
  63. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts.map +1 -1
  64. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +3 -5
  65. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
  66. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts +1 -1
  67. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -1
  68. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts +0 -1
  69. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts.map +1 -1
  70. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts +0 -1
  71. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -1
  72. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  73. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/instruction-info/data/InstructionInfoMapper.test.ts"],
4
- "sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nimport { type CalInstructionDescriptorDto } from \"./InstructionInfoDto\";\nimport {\n toAccountResets,\n toDisplayFields,\n toInstructionInfoPayload,\n toProgramEnumVariants,\n toValueFlowPorts,\n} from \"./InstructionInfoMapper\";\n\nconst PROGRAM = \"11111111111111111111111111111111\";\n\nfunction makeDescriptor(\n overrides: Partial<CalInstructionDescriptorDto> = {},\n): CalInstructionDescriptorDto {\n return {\n type: \"instruction\",\n instruction_info: {\n version: 1,\n program_id: PROGRAM,\n discriminator: \"00000000\",\n hash: \"feedface\",\n descriptor: {\n data: \"0001sys_data\",\n signatures: { prod: \"prodsig\", test: \"testsig\" },\n },\n },\n ...overrides,\n };\n}\n\ndescribe(\"InstructionInfoMapper\", () => {\n describe(\"toValueFlowPorts\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toValueFlowPorts()).toEqual([]);\n });\n\n it(\"picks only the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0, 1],\n account_index: 0,\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"NATIVE\" },\n },\n ]),\n ).toEqual([\n {\n account_indices: [0, 1],\n account_index: 0,\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"NATIVE\" },\n },\n ]);\n });\n\n it(\"leaves absent optional fields as undefined\", () => {\n expect(toValueFlowPorts([{ descriptor: \"vfp1\" }])).toEqual([\n {\n account_indices: undefined,\n account_index: undefined,\n optional_account_strategy: undefined,\n token_value: undefined,\n },\n ]);\n });\n });\n\n describe(\"toAccountResets\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toAccountResets()).toEqual([]);\n });\n\n it(\"maps the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toAccountResets([\n {\n descriptor: \"ar1\",\n account_index: 2,\n require_pre_balance_zero: true,\n },\n ]),\n ).toEqual([{ account_index: 2, require_pre_balance_zero: true }]);\n });\n\n it(\"drops entries missing account_index instead of defaulting to slot 0\", () => {\n expect(\n toAccountResets([\n { descriptor: \"ar0\", account_index: 0 },\n { descriptor: \"arBad\" },\n { descriptor: \"ar1\", account_index: 1 },\n ]),\n ).toEqual([\n { account_index: 0, require_pre_balance_zero: undefined },\n { account_index: 1, require_pre_balance_zero: undefined },\n ]);\n });\n });\n\n describe(\"toDisplayFields\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toDisplayFields()).toEqual([]);\n });\n\n it(\"picks name and param, dropping the signed-TLV descriptor\", () => {\n expect(\n toDisplayFields([\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]),\n ).toEqual([\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]);\n });\n\n it(\"falls back to an empty-type param when param is absent\", () => {\n expect(toDisplayFields([{ descriptor: \"df1\" }])).toEqual([\n { name: undefined, param: { type: \"\" } },\n ]);\n });\n });\n\n describe(\"toInstructionInfoPayload\", () => {\n it(\"surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures\", () => {\n const dto = makeDescriptor({\n instruction_info: {\n version: 1,\n program_id: PROGRAM,\n discriminator: \"00000000\",\n hash: \"feedface\",\n descriptor: {\n data: \"0001sys_data\",\n signatures: { prod: \"prodsig\", test: \"testsig\" },\n },\n idl_descriptor: {\n root_type: 3,\n type_pool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mint_association: { account_index: 1, mint_index: 3 },\n },\n display_fields: [\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n value_flow_ports: [\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ],\n hide_rules: [{ descriptor: \"hr1\" }],\n account_resets: [\n {\n descriptor: \"ar1\",\n account_index: 1,\n require_pre_balance_zero: true,\n },\n ],\n });\n\n const payload = toInstructionInfoPayload(\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n\n expect(payload).toMatchObject({\n programId: PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig\" },\n idlDescriptor: {\n rootType: 3,\n typePool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mintAssociations: [{ account_index: 1, mint_index: 3 }],\n valueFlowPorts: [\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n },\n ],\n accountResets: [{ account_index: 1, require_pre_balance_zero: true }],\n displayFields: [\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n });\n // Substructures carry the signed TLVs for the device, in order.\n expect(payload.substructures).toEqual([\n { kind: 0x00, data: \"df1\" },\n { kind: 0x01, data: \"vfp1\" },\n { kind: 0x02, data: \"hr1\" },\n { kind: 0x03, data: \"ar1\" },\n ]);\n });\n\n it(\"defaults idlDescriptor when CAL omits it\", () => {\n const payload = toInstructionInfoPayload(\n \"00000000\",\n makeDescriptor(),\n \"prod\",\n ).unsafeCoerce();\n expect(payload.idlDescriptor).toEqual({ typePool: [], rootType: 0 });\n expect(payload.mintAssociations).toEqual([]);\n });\n\n it(\"bundles CAL enum_variants into the payload with the mode signature\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"skips enum_variants keyed by a non-u16 index instead of leaking NaN\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n \"7abc\": {\n variant_name: \"junk\",\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n \"70000\": {\n variant_name: \"overflow\",\n data: \"overflow_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"selects the signature for the configured mode\", () => {\n const payload = toInstructionInfoPayload(\n \"00000000\",\n makeDescriptor(),\n \"test\",\n ).unsafeCoerce();\n expect(payload.instructionInfo.signature).toBe(\"testsig\");\n });\n\n it(\"returns Left when the configured mode signature is missing\", () => {\n const dto = makeDescriptor();\n delete (dto.instruction_info.descriptor.signatures as { test?: string })\n .test;\n const result = toInstructionInfoPayload(\"00000000\", dto, \"test\");\n expect(result.isLeft()).toBe(true);\n expect(result.swap().unsafeCoerce().message).toMatch(\n /missing 'test' signature/,\n );\n });\n });\n\n describe(\"toProgramEnumVariants\", () => {\n it(\"flattens enum variants across all descriptors, dropping malformed keys\", () => {\n const descriptors: Record<string, CalInstructionDescriptorDto> = {\n \"00000000\": makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n bad: {\n variant_name: \"junk\",\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n }),\n \"00000001\": makeDescriptor({\n enum_variants: {\n route: {\n \"12\": {\n variant_name: \"orca\",\n data: \"02_orca_tlv\",\n signatures: { prod: \"prodsig_v12\", test: \"testsig_v12\" },\n },\n },\n },\n }),\n };\n expect(toProgramEnumVariants(descriptors, \"prod\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n {\n enumId: \"route\",\n variantIndex: 12,\n descriptor: { data: \"02_orca_tlv\", signature: \"prodsig_v12\" },\n },\n ]);\n });\n\n it(\"leaves the signature empty when CAL has none for the configured mode\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\" },\n },\n },\n },\n });\n expect(toProgramEnumVariants({ \"00000000\": dto }, \"test\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"\" },\n },\n ]);\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nimport { type CalInstructionDescriptorDto } from \"./InstructionInfoDto\";\nimport {\n toAccountResets,\n toDisplayFields,\n toInstructionInfoPayload,\n toProgramEnumVariants,\n toValueFlowPorts,\n} from \"./InstructionInfoMapper\";\n\nconst PROGRAM = \"11111111111111111111111111111111\";\n\nfunction makeDescriptor(\n overrides: Partial<CalInstructionDescriptorDto> = {},\n): CalInstructionDescriptorDto {\n return {\n discriminator_hex: \"00000000\",\n instruction_name: \"createAccount\",\n descriptor: {\n data: \"0001sys_data\",\n signatures: { prod: \"prodsig\", test: \"testsig\" },\n },\n ...overrides,\n };\n}\n\ndescribe(\"InstructionInfoMapper\", () => {\n describe(\"toValueFlowPorts\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toValueFlowPorts()).toEqual([]);\n });\n\n it(\"picks only the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"NATIVE\" },\n },\n ]),\n ).toEqual([\n {\n account_indices: [0, 1],\n optional_account_strategy: \"OMITTED\",\n token_value: { kind: \"NATIVE\" },\n },\n ]);\n });\n\n it(\"leaves the absent optional strategy as undefined\", () => {\n expect(\n toValueFlowPorts([\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ]),\n ).toEqual([\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n },\n ]);\n });\n });\n\n describe(\"toAccountResets\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toAccountResets()).toEqual([]);\n });\n\n it(\"maps the decoded fields, dropping the signed-TLV descriptor\", () => {\n expect(\n toAccountResets([\n {\n descriptor: \"ar1\",\n account_index: 2,\n require_pre_balance_zero: true,\n },\n ]),\n ).toEqual([{ account_index: 2, require_pre_balance_zero: true }]);\n });\n\n it(\"drops entries missing account_index instead of defaulting to slot 0\", () => {\n expect(\n toAccountResets([\n { descriptor: \"ar0\", account_index: 0 },\n { descriptor: \"arBad\" },\n { descriptor: \"ar1\", account_index: 1 },\n ]),\n ).toEqual([\n { account_index: 0, require_pre_balance_zero: undefined },\n { account_index: 1, require_pre_balance_zero: undefined },\n ]);\n });\n });\n\n describe(\"toDisplayFields\", () => {\n it(\"returns an empty list for undefined input\", () => {\n expect(toDisplayFields()).toEqual([]);\n });\n\n it(\"picks name and param, dropping the signed-TLV descriptor\", () => {\n expect(\n toDisplayFields([\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]),\n ).toEqual([\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ]);\n });\n\n it(\"falls back to an empty-type param when param is absent\", () => {\n expect(toDisplayFields([{ descriptor: \"df1\" }])).toEqual([\n { name: undefined, param: { type: \"\" } },\n ]);\n });\n });\n\n describe(\"toInstructionInfoPayload\", () => {\n it(\"surfaces CAL's decoded JSON (type pool, mint assoc, ports, resets, fields) and ordered substructures\", () => {\n const dto = makeDescriptor({\n idl_descriptor: {\n root_type: 3,\n type_pool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mint_association: { account_index: 1, mint_index: 3 },\n display_fields: [\n {\n descriptor: \"df1\",\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n value_flow_ports: [\n {\n descriptor: \"vfp1\",\n account_indices: [0],\n token_value: { kind: \"NATIVE\" },\n },\n ],\n hide_rules: [{ descriptor: \"hr1\" }],\n account_resets: [\n {\n descriptor: \"ar1\",\n account_index: 1,\n require_pre_balance_zero: true,\n },\n ],\n });\n\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n\n expect(payload).toMatchObject({\n programId: PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig\" },\n idlDescriptor: {\n rootType: 3,\n typePool: [\n { index: 0, kind: \"STRUCT\", refs: [1] },\n { index: 1, kind: \"U64\" },\n ],\n },\n mintAssociations: [{ account_index: 1, mint_index: 3 }],\n valueFlowPorts: [\n {\n account_indices: [0],\n optional_account_strategy: undefined,\n token_value: { kind: \"NATIVE\" },\n },\n ],\n accountResets: [{ account_index: 1, require_pre_balance_zero: true }],\n displayFields: [\n {\n name: \"New Account\",\n param: {\n type: \"ACCOUNT\",\n value: { source: \"ACCOUNT_PATH\", account_index: 1 },\n },\n },\n ],\n });\n // Substructures carry the signed TLVs for the device, in order.\n expect(payload.substructures).toEqual([\n { kind: 0x00, data: \"df1\" },\n { kind: 0x01, data: \"vfp1\" },\n { kind: 0x02, data: \"hr1\" },\n { kind: 0x03, data: \"ar1\" },\n ]);\n });\n\n it(\"defaults idlDescriptor when CAL omits it\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"prod\",\n ).unsafeCoerce();\n expect(payload.idlDescriptor).toEqual({ typePool: [], rootType: 0 });\n expect(payload.mintAssociations).toEqual([]);\n });\n\n it(\"bundles CAL enum_variants into the payload with the mode signature\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"skips enum_variants keyed by a non-u16 index instead of leaking NaN\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n \"7abc\": {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n \"70000\": {\n variant_name: \"overflow\",\n descriptor: {\n data: \"overflow_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n });\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n dto,\n \"prod\",\n ).unsafeCoerce();\n expect(payload.enumVariants).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n });\n\n it(\"selects the signature for the configured mode\", () => {\n const payload = toInstructionInfoPayload(\n PROGRAM,\n \"00000000\",\n makeDescriptor(),\n \"test\",\n ).unsafeCoerce();\n expect(payload.instructionInfo.signature).toBe(\"testsig\");\n });\n\n it(\"returns Left when the configured mode signature is missing\", () => {\n const dto = makeDescriptor();\n delete (dto.descriptor.signatures as { test?: string }).test;\n const result = toInstructionInfoPayload(PROGRAM, \"00000000\", dto, \"test\");\n expect(result.isLeft()).toBe(true);\n expect(result.swap().unsafeCoerce().message).toMatch(\n /missing 'test' signature/,\n );\n });\n });\n\n describe(\"toProgramEnumVariants\", () => {\n it(\"flattens enum variants across all descriptors, dropping malformed keys\", () => {\n const descriptors: Record<string, CalInstructionDescriptorDto> = {\n \"00000000\": makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\", test: \"testsig_v46\" },\n },\n },\n bad: {\n variant_name: \"junk\",\n descriptor: {\n data: \"junk_tlv\",\n signatures: { prod: \"x\", test: \"x\" },\n },\n },\n },\n },\n }),\n \"00000001\": makeDescriptor({\n enum_variants: {\n route: {\n \"12\": {\n variant_name: \"orca\",\n descriptor: {\n data: \"02_orca_tlv\",\n signatures: { prod: \"prodsig_v12\", test: \"testsig_v12\" },\n },\n },\n },\n },\n }),\n };\n expect(toProgramEnumVariants(descriptors, \"prod\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n {\n enumId: \"route\",\n variantIndex: 12,\n descriptor: { data: \"02_orca_tlv\", signature: \"prodsig_v12\" },\n },\n ]);\n });\n\n it(\"leaves the signature empty when CAL has none for the configured mode\", () => {\n const dto = makeDescriptor({\n enum_variants: {\n swap: {\n \"46\": {\n variant_name: \"raydiumCP\",\n descriptor: {\n data: \"01_raydium_tlv\",\n signatures: { prod: \"prodsig_v46\" },\n },\n },\n },\n },\n });\n expect(toProgramEnumVariants({ \"00000000\": dto }, \"test\")).toEqual([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"\" },\n },\n ]);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_vitest", "import_InstructionInfoMapper", "PROGRAM", "makeDescriptor", "overrides", "dto", "payload", "result", "descriptors"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var m=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var E=(n,t)=>{for(var o in t)m(n,o,{get:t[o],enumerable:!0})},U=(n,t,o,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of b(t))!M.call(n,r)&&r!==o&&m(n,r,{get:()=>t[r],enumerable:!(e=S(t,r))||e.enumerable});return n};var F=n=>U(m({},"__esModule",{value:!0}),n),h=(n,t,o,e)=>{for(var r=e>1?void 0:e?S(t,o):t,s=n.length-1,c;s>=0;s--)(c=n[s])&&(r=(e?c(t,o,r):c(r))||r);return e&&r&&m(t,o,r),r},I=(n,t)=>(o,e)=>t(o,e,n);var W={};E(W,{InstructionInfoContextLoader:()=>g});module.exports=F(W);var d=require("inversify"),i=require("purify-ts"),R=require("../../../../config/di/configTypes"),v=require("../../../../modules/multichain/pki/di/pkiTypes"),x=require("../../../../modules/multichain/pki/model/KeyId"),O=require("../../../../modules/multichain/pki/model/KeyUsage"),T=require("../../../../modules/solana/instruction-info/di/instructionInfoTypes"),l=require("../../../../shared/model/ClearSignContext"),L=require("../../../../shared/utils/certificateResult"),N=require("../../../../shared/utils/deviceModelIdCodec");const _=[l.ClearSignContextType.SOLANA_INSTRUCTION_INFO],A="solana-mainnet",K=i.Codec.interface({programId:i.string,discriminator:(0,i.optional)(i.string)}),j=i.Codec.interface({deviceModelId:N.deviceModelIdCodec,instructions:(0,i.array)(K),network:(0,i.optional)(i.string)});let g=class{constructor(t,o,e){this.dataSource=t;this.certificateLoader=o;this.logger=e("InstructionInfoContextLoader")}logger;canHandle(t,o){return _.every(e=>o.includes(e))?j.decode(t).caseOf({Left:()=>!1,Right:({instructions:e})=>e.length>0&&e.every(r=>r.programId.length>0)}):!1}async load(t){const o=t.network||A,e=Array.from(new Set(t.instructions.map(a=>a.programId)));this.logger.debug("[load] Fetching instruction descriptors",{data:{network:o,programCount:e.length,instructionCount:t.instructions.length}});const r=(0,L.loadCertificateResult)(this.certificateLoader,{keyId:x.KeyId.TokenMetadataKey,keyUsage:O.KeyUsage.CoinMeta,targetDevice:t.deviceModelId}),s=Promise.all(e.map(async a=>({programId:a,either:await this.dataSource.getInstructionInfo({programId:a,network:o})}))),[c,P]=await Promise.all([r,s]);if(!c.ok||!c.value){const a=c.ok?new Error("[ContextModule] InstructionInfoContextLoader: certificate is missing"):c.error;return this.logger.warn("[load] INSTRUCTION_INFO certificate unavailable",{data:{error:a.message}}),e.map(()=>({type:l.ClearSignContextType.ERROR,error:a}))}const k=c.value,u=[];for(const{programId:a,either:w}of P)w.caseOf({Left:f=>{this.logger.warn("[load] Failed to fetch instruction descriptors for program",{data:{programId:a,error:f.message}}),u.push({type:l.ClearSignContextType.ERROR,error:f})},Right:f=>{const C=this.collectWantedDiscriminators(a,t.instructions);for(const[y,D]of Object.entries(f.descriptors))C!==null&&!C.has(y)||u.push(D.caseOf({Left:p=>(this.logger.warn("[load] INSTRUCTION_INFO descriptor error",{data:{programId:a,discriminator:y,error:p.message}}),{type:l.ClearSignContextType.ERROR,error:p}),Right:p=>({type:l.ClearSignContextType.SOLANA_INSTRUCTION_INFO,payload:p,certificate:k})}))}});return this.logger.debug("[load] Emitted contexts",{data:{count:u.length}}),u}collectWantedDiscriminators(t,o){const e=new Set;let r=!1;for(const s of o)s.programId===t&&(s.discriminator===void 0?r=!0:e.add(s.discriminator));return r?null:e}};g=h([(0,d.injectable)(),I(0,(0,d.inject)(T.instructionInfoTypes.InstructionInfoDataSource)),I(1,(0,d.inject)(v.pkiTypes.PkiCertificateLoader)),I(2,(0,d.inject)(R.configTypes.ContextModuleLoggerFactory))],g);0&&(module.exports={InstructionInfoContextLoader});
1
+ "use strict";var m=Object.defineProperty;var S=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var U=(n,t)=>{for(var o in t)m(n,o,{get:t[o],enumerable:!0})},F=(n,t,o,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of b(t))!E.call(n,r)&&r!==o&&m(n,r,{get:()=>t[r],enumerable:!(e=S(t,r))||e.enumerable});return n};var M=n=>F(m({},"__esModule",{value:!0}),n),h=(n,t,o,e)=>{for(var r=e>1?void 0:e?S(t,o):t,s=n.length-1,c;s>=0;s--)(c=n[s])&&(r=(e?c(t,o,r):c(r))||r);return e&&r&&m(t,o,r),r},I=(n,t)=>(o,e)=>t(o,e,n);var W={};U(W,{InstructionInfoContextLoader:()=>g});module.exports=M(W);var d=require("inversify"),i=require("purify-ts"),R=require("../../../../config/di/configTypes"),v=require("../../../../modules/multichain/pki/di/pkiTypes"),x=require("../../../../modules/multichain/pki/model/KeyId"),O=require("../../../../modules/multichain/pki/model/KeyUsage"),T=require("../../../../modules/solana/instruction-info/di/instructionInfoTypes"),l=require("../../../../shared/model/ClearSignContext"),L=require("../../../../shared/utils/certificateResult"),N=require("../../../../shared/utils/deviceModelIdCodec");const _=[l.ClearSignContextType.SOLANA_INSTRUCTION_INFO],A="solana-mainnet",K=i.Codec.interface({programId:i.string,discriminator:(0,i.optional)(i.string)}),j=i.Codec.interface({deviceModelId:N.deviceModelIdCodec,instructions:(0,i.array)(K),network:(0,i.optional)(i.string)});let g=class{constructor(t,o,e){this.dataSource=t;this.certificateLoader=o;this.logger=e("InstructionInfoContextLoader")}logger;canHandle(t,o){return _.every(e=>o.includes(e))?j.decode(t).caseOf({Left:()=>!1,Right:({instructions:e})=>e.length>0&&e.every(r=>r.programId.length>0)}):!1}async load(t){const o=t.network||A,e=Array.from(new Set(t.instructions.map(a=>a.programId)));this.logger.debug("[load] Fetching instruction descriptors",{data:{network:o,programCount:e.length,instructionCount:t.instructions.length}});const r=(0,L.loadCertificateResult)(this.certificateLoader,{keyId:x.KeyId.CalCalldataKey,keyUsage:O.KeyUsage.Calldata,targetDevice:t.deviceModelId}),s=Promise.all(e.map(async a=>({programId:a,either:await this.dataSource.getInstructionInfo({programId:a,network:o})}))),[c,P]=await Promise.all([r,s]);if(!c.ok||!c.value){const a=c.ok?new Error("[ContextModule] InstructionInfoContextLoader: certificate is missing"):c.error;return this.logger.warn("[load] INSTRUCTION_INFO certificate unavailable",{data:{error:a.message}}),e.map(()=>({type:l.ClearSignContextType.ERROR,error:a}))}const w=c.value,u=[];for(const{programId:a,either:k}of P)k.caseOf({Left:f=>{this.logger.warn("[load] Failed to fetch instruction descriptors for program",{data:{programId:a,error:f.message}}),u.push({type:l.ClearSignContextType.ERROR,error:f})},Right:f=>{const C=this.collectWantedDiscriminators(a,t.instructions);for(const[y,D]of Object.entries(f.descriptors))C!==null&&!C.has(y)||u.push(D.caseOf({Left:p=>(this.logger.warn("[load] INSTRUCTION_INFO descriptor error",{data:{programId:a,discriminator:y,error:p.message}}),{type:l.ClearSignContextType.ERROR,error:p}),Right:p=>({type:l.ClearSignContextType.SOLANA_INSTRUCTION_INFO,payload:p,certificate:w})}))}});return this.logger.debug("[load] Emitted contexts",{data:{count:u.length}}),u}collectWantedDiscriminators(t,o){const e=new Set;let r=!1;for(const s of o)s.programId===t&&(s.discriminator===void 0?r=!0:e.add(s.discriminator));return r?null:e}};g=h([(0,d.injectable)(),I(0,(0,d.inject)(T.instructionInfoTypes.InstructionInfoDataSource)),I(1,(0,d.inject)(v.pkiTypes.PkiCertificateLoader)),I(2,(0,d.inject)(R.configTypes.ContextModuleLoggerFactory))],g);0&&(module.exports={InstructionInfoContextLoader});
2
2
  //# sourceMappingURL=InstructionInfoContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.ts"],
4
- "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\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 { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type InstructionInfoDataSource } from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { instructionInfoTypes } from \"@/modules/solana/instruction-info/di/instructionInfoTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadCertificateResult } from \"@/shared/utils/certificateResult\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n];\n\nconst NETWORK_DEFAULT = \"solana-mainnet\";\n\n/**\n * Per-instruction reference the caller provides for the TX it wants to\n * clear-sign. Discriminator is optional: when omitted, the loader emits\n * every descriptor CAL returns for that `programId`. When present, the\n * loader filters down to descriptors whose `discriminator` matches.\n */\nexport type SolanaInstructionRef = {\n programId: string;\n discriminator?: string;\n};\n\nexport type SolanaInstructionInfoContextInput = {\n deviceModelId: DeviceModelId;\n instructions: SolanaInstructionRef[];\n network?: string;\n};\n\nconst instructionRefCodec = Codec.interface({\n programId: string,\n discriminator: optional(string),\n});\n\nconst solanaInstructionInfoInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n instructions: array(instructionRefCodec),\n network: optional(string),\n});\n\n/**\n * Emits SOLANA_INSTRUCTION_INFO contexts for the requested instructions.\n * Enum-variant emission lives in the sibling {@link EnumVariantContextLoader}.\n */\n@injectable()\nexport class InstructionInfoContextLoader\n implements ContextLoader<SolanaInstructionInfoContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(instructionInfoTypes.InstructionInfoDataSource)\n private readonly dataSource: InstructionInfoDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"InstructionInfoContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaInstructionInfoContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) {\n return false;\n }\n return solanaInstructionInfoInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ instructions }) =>\n instructions.length > 0 &&\n instructions.every((ix) => ix.programId.length > 0),\n });\n }\n\n public async load(\n input: SolanaInstructionInfoContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n const distinctProgramIds = Array.from(\n new Set(input.instructions.map((ix) => ix.programId)),\n );\n\n this.logger.debug(\"[load] Fetching instruction descriptors\", {\n data: {\n network,\n programCount: distinctProgramIds.length,\n instructionCount: input.instructions.length,\n },\n });\n\n // Run cert load in parallel with CAL fetches \u2014 neither depends on the\n // other. The tagged-Result wrapper lets us preserve the data fetches\n // if cert fails so we can surface a per-program ERROR rather than\n // silently dropping them.\n const certPromise = loadCertificateResult(this.certificateLoader, {\n keyId: KeyId.TokenMetadataKey,\n keyUsage: KeyUsage.CoinMeta,\n targetDevice: input.deviceModelId,\n });\n\n // One CAL call per program, fanned out in parallel.\n const dataPromise = Promise.all(\n distinctProgramIds.map(async (programId) => ({\n programId,\n either: await this.dataSource.getInstructionInfo({\n programId,\n network,\n }),\n })),\n );\n\n const [certResult, results] = await Promise.all([certPromise, dataPromise]);\n\n if (!certResult.ok || !certResult.value) {\n const error = certResult.ok\n ? new Error(\n \"[ContextModule] InstructionInfoContextLoader: certificate is missing\",\n )\n : certResult.error;\n this.logger.warn(\"[load] INSTRUCTION_INFO certificate unavailable\", {\n data: { error: error.message },\n });\n return distinctProgramIds.map(() => ({\n type: ClearSignContextType.ERROR,\n error,\n }));\n }\n const certificate = certResult.value;\n\n const contexts: ClearSignContext[] = [];\n\n for (const { programId, either } of results) {\n either.caseOf<void>({\n Left: (err) => {\n this.logger.warn(\n \"[load] Failed to fetch instruction descriptors for program\",\n { data: { programId, error: err.message } },\n );\n contexts.push({\n type: ClearSignContextType.ERROR,\n error: err,\n });\n },\n Right: (value) => {\n const wantedDiscriminators = this.collectWantedDiscriminators(\n programId,\n input.instructions,\n );\n\n for (const [discriminator, result] of Object.entries(\n value.descriptors,\n )) {\n if (\n wantedDiscriminators !== null &&\n !wantedDiscriminators.has(discriminator)\n ) {\n continue;\n }\n contexts.push(\n result.caseOf<ClearSignContext>({\n Left: (error) => {\n this.logger.warn(\"[load] INSTRUCTION_INFO descriptor error\", {\n data: { programId, discriminator, error: error.message },\n });\n return { type: ClearSignContextType.ERROR, error };\n },\n Right: (payload) => ({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n payload,\n certificate,\n }),\n }),\n );\n }\n },\n });\n }\n\n this.logger.debug(\"[load] Emitted contexts\", {\n data: { count: contexts.length },\n });\n\n return contexts;\n }\n\n /**\n * Returns the set of discriminators the caller has explicitly asked\n * about for this `programId`, or `null` when the caller wants every\n * descriptor CAL has for the program.\n */\n private collectWantedDiscriminators(\n programId: string,\n instructions: SolanaInstructionRef[],\n ): Set<string> | null {\n const set = new Set<string>();\n let hasUnconstrained = false;\n for (const ix of instructions) {\n if (ix.programId !== programId) continue;\n if (ix.discriminator === undefined) {\n hasUnconstrained = true;\n } else {\n set.add(ix.discriminator);\n }\n }\n return hasUnconstrained ? null : set;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\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 { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type InstructionInfoDataSource } from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { instructionInfoTypes } from \"@/modules/solana/instruction-info/di/instructionInfoTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadCertificateResult } from \"@/shared/utils/certificateResult\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n];\n\nconst NETWORK_DEFAULT = \"solana-mainnet\";\n\n/**\n * Per-instruction reference the caller provides for the TX it wants to\n * clear-sign. Discriminator is optional: when omitted, the loader emits\n * every descriptor CAL returns for that `programId`. When present, the\n * loader filters down to descriptors whose `discriminator` matches.\n */\nexport type SolanaInstructionRef = {\n programId: string;\n discriminator?: string;\n};\n\nexport type SolanaInstructionInfoContextInput = {\n deviceModelId: DeviceModelId;\n instructions: SolanaInstructionRef[];\n network?: string;\n};\n\nconst instructionRefCodec = Codec.interface({\n programId: string,\n discriminator: optional(string),\n});\n\nconst solanaInstructionInfoInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n instructions: array(instructionRefCodec),\n network: optional(string),\n});\n\n/**\n * Emits SOLANA_INSTRUCTION_INFO contexts for the requested instructions.\n * Enum-variant emission lives in the sibling {@link EnumVariantContextLoader}.\n */\n@injectable()\nexport class InstructionInfoContextLoader\n implements ContextLoader<SolanaInstructionInfoContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(instructionInfoTypes.InstructionInfoDataSource)\n private readonly dataSource: InstructionInfoDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"InstructionInfoContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaInstructionInfoContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) {\n return false;\n }\n return solanaInstructionInfoInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ instructions }) =>\n instructions.length > 0 &&\n instructions.every((ix) => ix.programId.length > 0),\n });\n }\n\n public async load(\n input: SolanaInstructionInfoContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n const distinctProgramIds = Array.from(\n new Set(input.instructions.map((ix) => ix.programId)),\n );\n\n this.logger.debug(\"[load] Fetching instruction descriptors\", {\n data: {\n network,\n programCount: distinctProgramIds.length,\n instructionCount: input.instructions.length,\n },\n });\n\n // Run cert load in parallel with CAL fetches \u2014 neither depends on the\n // other. The tagged-Result wrapper lets us preserve the data fetches\n // if cert fails so we can surface a per-program ERROR rather than\n // silently dropping them.\n const certPromise = loadCertificateResult(this.certificateLoader, {\n keyId: KeyId.CalCalldataKey,\n keyUsage: KeyUsage.Calldata,\n targetDevice: input.deviceModelId,\n });\n\n // One CAL call per program, fanned out in parallel.\n const dataPromise = Promise.all(\n distinctProgramIds.map(async (programId) => ({\n programId,\n either: await this.dataSource.getInstructionInfo({\n programId,\n network,\n }),\n })),\n );\n\n const [certResult, results] = await Promise.all([certPromise, dataPromise]);\n\n if (!certResult.ok || !certResult.value) {\n const error = certResult.ok\n ? new Error(\n \"[ContextModule] InstructionInfoContextLoader: certificate is missing\",\n )\n : certResult.error;\n this.logger.warn(\"[load] INSTRUCTION_INFO certificate unavailable\", {\n data: { error: error.message },\n });\n return distinctProgramIds.map(() => ({\n type: ClearSignContextType.ERROR,\n error,\n }));\n }\n const certificate = certResult.value;\n\n const contexts: ClearSignContext[] = [];\n\n for (const { programId, either } of results) {\n either.caseOf<void>({\n Left: (err) => {\n this.logger.warn(\n \"[load] Failed to fetch instruction descriptors for program\",\n { data: { programId, error: err.message } },\n );\n contexts.push({\n type: ClearSignContextType.ERROR,\n error: err,\n });\n },\n Right: (value) => {\n const wantedDiscriminators = this.collectWantedDiscriminators(\n programId,\n input.instructions,\n );\n\n for (const [discriminator, result] of Object.entries(\n value.descriptors,\n )) {\n if (\n wantedDiscriminators !== null &&\n !wantedDiscriminators.has(discriminator)\n ) {\n continue;\n }\n contexts.push(\n result.caseOf<ClearSignContext>({\n Left: (error) => {\n this.logger.warn(\"[load] INSTRUCTION_INFO descriptor error\", {\n data: { programId, discriminator, error: error.message },\n });\n return { type: ClearSignContextType.ERROR, error };\n },\n Right: (payload) => ({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n payload,\n certificate,\n }),\n }),\n );\n }\n },\n });\n }\n\n this.logger.debug(\"[load] Emitted contexts\", {\n data: { count: contexts.length },\n });\n\n return contexts;\n }\n\n /**\n * Returns the set of discriminators the caller has explicitly asked\n * about for this `programId`, or `null` when the caller wants every\n * descriptor CAL has for the program.\n */\n private collectWantedDiscriminators(\n programId: string,\n instructions: SolanaInstructionRef[],\n ): Set<string> | null {\n const set = new Set<string>();\n let hasUnconstrained = false;\n for (const ix of instructions) {\n if (ix.programId !== programId) continue;\n if (ix.discriminator === undefined) {\n hasUnconstrained = true;\n } else {\n set.add(ix.discriminator);\n }\n }\n return hasUnconstrained ? null : set;\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["InstructionInfoContextLoader_exports", "__export", "InstructionInfoContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyId", "import_KeyUsage", "import_instructionInfoTypes", "import_ClearSignContext", "import_certificateResult", "import_deviceModelIdCodec", "SUPPORTED_TYPES", "NETWORK_DEFAULT", "instructionRefCodec", "solanaInstructionInfoInputCodec", "InstructionInfoContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "instructions", "ix", "network", "distinctProgramIds", "certPromise", "dataPromise", "programId", "certResult", "results", "error", "certificate", "contexts", "either", "err", "value", "wantedDiscriminators", "discriminator", "result", "payload", "set", "hasUnconstrained", "__decorateClass", "__decorateParam"]
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 (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"],
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 of account indices (length 1 for a single-account port). */\n account_indices: 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 m=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var h=(r,e)=>{for(var o in e)m(r,o,{get:e[o],enumerable:!0})},D=(r,e,o,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of S(e))!T.call(r,t)&&t!==o&&m(r,t,{get:()=>e[t],enumerable:!(n=u(e,t))||n.enumerable});return r};var C=r=>D(m({},"__esModule",{value:!0}),r),l=(r,e,o,n)=>{for(var t=n>1?void 0:n?u(e,o):e,i=r.length-1,a;i>=0;i--)(a=r[i])&&(t=(n?a(e,o,t):a(t))||t);return n&&t&&m(e,o,t),t},g=(r,e)=>(o,n)=>e(o,n,r);var E={};h(E,{HttpTokenAccountStateDataSource:()=>c});module.exports=C(E);var p=require("inversify"),s=require("purify-ts"),d=require("../../../../config/di/configTypes"),f=require("../../../../shared/network/di/networkTypes"),k=require("../../../../shared/utils/HexStringUtils"),y=require("../../../../shared/utils/signedDescriptorDto");let c=class{constructor(e,o){this.config=e;this.http=o}async getTokenAccountState({tokenAccount:e,challenge:o}){let n;try{n=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${e}`,{params:{challenge:o}})}catch(t){const i=t instanceof Error?t.message:String(t);return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${i}`))}return y.signedDescriptorDtoCodec.decode(n).caseOf({Left:t=>(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${e}: ${t}`)),Right:t=>{let i;try{i=k.HexStringUtils.hexToBytes(t.signedDescriptor)}catch(a){return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${e}: ${a.message}`))}return(0,s.Right)({tokenAccount:e,descriptor:i,keyId:t.keyId,keyUsage:t.keyUsage})}})}};c=l([(0,p.injectable)(),g(0,(0,p.inject)(d.configTypes.Config)),g(1,(0,p.inject)(f.networkTypes.NetworkClient))],c);0&&(module.exports={HttpTokenAccountStateDataSource});
1
+ "use strict";var m=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var h=(r,t)=>{for(var o in t)m(r,o,{get:t[o],enumerable:!0})},D=(r,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of S(t))!T.call(r,e)&&e!==o&&m(r,e,{get:()=>t[e],enumerable:!(n=g(t,e))||n.enumerable});return r};var C=r=>D(m({},"__esModule",{value:!0}),r),l=(r,t,o,n)=>{for(var e=n>1?void 0:n?g(t,o):t,i=r.length-1,c;i>=0;i--)(c=r[i])&&(e=(n?c(t,o,e):c(e))||e);return n&&e&&m(t,o,e),e},u=(r,t)=>(o,n)=>t(o,n,r);var A={};h(A,{HttpTokenAccountStateDataSource:()=>a});module.exports=C(A);var p=require("inversify"),s=require("purify-ts"),f=require("../../../../config/di/configTypes"),k=require("../../../../shared/network/di/networkTypes"),d=require("../../../../shared/utils/HexStringUtils"),y=require("../../../../shared/utils/signedDescriptorDto");let a=class{constructor(t,o){this.config=t;this.http=o}async getTokenAccountState({tokenAccount:t,challenge:o}){let n;try{n=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${t}`,{params:{challenge:o}})}catch(e){const i=e instanceof Error?e.message:String(e);return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${i}`))}return y.signedDescriptorDtoCodec.decode(n).caseOf({Left:e=>(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${t}: ${e}`)),Right:e=>{let i;try{i=d.HexStringUtils.hexToBytes(e.signedDescriptor)}catch(c){return(0,s.Left)(new Error(`[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${t}: ${c.message}`))}return(0,s.Right)({tokenAccount:t,descriptor:i,keyId:e.keyId,keyUsage:e.keyUsage})}})}};a=l([(0,p.injectable)(),u(0,(0,p.inject)(f.configTypes.Config)),u(1,(0,p.inject)(k.networkTypes.NetworkClient))],a);0&&(module.exports={HttpTokenAccountStateDataSource});
2
2
  //# sourceMappingURL=HttpTokenAccountStateDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.ts"],
4
- "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\n\nimport {\n type GetTokenAccountStateParams,\n type TokenAccountStateDataSource,\n type TokenAccountStateResult,\n} from \"./TokenAccountStateDataSource\";\n\ntype TokenAccountStateResponseDto = {\n descriptorType?: string;\n descriptorVersion?: string;\n account_address?: string;\n mint?: string;\n owner?: string;\n balance?: string;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpTokenAccountStateDataSource\n implements TokenAccountStateDataSource\n{\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getTokenAccountState({\n tokenAccount,\n challenge,\n }: GetTokenAccountStateParams): Promise<\n Either<Error, TokenAccountStateResult>\n > {\n let dto: TokenAccountStateResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n )) as TokenAccountStateResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, TokenAccountStateResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}: ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${tokenAccount}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n tokenAccount,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
4
+ "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\n\nimport {\n type GetTokenAccountStateParams,\n type TokenAccountStateDataSource,\n type TokenAccountStateResult,\n} from \"./TokenAccountStateDataSource\";\n\ntype TokenAccountStateResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n tokenAccount?: string;\n mint?: string;\n owner?: string;\n preBalance?: number;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpTokenAccountStateDataSource\n implements TokenAccountStateDataSource\n{\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getTokenAccountState({\n tokenAccount,\n challenge,\n }: GetTokenAccountStateParams): Promise<\n Either<Error, TokenAccountStateResult>\n > {\n let dto: TokenAccountStateResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n )) as TokenAccountStateResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, TokenAccountStateResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}: ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${tokenAccount}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n tokenAccount,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
5
  "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAC7BC,EAA+B,yCAC/BC,EAAyC,8CAqBlC,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,qBAAqB,CAChC,aAAAC,EACA,UAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,kCAAkCF,CAAY,GACtF,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASE,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,yFAAyFC,CAAM,EACjG,CACF,CACF,CAEA,OAAO,2BACJ,OAAOF,CAAG,EACV,OAA+C,CAC9C,KAAOC,MACL,QACE,IAAI,MACF,2EAA2EH,CAAY,KAAKG,CAAK,EACnG,CACF,EACF,MAAQE,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAa,iBAAe,WAAWD,EAAU,gBAAgB,CACnE,OAASF,EAAO,CACd,SAAO,QACL,IAAI,MACF,wFAAwFH,CAAY,KAAMG,EAAgB,OAAO,EACnI,CACF,CACF,CAEA,SAAO,SAAM,CACX,aAAAH,EACA,WAAAM,EACA,MAAOD,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EA7DaR,EAANU,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBX",
6
6
  "names": ["HttpTokenAccountStateDataSource_exports", "__export", "HttpTokenAccountStateDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "import_HexStringUtils", "import_signedDescriptorDto", "HttpTokenAccountStateDataSource", "config", "http", "tokenAccount", "challenge", "dto", "error", "reason", "validated", "descriptor", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var g=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var C=(t,e)=>{for(var o in e)g(t,o,{get:e[o],enumerable:!0})},E=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of D(e))!k.call(t,r)&&r!==o&&g(t,r,{get:()=>e[r],enumerable:!(s=d(e,r))||s.enumerable});return t};var x=t=>E(g({},"__esModule",{value:!0}),t),f=(t,e,o,s)=>{for(var r=s>1?void 0:s?d(e,o):e,m=t.length-1,i;m>=0;m--)(i=t[m])&&(r=(s?i(e,o,r):i(r))||r);return s&&r&&g(e,o,r),r},l=(t,e)=>(o,s)=>e(o,s,t);var w={};C(w,{HttpSolanaTrustedNameDataSource:()=>p});module.exports=x(w);var c=require("inversify"),a=require("purify-ts"),y=require("../../../../config/di/configTypes"),T=require("../../../../shared/network/di/networkTypes"),h=require("../../../../shared/utils/HexStringUtils"),N=require("../../../../shared/utils/signedDescriptorDto");let p=class{constructor(e,o){this.config=e;this.http=o}async getTrustedName({address:e,network:o,challenge:s,types:r,sources:m}){let i;try{i=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/names/solana/${o}/reverse/${e}`,{params:{types:r.join(","),sources:m.join(","),challenge:s}})}catch(n){const u=n instanceof Error?n.message:String(n);return(0,a.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${u}`))}return N.signedDescriptorDtoCodec.decode(i).caseOf({Left:n=>(0,a.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${e}: ${n}`)),Right:n=>{let u;try{u=h.HexStringUtils.hexToBytes(n.signedDescriptor)}catch(S){return(0,a.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: invalid hex in signedDescriptor for ${e}: ${S.message}`))}return(0,a.Right)({address:e,descriptor:u,keyId:n.keyId,keyUsage:n.keyUsage})}})}};p=f([(0,c.injectable)(),l(0,(0,c.inject)(y.configTypes.Config)),l(1,(0,c.inject)(T.networkTypes.NetworkClient))],p);0&&(module.exports={HttpSolanaTrustedNameDataSource});
1
+ "use strict";var l=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var x=(n,e)=>{for(var a in e)l(n,a,{get:e[a],enumerable:!0})},w=(n,e,a,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of k(e))!E.call(n,r)&&r!==a&&l(n,r,{get:()=>e[r],enumerable:!(i=y(e,r))||i.enumerable});return n};var M=n=>w(l({},"__esModule",{value:!0}),n),C=(n,e,a,i)=>{for(var r=i>1?void 0:i?y(e,a):e,s=n.length-1,o;s>=0;s--)(o=n[s])&&(r=(i?o(e,a,r):o(r))||r);return i&&r&&l(e,a,r),r},p=(n,e)=>(a,i)=>e(a,i,n);var D={};x(D,{HttpSolanaTrustedNameDataSource:()=>m});module.exports=M(D);var c=require("inversify"),t=require("purify-ts"),S=require("../../../../config/di/configTypes"),T=require("../../../../shared/model/SignatureTags"),h=require("../../../../shared/network/di/networkTypes"),d=require("../../../../shared/utils/HexStringUtils");const $=t.Codec.interface({signedDescriptor:t.Codec.interface({data:t.string,signatures:t.Codec.interface({prod:(0,t.optional)(t.string),test:(0,t.optional)(t.string)})}),keyId:t.string,keyUsage:t.string});let m=class{constructor(e,a){this.config=e;this.http=a}async getTrustedName({address:e,network:a,challenge:i,sources:r}){let s;try{s=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/names/solana/${a}/reverse/${e}`,{params:{sources:r.join(","),challenge:i}})}catch(o){const u=o instanceof Error?o.message:String(o);return(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${u}`))}return $.decode(s).caseOf({Left:o=>(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${e}: ${o}`)),Right:o=>{const u=this.config.cal.mode??"prod",f=o.signedDescriptor.signatures[u];if(!f)return(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: missing ${u} signature for ${e}`));let g;try{g=d.HexStringUtils.hexToBytes(d.HexStringUtils.appendSignatureToPayload(o.signedDescriptor.data,f,T.SIGNATURE_TAG))}catch(N){return(0,t.Left)(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: invalid signed descriptor for ${e}: ${N.message}`))}return(0,t.Right)({address:e,descriptor:g,keyId:o.keyId,keyUsage:o.keyUsage})}})}};m=C([(0,c.injectable)(),p(0,(0,c.inject)(S.configTypes.Config)),p(1,(0,c.inject)(h.networkTypes.NetworkClient))],m);0&&(module.exports={HttpSolanaTrustedNameDataSource});
2
2
  //# sourceMappingURL=HttpTrustedNameDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.ts"],
4
- "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\n\nimport {\n type GetSolanaTrustedNameParams,\n type SolanaTrustedNameDataSource,\n type SolanaTrustedNameResult,\n} from \"./TrustedNameDataSource\";\n\ntype TrustedNameResponseDto = {\n descriptorType?: string;\n descriptorVersion?: string;\n address?: string;\n name?: string;\n source?: string;\n nameType?: string;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpSolanaTrustedNameDataSource\n implements SolanaTrustedNameDataSource\n{\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getTrustedName({\n address,\n network,\n challenge,\n types,\n sources,\n }: GetSolanaTrustedNameParams): Promise<\n Either<Error, SolanaTrustedNameResult>\n > {\n let dto: TrustedNameResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/names/solana/${network}/reverse/${address}`,\n {\n params: {\n types: types.join(\",\"),\n sources: sources.join(\",\"),\n challenge,\n },\n },\n )) as TrustedNameResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, SolanaTrustedNameResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${address}: ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: invalid hex in signedDescriptor for ${address}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n address,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
- "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAC7BC,EAA+B,yCAC/BC,EAAyC,8CAqBlC,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,eAAe,CAC1B,QAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,QAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBJ,CAAO,YAAYD,CAAO,GACtF,CACE,OAAQ,CACN,MAAOG,EAAM,KAAK,GAAG,EACrB,QAASC,EAAQ,KAAK,GAAG,EACzB,UAAAF,CACF,CACF,CACF,CACF,OAASI,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,kFAAkFC,CAAM,EAC1F,CACF,CACF,CAEA,OAAO,2BACJ,OAAOF,CAAG,EACV,OAA+C,CAC9C,KAAOC,MACL,QACE,IAAI,MACF,2EAA2EN,CAAO,KAAKM,CAAK,EAC9F,CACF,EACF,MAAQE,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAa,iBAAe,WAAWD,EAAU,gBAAgB,CACnE,OAASF,EAAO,CACd,SAAO,QACL,IAAI,MACF,wFAAwFN,CAAO,KAAMM,EAAgB,OAAO,EAC9H,CACF,CACF,CAEA,SAAO,SAAM,CACX,QAAAN,EACA,WAAAS,EACA,MAAOD,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EAtEaX,EAANa,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBd",
6
- "names": ["HttpTrustedNameDataSource_exports", "__export", "HttpSolanaTrustedNameDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "import_HexStringUtils", "import_signedDescriptorDto", "HttpSolanaTrustedNameDataSource", "config", "http", "address", "network", "challenge", "types", "sources", "dto", "error", "reason", "validated", "descriptor", "__decorateClass", "__decorateParam"]
4
+ "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, Either, Left, optional, Right, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport {\n type ContextModuleCalMode,\n type ContextModuleServiceConfig,\n} from \"@/config/model/ContextModuleConfig\";\nimport { SIGNATURE_TAG } from \"@/shared/model/SignatureTags\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\n\nimport {\n type GetSolanaTrustedNameParams,\n type SolanaTrustedNameDataSource,\n type SolanaTrustedNameResult,\n} from \"./TrustedNameDataSource\";\n\nconst trustedNameResponseCodec = Codec.interface({\n signedDescriptor: Codec.interface({\n data: string,\n signatures: Codec.interface({\n prod: optional(string),\n test: optional(string),\n }),\n }),\n keyId: string,\n keyUsage: string,\n});\n\n@injectable()\nexport class HttpSolanaTrustedNameDataSource\n implements SolanaTrustedNameDataSource\n{\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getTrustedName({\n address,\n network,\n challenge,\n sources,\n }: GetSolanaTrustedNameParams): Promise<\n Either<Error, SolanaTrustedNameResult>\n > {\n let dto: unknown;\n try {\n dto = await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/names/solana/${network}/reverse/${address}`,\n {\n params: {\n sources: sources.join(\",\"),\n challenge,\n },\n },\n );\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${reason}`,\n ),\n );\n }\n\n return trustedNameResponseCodec\n .decode(dto)\n .caseOf<Either<Error, SolanaTrustedNameResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${address}: ${error}`,\n ),\n ),\n Right: (validated) => {\n const mode: ContextModuleCalMode = this.config.cal.mode ?? \"prod\";\n const signature = validated.signedDescriptor.signatures[mode];\n if (!signature) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: missing ${mode} signature for ${address}`,\n ),\n );\n }\n\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(\n HexStringUtils.appendSignatureToPayload(\n validated.signedDescriptor.data,\n signature,\n SIGNATURE_TAG,\n ),\n );\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: invalid signed descriptor for ${address}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n address,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAA6D,qBAE7DC,EAA4B,mCAK5BC,EAA8B,wCAC9BC,EAA6B,4CAC7BC,EAA+B,yCAQ/B,MAAMC,EAA2B,QAAM,UAAU,CAC/C,iBAAkB,QAAM,UAAU,CAChC,KAAM,SACN,WAAY,QAAM,UAAU,CAC1B,QAAM,YAAS,QAAM,EACrB,QAAM,YAAS,QAAM,CACvB,CAAC,CACH,CAAC,EACD,MAAO,SACP,SAAU,QACZ,CAAC,EAGM,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,eAAe,CAC1B,QAAAC,EACA,QAAAC,EACA,UAAAC,EACA,QAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAM,MAAM,KAAK,KAAK,IACpB,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBH,CAAO,YAAYD,CAAO,GACtF,CACE,OAAQ,CACN,QAASG,EAAQ,KAAK,GAAG,EACzB,UAAAD,CACF,CACF,CACF,CACF,OAASG,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,kFAAkFC,CAAM,EAC1F,CACF,CACF,CAEA,OAAOV,EACJ,OAAOQ,CAAG,EACV,OAA+C,CAC9C,KAAOC,MACL,QACE,IAAI,MACF,2EAA2EL,CAAO,KAAKK,CAAK,EAC9F,CACF,EACF,MAAQE,GAAc,CACpB,MAAMC,EAA6B,KAAK,OAAO,IAAI,MAAQ,OACrDC,EAAYF,EAAU,iBAAiB,WAAWC,CAAI,EAC5D,GAAI,CAACC,EACH,SAAO,QACL,IAAI,MACF,4DAA4DD,CAAI,kBAAkBR,CAAO,EAC3F,CACF,EAGF,IAAIU,EACJ,GAAI,CACFA,EAAa,iBAAe,WAC1B,iBAAe,yBACbH,EAAU,iBAAiB,KAC3BE,EACA,eACF,CACF,CACF,OAASJ,EAAO,CACd,SAAO,QACL,IAAI,MACF,kFAAkFL,CAAO,KAAMK,EAAgB,OAAO,EACxH,CACF,CACF,CAEA,SAAO,SAAM,CACX,QAAAL,EACA,WAAAU,EACA,MAAOH,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EApFaV,EAANc,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBf",
6
+ "names": ["HttpTrustedNameDataSource_exports", "__export", "HttpSolanaTrustedNameDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_SignatureTags", "import_networkTypes", "import_HexStringUtils", "trustedNameResponseCodec", "HttpSolanaTrustedNameDataSource", "config", "http", "address", "network", "challenge", "sources", "dto", "error", "reason", "validated", "mode", "signature", "descriptor", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var n=require("purify-ts"),e=require("vitest"),c=require("./HttpTrustedNameDataSource");(0,e.describe)("HttpSolanaTrustedNameDataSource",()=>{let r,t;const a="vitalik.sol",s="deadbeef",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};(0,e.beforeEach)(()=>{e.vi.clearAllMocks(),t={get:e.vi.fn()},r=new c.HttpSolanaTrustedNameDataSource(i,t)}),(0,e.it)("calls the names endpoint with network, types, sources and challenge",async()=>{t.get.mockResolvedValue({signedDescriptor:"01020304",keyId:"name_key",keyUsage:"trusted_name"}),await r.getTrustedName({address:a,network:"mainnet",challenge:s,types:["eoa","program"],sources:["sns","cal"]}),(0,e.expect)(t.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/names/solana/mainnet/reverse/${a}`,{params:{types:"eoa,program",sources:"sns,cal",challenge:s}})}),(0,e.it)("decodes signedDescriptor hex into Uint8Array",async()=>{t.get.mockResolvedValue({signedDescriptor:"ff00",keyId:"k",keyUsage:"u"});const o=await r.getTrustedName({address:a,network:"mainnet",challenge:s,types:["eoa"],sources:["sns"]});(0,e.expect)(o).toEqual((0,n.Right)({address:a,descriptor:new Uint8Array([255,0]),keyId:"k",keyUsage:"u"}))}),(0,e.it)("returns Left on malformed response",async()=>{t.get.mockResolvedValue({keyId:"k",keyUsage:"u"});const o=await r.getTrustedName({address:a,network:"mainnet",challenge:s,types:[],sources:[]});(0,e.expect)(o.isLeft()).toBe(!0),(0,e.expect)(o.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpSolanaTrustedNameDataSource: malformed response for ${a}:`))}),(0,e.it)("returns Left when HTTP client throws",async()=>{t.get.mockRejectedValue(new Error("net"));const o=await r.getTrustedName({address:a,network:"mainnet",challenge:s,types:[],sources:[]});(0,e.expect)(o).toEqual((0,n.Left)(new Error("[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net")))})});
1
+ "use strict";var c=require("purify-ts"),e=require("vitest"),o=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),u=require("./HttpTrustedNameDataSource");(0,e.describe)("HttpSolanaTrustedNameDataSource",()=>{let a,s;const r="vitalik.sol",n="deadbeef",l=(t="prod")=>({metadataServiceDomain:{url:"https://nft.api.ledger.com"},cal:{mode:t}}),d=(t="prod")=>new u.HttpSolanaTrustedNameDataSource(l(t),s),i=(t,m="ff00")=>({descriptorType:"name",descriptorVersion:"2",signedDescriptor:{data:m,signatures:t},keyId:"cal_trusted_name",keyUsage:"trusted_name"});(0,e.beforeEach)(()=>{e.vi.clearAllMocks(),s={get:e.vi.fn()},a=d()}),(0,e.it)("calls the names endpoint with network, sources and challenge (no types)",async()=>{s.get.mockResolvedValue(i({prod:"aabb"})),await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]}),(0,e.expect)(s.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/names/solana/${o.SolanaTransactionScanChainId.MAINNET}/reverse/${r}`,{params:{sources:"crypto_asset_list",challenge:n}})}),(0,e.it)("appends the prod signature TLV and decodes into a Uint8Array",async()=>{s.get.mockResolvedValue(i({prod:"aabb",test:"cc"}));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]});(0,e.expect)(t).toEqual((0,c.Right)({address:r,descriptor:new Uint8Array([255,0,21,2,170,187]),keyId:"cal_trusted_name",keyUsage:"trusted_name"}))}),(0,e.it)("selects the test signature when cal.mode is test",async()=>{a=d("test"),s.get.mockResolvedValue(i({prod:"aabb",test:"cc"}));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]});(0,e.expect)(t).toEqual((0,c.Right)({address:r,descriptor:new Uint8Array([255,0,21,1,204]),keyId:"cal_trusted_name",keyUsage:"trusted_name"}))}),(0,e.it)("returns Left when the signature for the active mode is missing",async()=>{a=d("prod"),s.get.mockResolvedValue(i({test:"cc"}));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:["crypto_asset_list"]});(0,e.expect)(t.isLeft()).toBe(!0),(0,e.expect)(t.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpSolanaTrustedNameDataSource: missing prod signature for ${r}`))}),(0,e.it)("returns Left on malformed response (hex-string signedDescriptor)",async()=>{s.get.mockResolvedValue({signedDescriptor:"01020304",keyId:"k",keyUsage:"u"});const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:[]});(0,e.expect)(t.isLeft()).toBe(!0),(0,e.expect)(t.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpSolanaTrustedNameDataSource: malformed response for ${r}:`))}),(0,e.it)("returns Left when HTTP client throws",async()=>{s.get.mockRejectedValue(new Error("net"));const t=await a.getTrustedName({address:r,network:String(o.SolanaTransactionScanChainId.MAINNET),challenge:n,sources:[]});(0,e.expect)(t).toEqual((0,c.Left)(new Error("[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net")))})});
2
2
  //# sourceMappingURL=HttpTrustedNameDataSource.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"./HttpTrustedNameDataSource\";\nimport { type SolanaTrustedNameDataSource } from \"./TrustedNameDataSource\";\n\ndescribe(\"HttpSolanaTrustedNameDataSource\", () => {\n let datasource: SolanaTrustedNameDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const address = \"vitalik.sol\";\n const challenge = \"deadbeef\";\n const config: ContextModuleServiceConfig = {\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpSolanaTrustedNameDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the names endpoint with network, types, sources and challenge\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n });\n\n await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [\"eoa\", \"program\"],\n sources: [\"sns\", \"cal\"],\n });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/names/solana/mainnet/reverse/${address}`,\n { params: { types: \"eoa,program\", sources: \"sns,cal\", challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"ff00\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [\"eoa\"],\n sources: [\"sns\"],\n });\n\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it(\"returns Left on malformed response\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\", keyUsage: \"u\" } as any);\n\n const result = await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [],\n sources: [],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: malformed response for ${address}:`,\n ),\n );\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [],\n sources: [],\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net\",\n ),\n ),\n );\n });\n});\n"],
5
- "mappings": "aAEA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAAgD,0CAGhD,YAAS,kCAAmC,IAAM,CAChD,IAAIC,EACAC,EACJ,MAAMC,EAAU,cACVC,EAAY,WACZC,EAAqC,CACzC,sBAAuB,CAAE,IAAK,4BAA6B,CAC7D,KAEA,cAAW,IAAM,CACf,KAAG,cAAc,EACjBH,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,kCACfI,EACAH,CACF,CACF,CAAC,KAED,MAAG,sEAAuE,SAAY,CACpFA,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,WAClB,MAAO,WACP,SAAU,cACZ,CAAC,EAED,MAAMD,EAAW,eAAe,CAC9B,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,MAAO,SAAS,EACxB,QAAS,CAAC,MAAO,KAAK,CACxB,CAAC,KAED,UAAOF,EAAS,GAAG,EAAE,qBACnB,8DAA8DC,CAAO,GACrE,CAAE,OAAQ,CAAE,MAAO,cAAe,QAAS,UAAW,UAAAC,CAAU,CAAE,CACpE,CACF,CAAC,KAED,MAAG,+CAAgD,SAAY,CAC7DF,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,OAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,eAAe,CAC7C,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,KAAK,EACb,QAAS,CAAC,KAAK,CACjB,CAAC,KAED,UAAOE,CAAM,EAAE,WACb,SAAM,CACJ,QAAAH,EACA,WAAY,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,EACvC,MAAO,IACP,SAAU,GACZ,CAAC,CACH,CACF,CAAC,KAED,MAAG,qCAAsC,SAAY,CACnDD,EAAS,IAAI,kBAAkB,CAAE,MAAO,IAAK,SAAU,GAAI,CAAQ,EAEnE,MAAMI,EAAS,MAAML,EAAW,eAAe,CAC7C,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,EACR,QAAS,CAAC,CACZ,CAAC,KAED,UAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,KACjC,UAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,gFAAgFH,CAAO,GAChG,CACF,CACF,CAAC,KAED,MAAG,uCAAwC,SAAY,CACrDD,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,eAAe,CAC7C,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,EACR,QAAS,CAAC,CACZ,CAAC,KAED,UAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,oFACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["import_purify_ts", "import_vitest", "import_HttpTrustedNameDataSource", "datasource", "httpMock", "address", "challenge", "config", "result"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"./HttpTrustedNameDataSource\";\nimport { type SolanaTrustedNameDataSource } from \"./TrustedNameDataSource\";\n\ndescribe(\"HttpSolanaTrustedNameDataSource\", () => {\n let datasource: SolanaTrustedNameDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const address = \"vitalik.sol\";\n const challenge = \"deadbeef\";\n\n const makeConfig = (mode: \"prod\" | \"test\" = \"prod\") =>\n ({\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n cal: { mode },\n }) as ContextModuleServiceConfig;\n\n const makeDatasource = (mode: \"prod\" | \"test\" = \"prod\") =>\n new HttpSolanaTrustedNameDataSource(\n makeConfig(mode),\n httpMock as unknown as DmkNetworkClient,\n );\n\n const objectResponse = (\n signatures: { prod?: string; test?: string },\n data = \"ff00\",\n ) => ({\n descriptorType: \"name\",\n descriptorVersion: \"2\",\n signedDescriptor: { data, signatures },\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n });\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = makeDatasource();\n });\n\n it(\"calls the names endpoint with network, sources and challenge (no types)\", async () => {\n httpMock.get.mockResolvedValue(objectResponse({ prod: \"aabb\" }));\n\n await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/names/solana/${SolanaTransactionScanChainId.MAINNET}/reverse/${address}`,\n {\n params: {\n sources: \"crypto_asset_list\",\n challenge,\n },\n },\n );\n });\n\n it(\"appends the prod signature TLV and decodes into a Uint8Array\", async () => {\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(02) + sig(aabb)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x02, 0xaa, 0xbb]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"selects the test signature when cal.mode is test\", async () => {\n datasource = makeDatasource(\"test\");\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(01) + sig(cc)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x01, 0xcc]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"returns Left when the signature for the active mode is missing\", async () => {\n datasource = makeDatasource(\"prod\");\n httpMock.get.mockResolvedValue(objectResponse({ test: \"cc\" }));\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: missing prod signature for ${address}`,\n ),\n );\n });\n\n it(\"returns Left on malformed response (hex-string signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"k\",\n keyUsage: \"u\",\n } as any);\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: malformed response for ${address}:`,\n ),\n );\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [],\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_purify_ts", "import_vitest", "import_SolanaTransactionScanChainId", "import_HttpTrustedNameDataSource", "datasource", "httpMock", "address", "challenge", "makeConfig", "mode", "makeDatasource", "objectResponse", "signatures", "data", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(r,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!d.call(r,t)&&t!==n&&s(r,t,{get:()=>e[t],enumerable:!(a=o(e,t))||a.enumerable});return r};var g=r=>m(s({},"__esModule",{value:!0}),r);var p={};module.exports=g(p);
1
+ "use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(r,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!d.call(r,t)&&t!==n&&s(r,t,{get:()=>e[t],enumerable:!(a=o(e,t))||a.enumerable});return r};var g=r=>m(s({},"__esModule",{value:!0}),r);var u={};module.exports=g(u);
2
2
  //# sourceMappingURL=TrustedNameDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/data/TrustedNameDataSource.ts"],
4
- "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetSolanaTrustedNameParams = {\n address: string;\n network: string;\n challenge: string;\n types: string[];\n sources: string[];\n};\n\nexport type SolanaTrustedNameResult = {\n address: string;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface SolanaTrustedNameDataSource {\n getTrustedName(\n params: GetSolanaTrustedNameParams,\n ): Promise<Either<Error, SolanaTrustedNameResult>>;\n}\n"],
4
+ "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetSolanaTrustedNameParams = {\n address: string;\n network: string;\n challenge: string;\n sources: string[];\n};\n\nexport type SolanaTrustedNameResult = {\n address: string;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface SolanaTrustedNameDataSource {\n getTrustedName(\n params: GetSolanaTrustedNameParams,\n ): Promise<Either<Error, SolanaTrustedNameResult>>;\n}\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["TrustedNameDataSource_exports", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var v=(s,t)=>{for(var o in t)d(s,o,{get:t[o],enumerable:!0})},x=(s,t,o,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of h(t))!N.call(s,r)&&r!==o&&d(s,r,{get:()=>t[r],enumerable:!(e=u(t,r))||e.enumerable});return s};var L=s=>x(d({},"__esModule",{value:!0}),s),m=(s,t,o,e)=>{for(var r=e>1?void 0:e?u(t,o):t,c=s.length-1,p;c>=0;c--)(p=s[c])&&(r=(e?p(t,o,r):p(r))||r);return e&&r&&d(t,o,r),r},l=(s,t)=>(o,e)=>t(o,e,s);var P={};v(P,{SolanaTrustedNameContextLoader:()=>i});module.exports=L(P);var n=require("inversify"),a=require("purify-ts"),y=require("../../../../config/di/configTypes"),f=require("../../../../modules/multichain/pki/di/pkiTypes"),S=require("../../../../modules/solana/trusted-name/di/trustedNameTypes"),g=require("../../../../shared/model/ClearSignContext"),T=require("../../../../shared/utils/challengeBoundLoader"),C=require("../../../../shared/utils/deviceModelIdCodec");const I=[g.ClearSignContextType.SOLANA_TRUSTED_NAME],M="mainnet",D=a.Codec.interface({address:a.string,challenge:a.string,types:(0,a.array)(a.string),sources:(0,a.array)(a.string)}),E=a.Codec.interface({deviceModelId:C.deviceModelIdCodec,network:(0,a.optional)(a.string),requests:(0,a.array)(D)});let i=class{constructor(t,o,e){this.dataSource=t;this.certificateLoader=o;this.logger=e("SolanaTrustedNameContextLoader")}logger;canHandle(t,o){return I.every(e=>o.includes(e))?E.decode(t).caseOf({Left:()=>!1,Right:({requests:e})=>e.length>0&&e.every(r=>r.address.length>0&&r.challenge.length>0)}):!1}async load(t){const o=t.network||M;return(0,T.loadChallengeBoundContexts)({requests:t.requests,deviceModelId:t.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"TRUSTED_NAME",fetch:e=>this.dataSource.getTrustedName({address:e.address,challenge:e.challenge,types:e.types,sources:e.sources,network:o}),toContext:(e,r)=>({type:g.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:e.descriptor,certificate:r}),describe:e=>({address:e.address})})}};i=m([(0,n.injectable)(),l(0,(0,n.inject)(S.solanaTrustedNameTypes.SolanaTrustedNameDataSource)),l(1,(0,n.inject)(f.pkiTypes.PkiCertificateLoader)),l(2,(0,n.inject)(y.configTypes.ContextModuleLoggerFactory))],i);0&&(module.exports={SolanaTrustedNameContextLoader});
1
+ "use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var v=(a,e)=>{for(var o in e)l(a,o,{get:e[o],enumerable:!0})},x=(a,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of I(e))!E.call(a,t)&&t!==o&&l(a,t,{get:()=>e[t],enumerable:!(r=u(e,t))||r.enumerable});return a};var L=a=>x(l({},"__esModule",{value:!0}),a),T=(a,e,o,r)=>{for(var t=r>1?void 0:r?u(e,o):e,i=a.length-1,g;i>=0;i--)(g=a[i])&&(t=(r?g(e,o,t):g(t))||t);return r&&t&&l(e,o,t),t},p=(a,e)=>(o,r)=>e(o,r,a);var k={};v(k,{SolanaTrustedNameContextLoader:()=>d});module.exports=L(k);var s=require("inversify"),n=require("purify-ts"),f=require("../../../../config/di/configTypes"),C=require("../../../../modules/multichain/pki/di/pkiTypes"),c=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),N=require("../../../../modules/solana/trusted-name/di/trustedNameTypes"),m=require("../../../../shared/model/ClearSignContext"),y=require("../../../../shared/utils/challengeBoundLoader"),h=require("../../../../shared/utils/deviceModelIdCodec");const M=[m.ClearSignContextType.SOLANA_TRUSTED_NAME],D={"solana-mainnet":c.SolanaTransactionScanChainId.MAINNET,"solana-devnet":c.SolanaTransactionScanChainId.DEVNET,"solana-testnet":c.SolanaTransactionScanChainId.TESTNET},S=c.SolanaTransactionScanChainId.MAINNET,A=n.Codec.interface({address:n.string,challenge:n.string,sources:(0,n.array)(n.string)}),R=n.Codec.interface({deviceModelId:h.deviceModelIdCodec,network:(0,n.optional)(n.string),requests:(0,n.array)(A)});let d=class{constructor(e,o,r){this.dataSource=e;this.certificateLoader=o;this.logger=r("SolanaTrustedNameContextLoader")}logger;canHandle(e,o){return M.every(r=>o.includes(r))?R.decode(e).caseOf({Left:()=>!1,Right:({requests:r})=>r.length>0&&r.every(t=>t.address.length>0&&t.challenge.length>0)}):!1}async load(e){const o=e.network?D[e.network]??S:S,r=String(o);return(0,y.loadChallengeBoundContexts)({requests:e.requests,deviceModelId:e.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"TRUSTED_NAME",fetch:t=>this.dataSource.getTrustedName({address:t.address,challenge:t.challenge,sources:t.sources,network:r}),toContext:(t,i)=>({type:m.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:t.descriptor,certificate:i}),describe:t=>({address:t.address})})}};d=T([(0,s.injectable)(),p(0,(0,s.inject)(N.solanaTrustedNameTypes.SolanaTrustedNameDataSource)),p(1,(0,s.inject)(C.pkiTypes.PkiCertificateLoader)),p(2,(0,s.inject)(f.configTypes.ContextModuleLoggerFactory))],d);0&&(module.exports={SolanaTrustedNameContextLoader});
2
2
  //# sourceMappingURL=TrustedNameContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.ts"],
4
- "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\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 { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRUSTED_NAME,\n];\n\nconst NETWORK_DEFAULT = \"mainnet\";\n\n/**\n * One trusted-name request, resolved to a Uint8Array TLV descriptor. The\n * caller must obtain a fresh challenge immediately before each fetch.\n */\nexport type SolanaTrustedNameRequest = {\n address: string;\n challenge: string;\n types: string[];\n sources: string[];\n};\n\nexport type SolanaTrustedNameContextInput = {\n deviceModelId: DeviceModelId;\n network?: string; // \"mainnet\" | \"devnet\" | \"testnet\"; defaults to mainnet\n requests: SolanaTrustedNameRequest[];\n};\n\nconst trustedNameRequestCodec = Codec.interface({\n address: string,\n challenge: string,\n types: array(string),\n sources: array(string),\n});\n\nconst solanaTrustedNameInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n network: optional(string),\n requests: array(trustedNameRequestCodec),\n});\n\n@injectable()\nexport class SolanaTrustedNameContextLoader\n implements ContextLoader<SolanaTrustedNameContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTrustedNameTypes.SolanaTrustedNameDataSource)\n private readonly dataSource: SolanaTrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTrustedNameContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTrustedNameContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTrustedNameInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every((r) => r.address.length > 0 && r.challenge.length > 0),\n });\n }\n\n public async load(\n input: SolanaTrustedNameContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"TRUSTED_NAME\",\n fetch: (request) =>\n this.dataSource.getTrustedName({\n address: request.address,\n challenge: request.challenge,\n types: request.types,\n sources: request.sources,\n network,\n }),\n toContext: (value, certificate) => ({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: value.descriptor,\n certificate,\n }),\n describe: (request) => ({ address: request.address }),\n });\n }\n}\n"],
5
- "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAA+C,qBAE/CC,EAA4B,mCAC5BC,EAAyB,gDAGzBC,EAAuC,6DAEvCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CAEnC,MAAMC,EAA0C,CAC9C,uBAAqB,mBACvB,EAEMC,EAAkB,UAmBlBC,EAA0B,QAAM,UAAU,CAC9C,QAAS,SACT,UAAW,SACX,SAAO,SAAM,QAAM,EACnB,WAAS,SAAM,QAAM,CACvB,CAAC,EAEKC,EAA8B,QAAM,UAAU,CAClD,cAAe,qBACf,WAAS,YAAS,QAAM,EACxB,YAAU,SAAMD,CAAuB,CACzC,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,gCAAgC,CAC9D,CAXiB,OAaV,UACLC,EACAC,EACwC,CACxC,OAAKT,EAAgB,MAAOU,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAA4B,OAAOK,CAAK,EAAE,OAAO,CACtD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MAAO,GAAM,EAAE,QAAQ,OAAS,GAAK,EAAE,UAAU,OAAS,CAAC,CACxE,CAAC,EANoE,EAOvE,CAEA,MAAa,KACXH,EAC6B,CAC7B,MAAMI,EAAUJ,EAAM,SAAWP,EAEjC,SAAO,8BAA2B,CAChC,SAAUO,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,eACP,MAAQK,GACN,KAAK,WAAW,eAAe,CAC7B,QAASA,EAAQ,QACjB,UAAWA,EAAQ,UACnB,MAAOA,EAAQ,MACf,QAASA,EAAQ,QACjB,QAAAD,CACF,CAAC,EACH,UAAW,CAACE,EAAOC,KAAiB,CAClC,KAAM,uBAAqB,oBAC3B,QAASD,EAAM,WACf,YAAAC,CACF,GACA,SAAWF,IAAa,CAAE,QAASA,EAAQ,OAAQ,EACrD,CAAC,CACH,CACF,EAxDaT,EAANY,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,yBAAuB,2BAA2B,GAEzDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCb",
6
- "names": ["TrustedNameContextLoader_exports", "__export", "SolanaTrustedNameContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_trustedNameTypes", "import_ClearSignContext", "import_challengeBoundLoader", "import_deviceModelIdCodec", "SUPPORTED_TYPES", "NETWORK_DEFAULT", "trustedNameRequestCodec", "solanaTrustedNameInputCodec", "SolanaTrustedNameContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "network", "request", "value", "certificate", "__decorateClass", "__decorateParam"]
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\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 { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRUSTED_NAME,\n];\n\nconst CHAIN_ID_BY_NETWORK: Record<string, SolanaTransactionScanChainId> = {\n \"solana-mainnet\": SolanaTransactionScanChainId.MAINNET,\n \"solana-devnet\": SolanaTransactionScanChainId.DEVNET,\n \"solana-testnet\": SolanaTransactionScanChainId.TESTNET,\n};\n\nconst NETWORK_DEFAULT = SolanaTransactionScanChainId.MAINNET;\n\n/**\n * One trusted-name request, resolved to a Uint8Array TLV descriptor. The\n * caller must obtain a fresh challenge immediately before each fetch.\n */\nexport type SolanaTrustedNameRequest = {\n address: string;\n challenge: string;\n sources: string[];\n};\n\nexport type SolanaTrustedNameContextInput = {\n deviceModelId: DeviceModelId;\n network?: string; // \"mainnet\" | \"devnet\" | \"testnet\"; defaults to mainnet\n requests: SolanaTrustedNameRequest[];\n};\n\nconst trustedNameRequestCodec = Codec.interface({\n address: string,\n challenge: string,\n sources: array(string),\n});\n\nconst solanaTrustedNameInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n network: optional(string),\n requests: array(trustedNameRequestCodec),\n});\n\n@injectable()\nexport class SolanaTrustedNameContextLoader\n implements ContextLoader<SolanaTrustedNameContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTrustedNameTypes.SolanaTrustedNameDataSource)\n private readonly dataSource: SolanaTrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTrustedNameContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTrustedNameContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTrustedNameInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every((r) => r.address.length > 0 && r.challenge.length > 0),\n });\n }\n\n public async load(\n input: SolanaTrustedNameContextInput,\n ): Promise<ClearSignContext[]> {\n const chainId = input.network\n ? (CHAIN_ID_BY_NETWORK[input.network] ?? NETWORK_DEFAULT)\n : NETWORK_DEFAULT;\n const network = String(chainId);\n\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"TRUSTED_NAME\",\n fetch: (request) =>\n this.dataSource.getTrustedName({\n address: request.address,\n challenge: request.challenge,\n sources: request.sources,\n network,\n }),\n toContext: (value, certificate) => ({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: value.descriptor,\n certificate,\n }),\n describe: (request) => ({ address: request.address }),\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAA+C,qBAE/CC,EAA4B,mCAC5BC,EAAyB,gDAEzBC,EAA6C,+DAE7CC,EAAuC,6DAEvCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CAEnC,MAAMC,EAA0C,CAC9C,uBAAqB,mBACvB,EAEMC,EAAoE,CACxE,iBAAkB,+BAA6B,QAC/C,gBAAiB,+BAA6B,OAC9C,iBAAkB,+BAA6B,OACjD,EAEMC,EAAkB,+BAA6B,QAkB/CC,EAA0B,QAAM,UAAU,CAC9C,QAAS,SACT,UAAW,SACX,WAAS,SAAM,QAAM,CACvB,CAAC,EAEKC,EAA8B,QAAM,UAAU,CAClD,cAAe,qBACf,WAAS,YAAS,QAAM,EACxB,YAAU,SAAMD,CAAuB,CACzC,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,gCAAgC,CAC9D,CAXiB,OAaV,UACLC,EACAC,EACwC,CACxC,OAAKV,EAAgB,MAAOW,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAA4B,OAAOK,CAAK,EAAE,OAAO,CACtD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MAAOC,GAAMA,EAAE,QAAQ,OAAS,GAAKA,EAAE,UAAU,OAAS,CAAC,CACxE,CAAC,EANoE,EAOvE,CAEA,MAAa,KACXJ,EAC6B,CAC7B,MAAMK,EAAUL,EAAM,QACjBR,EAAoBQ,EAAM,OAAO,GAAKP,EACvCA,EACEa,EAAU,OAAOD,CAAO,EAE9B,SAAO,8BAA2B,CAChC,SAAUL,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,eACP,MAAQO,GACN,KAAK,WAAW,eAAe,CAC7B,QAASA,EAAQ,QACjB,UAAWA,EAAQ,UACnB,QAASA,EAAQ,QACjB,QAAAD,CACF,CAAC,EACH,UAAW,CAACE,EAAOC,KAAiB,CAClC,KAAM,uBAAqB,oBAC3B,QAASD,EAAM,WACf,YAAAC,CACF,GACA,SAAWF,IAAa,CAAE,QAASA,EAAQ,OAAQ,EACrD,CAAC,CACH,CACF,EA1DaX,EAANc,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,yBAAuB,2BAA2B,GAEzDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCf",
6
+ "names": ["TrustedNameContextLoader_exports", "__export", "SolanaTrustedNameContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_SolanaTransactionScanChainId", "import_trustedNameTypes", "import_ClearSignContext", "import_challengeBoundLoader", "import_deviceModelIdCodec", "SUPPORTED_TYPES", "CHAIN_ID_BY_NETWORK", "NETWORK_DEFAULT", "trustedNameRequestCodec", "solanaTrustedNameInputCodec", "SolanaTrustedNameContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "r", "chainId", "network", "request", "value", "certificate", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var c=require("@ledgerhq/device-management-kit"),n=require("purify-ts"),e=require("vitest"),r=require("../../../../shared/model/ClearSignContext"),y=require("./TrustedNameContextLoader");const m=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),i={keyUsageNumber:4,payload:new Uint8Array([7])},s="Addr11111111111111111111111111111111111111",u="Addr22222222222222222222222222222222222222";(0,e.describe)("SolanaTrustedNameContextLoader",()=>{let d,l;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),d={getTrustedName:e.vi.fn()},l={loadCertificate:e.vi.fn().mockResolvedValue(i)}});const o=()=>new y.SolanaTrustedNameContextLoader(d,l,m);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TRUSTED_NAME is requested with valid requests",()=>{(0,e.expect)(o().canHandle({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:s,challenge:"c",types:["eoa"],sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TRUSTED_NAME is not requested",()=>{(0,e.expect)(o().canHandle({requests:[{address:s,challenge:"c",types:["eoa"],sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on malformed input",()=>{const t=o(),a=[r.ClearSignContextType.SOLANA_TRUSTED_NAME];(0,e.expect)(t.canHandle({requests:[]},a)).toBe(!1),(0,e.expect)(t.canHandle({requests:[{address:"",challenge:"c",types:[],sources:[]}]},a)).toBe(!1),(0,e.expect)(t.canHandle({requests:[{address:s,challenge:"",types:[],sources:[]}]},a)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:a})=>(0,n.Right)({address:a,descriptor:new Uint8Array([a===s?170:187]),keyId:"name_key",keyUsage:"trusted_name"}));const t=await o().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:s,challenge:"c1",types:["eoa"],sources:["sns"]},{address:u,challenge:"c2",types:["program"],sources:["cal"]}]});(0,e.expect)(t).toHaveLength(2),(0,e.expect)(t[0]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([170]),certificate:i}),(0,e.expect)(t[1]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([187])})}),(0,e.it)("emits an ERROR per failing request and keeps the others",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:a})=>a===s?(0,n.Right)({address:a,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):(0,n.Left)(new Error("upstream-404")));const t=await o().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:s,challenge:"c1",types:[],sources:[]},{address:u,challenge:"c2",types:[],sources:[]}]});(0,e.expect)(t[0]?.type).toBe(r.ClearSignContextType.SOLANA_TRUSTED_NAME),(0,e.expect)(t[1]?.type).toBe(r.ClearSignContextType.ERROR)}),(0,e.it)("forwards default network=mainnet when input.network is omitted",async()=>{const t=e.vi.spyOn(d,"getTrustedName").mockResolvedValue((0,n.Right)({address:s,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await o().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:s,challenge:"c",types:[],sources:[]}]}),(0,e.expect)(t).toHaveBeenCalledWith(e.expect.objectContaining({network:"mainnet"}))})})});
1
+ "use strict";var c=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),e=require("vitest"),m=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),r=require("../../../../shared/model/ClearSignContext"),y=require("./TrustedNameContextLoader");const A=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),l={keyUsageNumber:4,payload:new Uint8Array([7])},t="Addr11111111111111111111111111111111111111",u="Addr22222222222222222222222222222222222222";(0,e.describe)("SolanaTrustedNameContextLoader",()=>{let d,i;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),d={getTrustedName:e.vi.fn()},i={loadCertificate:e.vi.fn().mockResolvedValue(l)}});const n=()=>new y.SolanaTrustedNameContextLoader(d,i,A);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TRUSTED_NAME is requested with valid requests",()=>{(0,e.expect)(n().canHandle({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c",sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TRUSTED_NAME is not requested",()=>{(0,e.expect)(n().canHandle({requests:[{address:t,challenge:"c",sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on malformed input",()=>{const a=n(),s=[r.ClearSignContextType.SOLANA_TRUSTED_NAME];(0,e.expect)(a.canHandle({requests:[]},s)).toBe(!1),(0,e.expect)(a.canHandle({requests:[{address:"",challenge:"c",sources:[]}]},s)).toBe(!1),(0,e.expect)(a.canHandle({requests:[{address:t,challenge:"",sources:[]}]},s)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:s})=>(0,o.Right)({address:s,descriptor:new Uint8Array([s===t?170:187]),keyId:"name_key",keyUsage:"trusted_name"}));const a=await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c1",sources:["sns"]},{address:u,challenge:"c2",sources:["cal"]}]});(0,e.expect)(a).toHaveLength(2),(0,e.expect)(a[0]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([170]),certificate:l}),(0,e.expect)(a[1]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([187])})}),(0,e.it)("emits an ERROR per failing request and keeps the others",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:s})=>s===t?(0,o.Right)({address:s,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):(0,o.Left)(new Error("upstream-404")));const a=await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c1",sources:[]},{address:u,challenge:"c2",sources:[]}]});(0,e.expect)(a[0]?.type).toBe(r.ClearSignContextType.SOLANA_TRUSTED_NAME),(0,e.expect)(a[1]?.type).toBe(r.ClearSignContextType.ERROR)}),(0,e.it)("forwards default chain id 900 when input.network is omitted",async()=>{const a=e.vi.spyOn(d,"getTrustedName").mockResolvedValue((0,o.Right)({address:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c",sources:[]}]}),(0,e.expect)(a).toHaveBeenCalledWith(e.expect.objectContaining({network:String(m.SolanaTransactionScanChainId.MAINNET)}))}),(0,e.it)("maps a cluster name to its numeric chain id",async()=>{const a=e.vi.spyOn(d,"getTrustedName").mockResolvedValue((0,o.Right)({address:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:c.DeviceModelId.NANO_X,network:"solana-devnet",requests:[{address:t,challenge:"c",sources:[]}]}),(0,e.expect)(a).toHaveBeenCalledWith(e.expect.objectContaining({network:"901"}))})})});
2
2
  //# sourceMappingURL=TrustedNameContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\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 SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTrustedNameContextLoader } from \"./TrustedNameContextLoader\";\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 = { keyUsageNumber: 4, payload: new Uint8Array([7]) };\nconst ADDR_A = \"Addr11111111111111111111111111111111111111\";\nconst ADDR_B = \"Addr22222222222222222222222222222222222222\";\n\ndescribe(\"SolanaTrustedNameContextLoader\", () => {\n let dataSource: SolanaTrustedNameDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTrustedName: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new SolanaTrustedNameContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TRUSTED_NAME is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n types: [\"eoa\"],\n sources: [\"sns\"],\n },\n ],\n },\n [ClearSignContextType.SOLANA_TRUSTED_NAME],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TRUSTED_NAME is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n types: [\"eoa\"],\n sources: [\"sns\"],\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on malformed input\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TRUSTED_NAME];\n expect(loader.canHandle({ requests: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: \"\", challenge: \"c\", types: [], sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [\n { address: ADDR_A, challenge: \"\", types: [], sources: [] },\n ],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) =>\n Right({\n address,\n descriptor: new Uint8Array([address === ADDR_A ? 0xaa : 0xbb]),\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c1\",\n types: [\"eoa\"],\n sources: [\"sns\"],\n },\n {\n address: ADDR_B,\n challenge: \"c2\",\n types: [\"program\"],\n sources: [\"cal\"],\n },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xaa]),\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xbb]),\n });\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) => {\n if (address === ADDR_A) {\n return Right({\n address,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-404\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { address: ADDR_A, challenge: \"c1\", types: [], sources: [] },\n { address: ADDR_B, challenge: \"c2\", types: [], sources: [] },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_TRUSTED_NAME);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"forwards default network=mainnet when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ address: ADDR_A, challenge: \"c\", types: [], sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({ network: \"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_TrustedNameContextLoader", "mockLoggerFactory", "mockCertificate", "ADDR_A", "ADDR_B", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "address", "result", "out", "spy"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\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 { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTrustedNameContextLoader } from \"./TrustedNameContextLoader\";\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 = { keyUsageNumber: 4, payload: new Uint8Array([7]) };\nconst ADDR_A = \"Addr11111111111111111111111111111111111111\";\nconst ADDR_B = \"Addr22222222222222222222222222222222222222\";\n\ndescribe(\"SolanaTrustedNameContextLoader\", () => {\n let dataSource: SolanaTrustedNameDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTrustedName: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new SolanaTrustedNameContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TRUSTED_NAME is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n sources: [\"sns\"],\n },\n ],\n },\n [ClearSignContextType.SOLANA_TRUSTED_NAME],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TRUSTED_NAME is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n sources: [\"sns\"],\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on malformed input\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TRUSTED_NAME];\n expect(loader.canHandle({ requests: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: \"\", challenge: \"c\", sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: ADDR_A, challenge: \"\", sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) =>\n Right({\n address,\n descriptor: new Uint8Array([address === ADDR_A ? 0xaa : 0xbb]),\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c1\",\n sources: [\"sns\"],\n },\n {\n address: ADDR_B,\n challenge: \"c2\",\n sources: [\"cal\"],\n },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xaa]),\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xbb]),\n });\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) => {\n if (address === ADDR_A) {\n return Right({\n address,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-404\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { address: ADDR_A, challenge: \"c1\", sources: [] },\n { address: ADDR_B, challenge: \"c2\", sources: [] },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_TRUSTED_NAME);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"forwards default chain id 900 when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ address: ADDR_A, challenge: \"c\", sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({\n network: String(SolanaTransactionScanChainId.MAINNET),\n }),\n );\n });\n\n it(\"maps a cluster name to its numeric chain id\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n network: \"solana-devnet\",\n requests: [{ address: ADDR_A, challenge: \"c\", sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({ network: \"901\" }),\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_SolanaTransactionScanChainId", "import_ClearSignContext", "import_TrustedNameContextLoader", "mockLoggerFactory", "mockCertificate", "ADDR_A", "ADDR_B", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "address", "result", "out", "spy"]
7
7
  }