@ledgerhq/device-contacts-kit 0.3.0 → 0.4.0

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 (116) hide show
  1. package/README.md +22 -13
  2. package/lib/cjs/api/index.js +1 -1
  3. package/lib/cjs/api/index.js.map +3 -3
  4. package/lib/cjs/api/model/ContactsVersionRequirements.js +1 -1
  5. package/lib/cjs/api/model/ContactsVersionRequirements.js.map +3 -3
  6. package/lib/cjs/api/model/ContactsVersionRequirements.test.js +1 -1
  7. package/lib/cjs/api/model/ContactsVersionRequirements.test.js.map +3 -3
  8. package/lib/cjs/api/model/ProvideContact.js +2 -0
  9. package/lib/cjs/api/model/ProvideContact.js.map +7 -0
  10. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.js +2 -0
  11. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.js.map +7 -0
  12. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js +2 -0
  13. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js.map +7 -0
  14. package/lib/cjs/internal/app-binder/contactsVersionGuards.js +2 -0
  15. package/lib/cjs/internal/app-binder/contactsVersionGuards.js.map +7 -0
  16. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js +2 -0
  17. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js.map +7 -0
  18. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +1 -1
  19. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +3 -3
  20. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +1 -1
  21. package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +3 -3
  22. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +1 -1
  23. package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +1 -1
  25. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +3 -3
  26. package/lib/cjs/internal/app-binder/model/contactsConstants.js +1 -1
  27. package/lib/cjs/internal/app-binder/model/contactsConstants.js.map +3 -3
  28. package/lib/cjs/internal/app-binder/services/provideContact.js +2 -0
  29. package/lib/cjs/internal/app-binder/services/provideContact.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/services/provideContact.test.js +2 -0
  31. package/lib/cjs/internal/app-binder/services/provideContact.test.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js.map +2 -2
  33. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +1 -1
  34. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js +1 -1
  35. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js.map +2 -2
  36. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +1 -1
  37. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +3 -3
  38. package/lib/cjs/package.json +2 -2
  39. package/lib/esm/api/index.js +1 -1
  40. package/lib/esm/api/index.js.map +3 -3
  41. package/lib/esm/api/model/ContactsVersionRequirements.js +1 -1
  42. package/lib/esm/api/model/ContactsVersionRequirements.js.map +3 -3
  43. package/lib/esm/api/model/ContactsVersionRequirements.test.js +1 -1
  44. package/lib/esm/api/model/ContactsVersionRequirements.test.js.map +3 -3
  45. package/lib/esm/api/model/ProvideContact.js +1 -0
  46. package/lib/esm/api/model/ProvideContact.js.map +7 -0
  47. package/lib/esm/internal/app-binder/command/ProvideContactCommand.js +2 -0
  48. package/lib/esm/internal/app-binder/command/ProvideContactCommand.js.map +7 -0
  49. package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js +2 -0
  50. package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js.map +7 -0
  51. package/lib/esm/internal/app-binder/contactsVersionGuards.js +2 -0
  52. package/lib/esm/internal/app-binder/contactsVersionGuards.js.map +7 -0
  53. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js +2 -0
  54. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js.map +7 -0
  55. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js +1 -1
  56. package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.js.map +3 -3
  57. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js +1 -1
  58. package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.js.map +3 -3
  59. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js +1 -1
  60. package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.js.map +3 -3
  61. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +1 -1
  62. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +2 -2
  63. package/lib/esm/internal/app-binder/model/contactsConstants.js +1 -1
  64. package/lib/esm/internal/app-binder/model/contactsConstants.js.map +3 -3
  65. package/lib/esm/internal/app-binder/services/provideContact.js +2 -0
  66. package/lib/esm/internal/app-binder/services/provideContact.js.map +7 -0
  67. package/lib/esm/internal/app-binder/services/provideContact.test.js +2 -0
  68. package/lib/esm/internal/app-binder/services/provideContact.test.js.map +7 -0
  69. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js.map +2 -2
  70. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +1 -1
  71. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js +1 -1
  72. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js.map +3 -3
  73. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +1 -1
  74. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +3 -3
  75. package/lib/esm/package.json +2 -2
  76. package/lib/types/api/index.d.ts +4 -1
  77. package/lib/types/api/index.d.ts.map +1 -1
  78. package/lib/types/api/model/ContactsVersionRequirements.d.ts +7 -25
  79. package/lib/types/api/model/ContactsVersionRequirements.d.ts.map +1 -1
  80. package/lib/types/api/model/ProvideContact.d.ts +20 -0
  81. package/lib/types/api/model/ProvideContact.d.ts.map +1 -0
  82. package/lib/types/internal/app-binder/command/ProvideContactCommand.d.ts +18 -0
  83. package/lib/types/internal/app-binder/command/ProvideContactCommand.d.ts.map +1 -0
  84. package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts +2 -0
  85. package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts.map +1 -0
  86. package/lib/types/internal/app-binder/{isContactsSupportedForSession.d.ts → contactsVersionGuards.d.ts} +19 -21
  87. package/lib/types/internal/app-binder/contactsVersionGuards.d.ts.map +1 -0
  88. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts +2 -0
  89. package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts.map +1 -0
  90. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts +1 -1
  91. package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.d.ts.map +1 -1
  92. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts +1 -1
  93. package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.d.ts.map +1 -1
  94. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts +1 -1
  95. package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.d.ts.map +1 -1
  96. package/lib/types/internal/app-binder/model/contactsConstants.d.ts +2 -0
  97. package/lib/types/internal/app-binder/model/contactsConstants.d.ts.map +1 -1
  98. package/lib/types/internal/app-binder/services/provideContact.d.ts +15 -0
  99. package/lib/types/internal/app-binder/services/provideContact.d.ts.map +1 -0
  100. package/lib/types/internal/app-binder/services/provideContact.test.d.ts +2 -0
  101. package/lib/types/internal/app-binder/services/provideContact.test.d.ts.map +1 -0
  102. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.d.ts.map +1 -1
  103. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts.map +1 -1
  104. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  105. package/package.json +6 -6
  106. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js +0 -2
  107. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.js.map +0 -7
  108. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js +0 -2
  109. package/lib/cjs/internal/app-binder/isContactsSupportedForSession.test.js.map +0 -7
  110. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js +0 -2
  111. package/lib/esm/internal/app-binder/isContactsSupportedForSession.js.map +0 -7
  112. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js +0 -2
  113. package/lib/esm/internal/app-binder/isContactsSupportedForSession.test.js.map +0 -7
  114. package/lib/types/internal/app-binder/isContactsSupportedForSession.d.ts.map +0 -1
  115. package/lib/types/internal/app-binder/isContactsSupportedForSession.test.d.ts +0 -2
  116. package/lib/types/internal/app-binder/isContactsSupportedForSession.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SendRenameContactTask.test.ts"],
4
- "sourcesContent": ["// Validates that the TLV serializer + tag ordering + chunk framing produce the\n// expected wire bytes for the Rename Contact (EDIT CONTACT NAME) op. The framed\n// chunk = 2-byte BE total length + TLV. Tag order: STRUCT_TYPE, STRUCT_VERSION,\n// CONTACT_NAME (new), PREVIOUS_CONTACT_NAME (old), GROUP_HANDLE, DERIVATION_PATH,\n// HMAC_PROOF \u2014 with tags >= 0x80 (0xf0/0xf3/0xf6) encoded as the 2-byte DER form\n// [0x81, tag].\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { RenameContactCommand } from \"@internal/app-binder/command/RenameContactCommand\";\n\nimport { SendRenameContactTask } from \"./SendRenameContactTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\nconst GROUP_HANDLE = hexToBytes(\"cc\".repeat(64));\nconst HMAC_PROOF_IN = hexToBytes(\"dd\".repeat(32));\nconst HMAC_PROOF_OUT = hexToBytes(\"ee\".repeat(32));\n\n// Framed chunk = \"00 90\" (2-byte BE total TLV length = 144) + TLV:\n// 01 01 2e STRUCT_TYPE = EDIT_CONTACT_NAME (0x2e)\n// 02 01 01 STRUCT_VERSION = 1\n// 81 f0 03 \"Bob\" CONTACT_NAME (new), tag 0xf0 -> [81 f0]\n// 81 f3 05 \"Alice\" PREVIOUS_CONTACT_NAME (old), tag 0xf3 -> [81 f3]\n// 81 f6 40 <64x cc> GROUP_HANDLE, tag 0xf6 -> [81 f6]\n// 69 15 05 <5x path> DERIVATION_PATH (0x69), m/44'/60'/0'/0/0\n// 29 20 <32x dd> HMAC_PROOF\nconst DERIVATION_PATH_TLV = \"6915058000002c8000003c800000000000000000000000\";\nconst FRAMED_CHUNK = hexToBytes(\n \"0090\" +\n \"01012e\" +\n \"020101\" +\n \"81f003426f62\" +\n \"81f305416c696365\" +\n \"81f640\" +\n \"cc\".repeat(64) +\n DERIVATION_PATH_TLV +\n \"2920\" +\n \"dd\".repeat(32),\n);\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendRenameContactTask\", () => {\n it(\"assembles the rename framed chunk and dispatches RenameContactCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RenameContactCommand({ data: FRAMED_CHUNK, p2: 0x00 }),\n );\n expect(result).toStrictEqual(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n });\n\n it(\"emits the DERIVATION_PATH tag immediately before HMAC_PROOF\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n // The Ethereum app requires DERIVATION_PATH (0x69); it sits immediately\n // before HMAC_PROOF (0x29), matching Register Identity.\n const command = api.sendCommand.mock.calls[0]![0] as RenameContactCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n expect(\n framedHex.endsWith(DERIVATION_PATH_TLV + \"2920\" + \"dd\".repeat(32)),\n ).toBe(true);\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"returns InvalidStatusWordError when the final response carries no hmac_name\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result.status).not.toBe(undefined);\n if (\"error\" in result) {\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n }\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["CommandResultFactory", "InvalidStatusWordError", "RenameContactCommand", "SendRenameContactTask", "hexToBytes", "hex", "out", "i", "GROUP_HANDLE", "HMAC_PROOF_IN", "HMAC_PROOF_OUT", "DERIVATION_PATH_TLV", "FRAMED_CHUNK", "makeApiMock", "api", "result", "command", "framedHex"]
4
+ "sourcesContent": ["// Validates that the TLV serializer + tag ordering + chunk framing produce the\n// expected wire bytes for the Rename Contact (EDIT CONTACT NAME) op. The framed\n// chunk = 2-byte BE total length + TLV. Tag order: STRUCT_TYPE, STRUCT_VERSION,\n// CONTACT_NAME (new), PREVIOUS_CONTACT_NAME (old), GROUP_HANDLE, HMAC_PROOF \u2014\n// with tags >= 0x80 (0xf0/0xf3/0xf6) encoded as the 2-byte DER form [0x81, tag].\n// No DERIVATION_PATH: the SDK removed tag 0x69 from EDIT_CONTACT_NAME_TAGS on\n// 2026-08-10 and rejects payloads carrying it.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { RenameContactCommand } from \"@internal/app-binder/command/RenameContactCommand\";\n\nimport { SendRenameContactTask } from \"./SendRenameContactTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\nconst GROUP_HANDLE = hexToBytes(\"cc\".repeat(64));\nconst HMAC_PROOF_IN = hexToBytes(\"dd\".repeat(32));\nconst HMAC_PROOF_OUT = hexToBytes(\"ee\".repeat(32));\n\n// Framed chunk = \"00 79\" (2-byte BE total TLV length = 121) + TLV:\n// 01 01 2e STRUCT_TYPE = EDIT_CONTACT_NAME (0x2e)\n// 02 01 01 STRUCT_VERSION = 1\n// 81 f0 03 \"Bob\" CONTACT_NAME (new), tag 0xf0 -> [81 f0]\n// 81 f3 05 \"Alice\" PREVIOUS_CONTACT_NAME (old), tag 0xf3 -> [81 f3]\n// 81 f6 40 <64x cc> GROUP_HANDLE, tag 0xf6 -> [81 f6]\n// 29 20 <32x dd> HMAC_PROOF\nconst FRAMED_CHUNK = hexToBytes(\n \"0079\" +\n \"01012e\" +\n \"020101\" +\n \"81f003426f62\" +\n \"81f305416c696365\" +\n \"81f640\" +\n \"cc\".repeat(64) +\n \"2920\" +\n \"dd\".repeat(32),\n);\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendRenameContactTask\", () => {\n it(\"assembles the rename framed chunk and dispatches RenameContactCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RenameContactCommand({ data: FRAMED_CHUNK, p2: 0x00 }),\n );\n expect(result).toStrictEqual(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n });\n\n it(\"does not emit a DERIVATION_PATH tag\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n // api-level 27 dropped tag 0x69 from EDIT_CONTACT_NAME_TAGS: a payload\n // carrying it fails to parse and the device answers 0x6a80. HMAC_PROOF\n // (0x29) therefore follows GROUP_HANDLE directly.\n const command = api.sendCommand.mock.calls[0]![0] as RenameContactCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n expect(framedHex).not.toContain(\"691505\");\n expect(\n framedHex.endsWith(\"81f640\" + \"cc\".repeat(64) + \"2920\" + \"dd\".repeat(32)),\n ).toBe(true);\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"returns InvalidStatusWordError when the final response carries no hmac_name\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result.status).not.toBe(undefined);\n if (\"error\" in result) {\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n }\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["CommandResultFactory", "InvalidStatusWordError", "RenameContactCommand", "SendRenameContactTask", "hexToBytes", "hex", "out", "i", "GROUP_HANDLE", "HMAC_PROOF_IN", "HMAC_PROOF_OUT", "FRAMED_CHUNK", "makeApiMock", "api", "result", "command", "framedHex"]
7
7
  }
@@ -36,7 +36,7 @@
36
36
  "license": "Apache-2.0",
37
37
  "name": "@ledgerhq/device-contacts-kit",
38
38
  "peerDependencies": {
39
- "@ledgerhq/device-management-kit": "^1.8.0"
39
+ "@ledgerhq/device-management-kit": "workspace:^"
40
40
  },
41
41
  "private": false,
42
42
  "repository": {
@@ -58,5 +58,5 @@
58
58
  "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
59
59
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
60
60
  },
61
- "version": "0.3.0"
61
+ "version": "0.4.0"
62
62
  }
@@ -4,9 +4,12 @@ export { type RegisterExternalAddressDAError, type RegisterExternalAddressDAInpu
4
4
  export { type RenameContactDAError, type RenameContactDAInput, type RenameContactDAIntermediateValue, type RenameContactDAOutput, type RenameContactDARequiredInteraction, type RenameContactDAReturnType, type RenameContactDAState, } from "./app-binder/RenameContactDeviceActionTypes";
5
5
  export { type ContactsManager } from "./ContactsManager";
6
6
  export { ContactsManagerBuilder } from "./ContactsManagerBuilder";
7
- export { CONTACTS_VERSION_REQUIREMENTS, type ContactsModelRequirement, type ContactsModelSupport, type ContactsModelUnsupported, type ContactsSupportQuery, type ContactsVersionRequirements, ETHEREUM_APP_NAME, isContactsSupported, isVersionAtLeast, resolveContactsVersionRequirements, } from "./model/ContactsVersionRequirements";
7
+ export { CONTACTS_VERSION_REQUIREMENTS, type ContactsModelRequirement, type ContactsModelSupport, type ContactsModelUnsupported, type ContactsVersionRequirements, ETHEREUM_APP_NAME, isVersionAtLeast, resolveContactsVersionRequirements, } from "./model/ContactsVersionRequirements";
8
8
  export { type EditExternalAddressIdentifierInput, type EditExternalAddressIdentifierOutput, } from "./model/EditExternalAddressIdentifier";
9
9
  export { type EditExternalAddressScopeInput, type EditExternalAddressScopeOutput, } from "./model/EditExternalAddressScope";
10
+ export { type ProvideContactInput } from "./model/ProvideContact";
10
11
  export { type ExistingContactGroup, type RegisterExternalAddressInput, type RegisterExternalAddressMode, type RegisterExternalAddressOutput, } from "./model/RegisterExternalAddress";
11
12
  export { type RenameContactInput, type RenameContactOutput, } from "./model/RenameContact";
13
+ export { type ContactsErrorCodes } from "../internal/app-binder/model/contactsErrors";
14
+ export { buildProvideContactPayload, sendProvideContactPayload, type SendProvideContactPayloadArgs, } from "../internal/app-binder/services/provideContact";
12
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,KAAK,gDAAgD,EACrD,KAAK,qCAAqC,EAC1C,KAAK,kDAAkD,EACvD,KAAK,yCAAyC,EAC9C,KAAK,oCAAoC,GAC1C,MAAM,gEAAgE,CAAC;AACxE,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,2CAA2C,EAChD,KAAK,gCAAgC,EACrC,KAAK,6CAA6C,EAClD,KAAK,oCAAoC,EACzC,KAAK,+BAA+B,GACrC,MAAM,2DAA2D,CAAC;AACnE,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,0CAA0C,EAC/C,KAAK,+BAA+B,EACpC,KAAK,4CAA4C,EACjD,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,GACpC,MAAM,0DAA0D,CAAC;AAClE,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,EACrC,KAAK,qBAAqB,EAC1B,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,GAC1B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,6BAA6B,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,kCAAkC,EACvC,KAAK,mCAAmC,GACzC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,GACpC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,GACnC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,KAAK,gDAAgD,EACrD,KAAK,qCAAqC,EAC1C,KAAK,kDAAkD,EACvD,KAAK,yCAAyC,EAC9C,KAAK,oCAAoC,GAC1C,MAAM,gEAAgE,CAAC;AACxE,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,2CAA2C,EAChD,KAAK,gCAAgC,EACrC,KAAK,6CAA6C,EAClD,KAAK,oCAAoC,EACzC,KAAK,+BAA+B,GACrC,MAAM,2DAA2D,CAAC;AACnE,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,0CAA0C,EAC/C,KAAK,+BAA+B,EACpC,KAAK,4CAA4C,EACjD,KAAK,mCAAmC,EACxC,KAAK,8BAA8B,GACpC,MAAM,0DAA0D,CAAC;AAClE,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,gCAAgC,EACrC,KAAK,qBAAqB,EAC1B,KAAK,kCAAkC,EACvC,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,GAC1B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EACL,6BAA6B,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,iBAAiB,EACjB,gBAAgB,EAChB,kCAAkC,GACnC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,kCAAkC,EACvC,KAAK,mCAAmC,GACzC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,KAAK,6BAA6B,EAClC,KAAK,8BAA8B,GACpC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAChC,KAAK,6BAA6B,GACnC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,KAAK,6BAA6B,GACnC,MAAM,8CAA8C,CAAC"}
@@ -31,8 +31,8 @@ export type ContactsVersionRequirements = Readonly<Record<DeviceModelId, Contact
31
31
  /** The name of the Ethereum embedded app (the only app supported in v1). */
32
32
  export declare const ETHEREUM_APP_NAME = "Ethereum";
33
33
  /**
34
- * Contacts APDUs are supported only on the touchscreen device models (Stax,
35
- * Flex, Apex). The Nano models do not support Contacts at all.
34
+ * Contacts APDUs are supported on the touchscreen device models (Stax, Flex,
35
+ * Apex) and on Nano X / Nano SP. Nano S does not support Contacts at all.
36
36
  */
37
37
  export declare const CONTACTS_VERSION_REQUIREMENTS: ContactsVersionRequirements;
38
38
  /**
@@ -42,29 +42,11 @@ export declare const CONTACTS_VERSION_REQUIREMENTS: ContactsVersionRequirements;
42
42
  export declare function resolveContactsVersionRequirements(deviceModelId: DeviceModelId): ContactsModelRequirement;
43
43
  /**
44
44
  * Whether `actual` is greater than or equal to `minimum`, comparing as semver.
45
- * Tolerant of non-strict version strings (coerces where possible) and returns
46
- * `false` (i.e. requirement not met) when either version cannot be parsed, so
47
- * an unknown version never passes a check.
45
+ * Tolerant of non-strict version strings and prerelease/build tags (coerces
46
+ * both sides, which drops them) so a release candidate such as `1.7.0-rc2`
47
+ * counts as meeting a `1.7.0` minimum. Returns `false` (i.e. requirement not
48
+ * met) when either version cannot be parsed, so an unknown version never
49
+ * passes a check.
48
50
  */
49
51
  export declare function isVersionAtLeast(actual: string, minimum: string): boolean;
50
- /** Inputs for {@link isContactsSupported}. */
51
- export type ContactsSupportQuery = {
52
- readonly deviceModelId: DeviceModelId;
53
- /** The device OS (firmware) version. */
54
- readonly osVersion: string;
55
- /** The name of the currently running embedded app. */
56
- readonly appName: string;
57
- /** The version of the currently running embedded app. */
58
- readonly appVersion: string;
59
- };
60
- /**
61
- * Whether Contacts app-owned operations are supported for the given device
62
- * model, OS version, and running app — checking the model is supported, the OS
63
- * meets its minimum, the app is known to Contacts, and the app meets its
64
- * minimum.
65
- *
66
- * Pure and dependency-light: hosts can call this directly, or read
67
- * {@link CONTACTS_VERSION_REQUIREMENTS} to build their own checks.
68
- */
69
- export declare function isContactsSupported({ deviceModelId, osVersion, appName, appVersion, }: ContactsSupportQuery): boolean;
70
52
  //# sourceMappingURL=ContactsVersionRequirements.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContactsVersionRequirements.d.ts","sourceRoot":"","sources":["../../../../src/api/model/ContactsVersionRequirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,wBAAwB,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAChD,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAChD,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAY5C;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,2BAmB3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,aAAa,EAAE,aAAa,GAC3B,wBAAwB,CAE1B;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKzE;AAED,8CAA8C;AAC9C,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,wCAAwC;IACxC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,aAAa,EACb,SAAS,EACT,OAAO,EACP,UAAU,GACX,EAAE,oBAAoB,GAAG,OAAO,CAQhC"}
1
+ {"version":3,"file":"ContactsVersionRequirements.d.ts","sourceRoot":"","sources":["../../../../src/api/model/ContactsVersionRequirements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGhE;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC1D,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,wBAAwB,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAChD,MAAM,CAAC,aAAa,EAAE,wBAAwB,CAAC,CAChD,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAY5C;;;GAGG;AACH,eAAO,MAAM,6BAA6B,EAAE,2BA2B3C,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kCAAkC,CAChD,aAAa,EAAE,aAAa,GAC3B,wBAAwB,CAE1B;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAKzE"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Everything the device needs to accept a registered external contact as a
3
+ * decoration for an upcoming signing flow: the name-level material shared by
4
+ * the whole contact group, plus the address-level material of the one matched
5
+ * address.
6
+ */
7
+ export type ProvideContactInput = {
8
+ readonly contactName: string;
9
+ readonly scope: string;
10
+ /** Raw bytes, chain-dependent: a 20-byte address for Ethereum. */
11
+ readonly identifier: Uint8Array;
12
+ readonly groupHandle: Uint8Array;
13
+ readonly hmacProof: Uint8Array;
14
+ readonly hmacRest: Uint8Array;
15
+ /** Lowercase family name, e.g. `"ethereum"`. */
16
+ readonly blockchainFamily: string;
17
+ /** Mandatory for Ethereum, omitted for every other family. */
18
+ readonly chainId?: bigint;
19
+ };
20
+ //# sourceMappingURL=ProvideContact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvideContact.d.ts","sourceRoot":"","sources":["../../../../src/api/model/ProvideContact.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type Apdu, type ApduResponse, type Command, type CommandResult } from "@ledgerhq/device-management-kit";
2
+ import { type ContactsErrorCodes } from "../../app-binder/model/contactsErrors";
3
+ export type ProvideContactCommandArgs = {
4
+ /** One framed chunk built by sendProvideContactPayload. */
5
+ readonly data: Uint8Array;
6
+ /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */
7
+ readonly p2: number;
8
+ };
9
+ export type ProvideContactCommandResponse = void;
10
+ export declare class ProvideContactCommand implements Command<ProvideContactCommandResponse, ProvideContactCommandArgs, ContactsErrorCodes> {
11
+ readonly name = "provideContact";
12
+ readonly args: ProvideContactCommandArgs;
13
+ private readonly errorHelper;
14
+ constructor(args: ProvideContactCommandArgs);
15
+ getApdu(): Apdu;
16
+ parseResponse(response: ApduResponse): CommandResult<ProvideContactCommandResponse, ContactsErrorCodes>;
17
+ }
18
+ //# sourceMappingURL=ProvideContactCommand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvideContactCommand.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/ProvideContactCommand.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,IAAI,EAET,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,aAAa,EAEnB,MAAM,iCAAiC,CAAC;AASzC,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,2CAA2C,CAAC;AAEnD,MAAM,MAAM,yBAAyB,GAAG;IACtC,2DAA2D;IAC3D,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAEjD,qBAAa,qBACX,YACE,OAAO,CACL,6BAA6B,EAC7B,yBAAyB,EACzB,kBAAkB,CACnB;IAEH,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGwB;gBAExC,IAAI,EAAE,yBAAyB;IAI3C,OAAO,IAAI,IAAI;IAWf,aAAa,CACX,QAAQ,EAAE,YAAY,GACrB,aAAa,CAAC,6BAA6B,EAAE,kBAAkB,CAAC;CASpE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ProvideContactCommand.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvideContactCommand.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/ProvideContactCommand.test.ts"],"names":[],"mappings":""}
@@ -4,24 +4,6 @@ export type RunningApp = {
4
4
  readonly name: string;
5
5
  readonly version: string;
6
6
  };
7
- /**
8
- * Session-aware Contacts support check, for internal consumption by Contacts
9
- * `DeviceAction`s. Resolves the given running app against the static
10
- * requirements table:
11
- * - the device model must be supported;
12
- * - the running app must be known to Contacts and meet its minimum version;
13
- * - the device OS must meet its minimum version (a dimension `ApplicationChecker`
14
- * does not cover, so it is checked separately here).
15
- *
16
- * The app `name` and `version` are supplied by the caller so they can come from
17
- * a fresh `WaitForAppAndVersion` result rather than the (potentially stale)
18
- * device session state; the model and OS come from the session state, which
19
- * does not change under the caller's feet the way the running app can.
20
- *
21
- * @param internalApi - the DeviceAction's internal API for the current session.
22
- * @param app - the running app's fresh name and version.
23
- */
24
- export declare function isContactsSupportedForSession(internalApi: InternalApi, app: RunningApp): boolean;
25
7
  /**
26
8
  * OS-only Contacts support check, for internal consumption by dashboard
27
9
  * `DeviceAction`s (e.g. Rename Contact, EDIT CONTACT NAME). Dashboard operations
@@ -31,10 +13,26 @@ export declare function isContactsSupportedForSession(internalApi: InternalApi,
31
13
  * - the device OS must meet its minimum version.
32
14
  *
33
15
  * The running-app dimension is intentionally skipped: on the dashboard there is
34
- * no embedded app to gate on (the running "app" is BOLOS). The model and OS both
35
- * come from the session state, which is stable across the operation.
16
+ * no embedded app to gate on (the running "app" is BOLOS).
36
17
  *
37
18
  * @param internalApi - the DeviceAction's internal API for the current session.
38
19
  */
39
20
  export declare function isContactsOsSupportedForSession(internalApi: InternalApi): boolean;
40
- //# sourceMappingURL=isContactsSupportedForSession.d.ts.map
21
+ /**
22
+ * Session-aware Contacts support check, for internal consumption by app-owned
23
+ * Contacts `DeviceAction`s (registering / editing external addresses). These
24
+ * operations are served by the embedded app, not the device OS, so only two
25
+ * dimensions apply:
26
+ * - the device model must be supported;
27
+ * - the running app must be known to Contacts and meet its minimum version.
28
+ *
29
+ * The app `name` and `version` are supplied by the caller so they can come from
30
+ * a fresh `WaitForAppAndVersion` result rather than the (potentially stale)
31
+ * device session state; the model comes from the session state, which does
32
+ * not change under the caller's feet the way the running app can.
33
+ *
34
+ * @param internalApi - the DeviceAction's internal API for the current session.
35
+ * @param app - the running app's fresh name and version.
36
+ */
37
+ export declare function isContactsAppVersionSupportedForSession(internalApi: InternalApi, app: RunningApp): boolean;
38
+ //# sourceMappingURL=contactsVersionGuards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contactsVersionGuards.d.ts","sourceRoot":"","sources":["../../../../src/internal/app-binder/contactsVersionGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,iCAAiC,CAAC;AAWzC,gEAAgE;AAChE,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B,CAAC;AASF;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,WAAW,GACvB,OAAO,CAcT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uCAAuC,CACrD,WAAW,EAAE,WAAW,EACxB,GAAG,EAAE,UAAU,GACd,OAAO,CAiBT"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contactsVersionGuards.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contactsVersionGuards.test.d.ts","sourceRoot":"","sources":["../../../../src/internal/app-binder/contactsVersionGuards.test.ts"],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import { type DeviceActionStateMachine, type InternalApi, XStateDeviceAction } from "@ledgerhq/device-management-kit";
2
2
  import { type EditExternalAddressIdentifierDAError, type EditExternalAddressIdentifierDAInput, type EditExternalAddressIdentifierDAIntermediateValue, type EditExternalAddressIdentifierDAInternalState, type EditExternalAddressIdentifierDAOutput } from "../../../../api/app-binder/EditExternalAddressIdentifierDeviceActionTypes";
3
- import { type RunningApp } from "../../../app-binder/isContactsSupportedForSession";
3
+ import { type RunningApp } from "../../../app-binder/contactsVersionGuards";
4
4
  import { type EditIdentifierProof, SendEditExternalAddressIdentifierTask } from "../../../app-binder/task/SendEditExternalAddressIdentifierTask";
5
5
  export type EditExternalAddressIdentifierMachineDependencies = {
6
6
  readonly isSupported: (app: RunningApp) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"EditExternalAddressIdentifierDeviceAction.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAOhB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EACL,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,KAAK,gDAAgD,EACrD,KAAK,4CAA4C,EACjD,KAAK,qCAAqC,EAC3C,MAAM,gEAAgE,CAAC;AACxE,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,oDAAoD,CAAC;AAE5D,OAAO,EACL,KAAK,mBAAmB,EACxB,qCAAqC,EACtC,MAAM,iEAAiE,CAAC;AAIzE,MAAM,MAAM,gDAAgD,GAAG;IAC7D,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,CACvB,KAAK,EAAE,oCAAoC,KACxC,OAAO,CACV,OAAO,CAAC,UAAU,CAAC,qCAAqC,CAAC,KAAK,CAAC,CAAC,CAAC,CAClE,CAAC;CACH,CAAC;AAEF,qBAAa,yCAA0C,SAAQ,kBAAkB,CAC/E,qCAAqC,EACrC,oCAAoC,EACpC,oCAAoC,EACpC,gDAAgD,EAChD,4CAA4C,CAC7C;IACC,gBAAgB,CACd,WAAW,EAAE,WAAW,GACvB,wBAAwB,CACzB,qCAAqC,EACrC,oCAAoC,EACpC,oCAAoC,EACpC,gDAAgD,EAChD,4CAA4C,CAC7C;IAiQD,mBAAmB,CACjB,WAAW,EAAE,WAAW,GACvB,gDAAgD;CAuBpD;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
1
+ {"version":3,"file":"EditExternalAddressIdentifierDeviceAction.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAOhB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EACL,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,KAAK,gDAAgD,EACrD,KAAK,4CAA4C,EACjD,KAAK,qCAAqC,EAC3C,MAAM,gEAAgE,CAAC;AACxE,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EACL,KAAK,mBAAmB,EACxB,qCAAqC,EACtC,MAAM,iEAAiE,CAAC;AAIzE,MAAM,MAAM,gDAAgD,GAAG;IAC7D,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,CACvB,KAAK,EAAE,oCAAoC,KACxC,OAAO,CACV,OAAO,CAAC,UAAU,CAAC,qCAAqC,CAAC,KAAK,CAAC,CAAC,CAAC,CAClE,CAAC;CACH,CAAC;AAEF,qBAAa,yCAA0C,SAAQ,kBAAkB,CAC/E,qCAAqC,EACrC,oCAAoC,EACpC,oCAAoC,EACpC,gDAAgD,EAChD,4CAA4C,CAC7C;IACC,gBAAgB,CACd,WAAW,EAAE,WAAW,GACvB,wBAAwB,CACzB,qCAAqC,EACrC,oCAAoC,EACpC,oCAAoC,EACpC,gDAAgD,EAChD,4CAA4C,CAC7C;IAiQD,mBAAmB,CACjB,WAAW,EAAE,WAAW,GACvB,gDAAgD;CAuBpD;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type DeviceActionStateMachine, type InternalApi, XStateDeviceAction } from "@ledgerhq/device-management-kit";
2
2
  import { type EditExternalAddressScopeDAError, type EditExternalAddressScopeDAInput, type EditExternalAddressScopeDAIntermediateValue, type EditExternalAddressScopeDAInternalState, type EditExternalAddressScopeDAOutput } from "../../../../api/app-binder/EditExternalAddressScopeDeviceActionTypes";
3
- import { type RunningApp } from "../../../app-binder/isContactsSupportedForSession";
3
+ import { type RunningApp } from "../../../app-binder/contactsVersionGuards";
4
4
  import { type EditScopeProof, SendEditExternalAddressScopeTask } from "../../../app-binder/task/SendEditExternalAddressScopeTask";
5
5
  export type EditExternalAddressScopeMachineDependencies = {
6
6
  readonly isSupported: (app: RunningApp) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"EditExternalAddressScopeDeviceAction.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAOhB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,2CAA2C,EAChD,KAAK,uCAAuC,EAC5C,KAAK,gCAAgC,EACtC,MAAM,2DAA2D,CAAC;AACnE,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,oDAAoD,CAAC;AAE5D,OAAO,EACL,KAAK,cAAc,EACnB,gCAAgC,EACjC,MAAM,4DAA4D,CAAC;AAIpE,MAAM,MAAM,2CAA2C,GAAG;IACxD,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5E,CAAC;AAEF,qBAAa,oCAAqC,SAAQ,kBAAkB,CAC1E,gCAAgC,EAChC,+BAA+B,EAC/B,+BAA+B,EAC/B,2CAA2C,EAC3C,uCAAuC,CACxC;IACC,gBAAgB,CACd,WAAW,EAAE,WAAW,GACvB,wBAAwB,CACzB,gCAAgC,EAChC,+BAA+B,EAC/B,+BAA+B,EAC/B,2CAA2C,EAC3C,uCAAuC,CACxC;IA0PD,mBAAmB,CACjB,WAAW,EAAE,WAAW,GACvB,2CAA2C;CAqB/C;AAED,YAAY,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"EditExternalAddressScopeDeviceAction.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAOhB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EACL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACpC,KAAK,2CAA2C,EAChD,KAAK,uCAAuC,EAC5C,KAAK,gCAAgC,EACtC,MAAM,2DAA2D,CAAC;AACnE,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EACL,KAAK,cAAc,EACnB,gCAAgC,EACjC,MAAM,4DAA4D,CAAC;AAIpE,MAAM,MAAM,2CAA2C,GAAG;IACxD,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,CAClB,KAAK,EAAE,+BAA+B,KACnC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;CAC5E,CAAC;AAEF,qBAAa,oCAAqC,SAAQ,kBAAkB,CAC1E,gCAAgC,EAChC,+BAA+B,EAC/B,+BAA+B,EAC/B,2CAA2C,EAC3C,uCAAuC,CACxC;IACC,gBAAgB,CACd,WAAW,EAAE,WAAW,GACvB,wBAAwB,CACzB,gCAAgC,EAChC,+BAA+B,EAC/B,+BAA+B,EAC/B,2CAA2C,EAC3C,uCAAuC,CACxC;IA0PD,mBAAmB,CACjB,WAAW,EAAE,WAAW,GACvB,2CAA2C;CAqB/C;AAED,YAAY,EAAE,cAAc,EAAE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { type DeviceActionStateMachine, type InternalApi, XStateDeviceAction } from "@ledgerhq/device-management-kit";
2
2
  import { type RegisterExternalAddressDAError, type RegisterExternalAddressDAInput, type RegisterExternalAddressDAIntermediateValue, type RegisterExternalAddressDAInternalState, type RegisterExternalAddressDAOutput } from "../../../../api/app-binder/RegisterExternalAddressDeviceActionTypes";
3
- import { type RunningApp } from "../../../app-binder/isContactsSupportedForSession";
3
+ import { type RunningApp } from "../../../app-binder/contactsVersionGuards";
4
4
  import { type RegisterIdentityProofs, SendRegisterIdentityTask } from "../../../app-binder/task/SendRegisterIdentityTask";
5
5
  export type RegisterExternalAddressMachineDependencies = {
6
6
  readonly isSupported: (app: RunningApp) => boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"RegisterExternalAddressDeviceAction.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAOhB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,0CAA0C,EAC/C,KAAK,sCAAsC,EAC3C,KAAK,+BAA+B,EACrC,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,oDAAoD,CAAC;AAE5D,OAAO,EACL,KAAK,sBAAsB,EAC3B,wBAAwB,EACzB,MAAM,oDAAoD,CAAC;AAI5D,MAAM,MAAM,0CAA0C,GAAG;IACvD,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,CACzB,KAAK,EAAE,8BAA8B,KAClC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;CACpE,CAAC;AAEF,qBAAa,mCAAoC,SAAQ,kBAAkB,CACzE,+BAA+B,EAC/B,8BAA8B,EAC9B,8BAA8B,EAC9B,0CAA0C,EAC1C,sCAAsC,CACvC;IACC,gBAAgB,CACd,WAAW,EAAE,WAAW,GACvB,wBAAwB,CACzB,+BAA+B,EAC/B,8BAA8B,EAC9B,8BAA8B,EAC9B,0CAA0C,EAC1C,sCAAsC,CACvC;IAwPD,mBAAmB,CACjB,WAAW,EAAE,WAAW,GACvB,0CAA0C;CAkB9C;AAED,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"RegisterExternalAddressDeviceAction.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,WAAW,EAOhB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EACL,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACnC,KAAK,0CAA0C,EAC/C,KAAK,sCAAsC,EAC3C,KAAK,+BAA+B,EACrC,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAEL,KAAK,UAAU,EAChB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EACL,KAAK,sBAAsB,EAC3B,wBAAwB,EACzB,MAAM,oDAAoD,CAAC;AAI5D,MAAM,MAAM,0CAA0C,GAAG;IACvD,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,CACzB,KAAK,EAAE,8BAA8B,KAClC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;CACpE,CAAC;AAEF,qBAAa,mCAAoC,SAAQ,kBAAkB,CACzE,+BAA+B,EAC/B,8BAA8B,EAC9B,8BAA8B,EAC9B,0CAA0C,EAC1C,sCAAsC,CACvC;IACC,gBAAgB,CACd,WAAW,EAAE,WAAW,GACvB,wBAAwB,CACzB,+BAA+B,EAC/B,8BAA8B,EAC9B,8BAA8B,EAC9B,0CAA0C,EAC1C,sCAAsC,CACvC;IAwPD,mBAAmB,CACjB,WAAW,EAAE,WAAW,GACvB,0CAA0C;CAkB9C;AAED,YAAY,EAAE,sBAAsB,EAAE,CAAC"}
@@ -11,6 +11,8 @@ export declare const CONTACTS_APDU_CLA = 176;
11
11
  export declare const CONTACTS_APDU_INS = 16;
12
12
  /** P1 sub-command selector for REGISTER IDENTITY (register external address). */
13
13
  export declare const SUB_CMD_REGISTER_IDENTITY = 1;
14
+ /** P1 sub-command selector for PROVIDE CONTACT (pre-signing decoration). */
15
+ export declare const SUB_CMD_PROVIDE_CONTACT = 32;
14
16
  /**
15
17
  * P1 sub-command selector for EDIT IDENTIFIER — an address-book app sub-command
16
18
  * (CLA 0xB0 / INS 0x10) served by the coin app, never OS-dispatched.
@@ -1 +1 @@
1
- {"version":3,"file":"contactsConstants.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/model/contactsConstants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,MAAO,CAAC;AACtC,eAAO,MAAM,iBAAiB,KAAO,CAAC;AAEtC,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,IAAO,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,IAAO,CAAC;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,MAAO,CAAC;AAC5C,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAC5C,eAAO,MAAM,iBAAiB,IAAO,CAAC;AAEtC,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC;;;GAGG;AACH,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOtE,CAAC"}
1
+ {"version":3,"file":"contactsConstants.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/model/contactsConstants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,uEAAuE;AACvE,eAAO,MAAM,iBAAiB,MAAO,CAAC;AACtC,eAAO,MAAM,iBAAiB,KAAO,CAAC;AAEtC,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,IAAO,CAAC;AAE9C,4EAA4E;AAC5E,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,IAAO,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,IAAO,CAAC;AAEvC;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,MAAO,CAAC;AAC5C,eAAO,MAAM,uBAAuB,KAAO,CAAC;AAC5C,eAAO,MAAM,iBAAiB,IAAO,CAAC;AAEtC,iFAAiF;AACjF,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC;;;GAGG;AACH,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOtE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type CommandResult, type InternalApi, type LoggerPublisherService } from "@ledgerhq/device-management-kit";
2
+ import { type ProvideContactInput } from "../../../api/model/ProvideContact";
3
+ import { type ContactsErrorCodes } from "../../app-binder/model/contactsErrors";
4
+ /**
5
+ * Encode a matched contact as the PROVIDE CONTACT TLV payload, without the
6
+ * chunk framing. Pure, so callers can build it while matching a recipient
7
+ * against the address book, with no device involved.
8
+ */
9
+ export declare function buildProvideContactPayload(input: ProvideContactInput): Uint8Array;
10
+ export type SendProvideContactPayloadArgs = {
11
+ readonly payload: Uint8Array;
12
+ readonly logger?: LoggerPublisherService;
13
+ };
14
+ export declare function sendProvideContactPayload(api: InternalApi, { payload, logger }: SendProvideContactPayloadArgs): Promise<CommandResult<void, ContactsErrorCodes>>;
15
+ //# sourceMappingURL=provideContact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provideContact.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/services/provideContact.ts"],"names":[],"mappings":"AASA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAMrE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAYpF;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,mBAAmB,GACzB,UAAU,CAkCZ;AAED,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,WAAW,EAChB,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,6BAA6B,GACjD,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAQlD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=provideContact.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provideContact.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/services/provideContact.test.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"SendRegisterIdentityTask.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/task/SendRegisterIdentityTask.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAM/E,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAYpF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C,CAAC;AAEF,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,4BAA4B;IAG/C,GAAG,IAAI,OAAO,CAClB,aAAa,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAC1D;IAkCD,OAAO,CAAC,YAAY;CA+CrB"}
1
+ {"version":3,"file":"SendRegisterIdentityTask.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/task/SendRegisterIdentityTask.ts"],"names":[],"mappings":"AAuBA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAM/E,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAYpF,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C,CAAC;AAEF,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,4BAA4B;IAG/C,GAAG,IAAI,OAAO,CAClB,aAAa,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAC1D;IAkCD,OAAO,CAAC,YAAY;CA+CrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"SendRenameContactTask.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/task/SendRenameContactTask.ts"],"names":[],"mappings":"AAcA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAYpF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C,CAAC;AAEF,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,yBAAyB;IAG5C,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IA6B3E,OAAO,CAAC,YAAY;CA8BrB"}
1
+ {"version":3,"file":"SendRenameContactTask.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/task/SendRenameContactTask.ts"],"names":[],"mappings":"AA2BA,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,WAAW,EAGhB,KAAK,sBAAsB,EAC5B,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAWpF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CAC1C,CAAC;AAEF,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBADJ,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,yBAAyB;IAG5C,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;IA6B3E,OAAO,CAAC,YAAY;CAuBrB"}