@ledgerhq/device-contacts-kit 0.3.1 → 0.4.1

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 (128) hide show
  1. package/README.md +22 -13
  2. package/lib/cjs/api/app-binder/RenameContactDeviceActionTypes.js.map +1 -1
  3. package/lib/cjs/api/index.js +1 -1
  4. package/lib/cjs/api/index.js.map +3 -3
  5. package/lib/cjs/api/model/ContactsVersionRequirements.js +1 -1
  6. package/lib/cjs/api/model/ContactsVersionRequirements.js.map +3 -3
  7. package/lib/cjs/api/model/ContactsVersionRequirements.test.js +1 -1
  8. package/lib/cjs/api/model/ContactsVersionRequirements.test.js.map +3 -3
  9. package/lib/cjs/api/model/ProvideContact.js +2 -0
  10. package/lib/cjs/api/model/ProvideContact.js.map +7 -0
  11. package/lib/cjs/api/model/RenameContact.js.map +1 -1
  12. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.js +1 -1
  13. package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.js.map +3 -3
  14. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.js +1 -1
  15. package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.js.map +3 -3
  16. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.js +2 -0
  17. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.js.map +7 -0
  18. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js +2 -0
  19. package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js.map +7 -0
  20. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.js +1 -1
  21. package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.js.map +3 -3
  22. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js +1 -1
  23. package/lib/cjs/internal/app-binder/command/RenameContactCommand.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js +1 -1
  25. package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js.map +2 -2
  26. package/lib/cjs/internal/app-binder/contactsVersionGuards.js +1 -1
  27. package/lib/cjs/internal/app-binder/contactsVersionGuards.js.map +3 -3
  28. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js +1 -1
  29. package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js.map +2 -2
  30. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +1 -1
  31. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +3 -3
  32. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +1 -1
  33. package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +3 -3
  34. package/lib/cjs/internal/app-binder/model/contactsConstants.js +1 -1
  35. package/lib/cjs/internal/app-binder/model/contactsConstants.js.map +3 -3
  36. package/lib/cjs/internal/app-binder/model/contactsErrors.js +1 -1
  37. package/lib/cjs/internal/app-binder/model/contactsErrors.js.map +3 -3
  38. package/lib/cjs/internal/app-binder/services/provideContact.js +2 -0
  39. package/lib/cjs/internal/app-binder/services/provideContact.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/services/provideContact.test.js +2 -0
  41. package/lib/cjs/internal/app-binder/services/provideContact.test.js.map +7 -0
  42. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.js.map +2 -2
  43. package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +1 -1
  44. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js +1 -1
  45. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.js.map +2 -2
  46. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +1 -1
  47. package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +3 -3
  48. package/lib/cjs/package.json +2 -2
  49. package/lib/esm/api/index.js +1 -1
  50. package/lib/esm/api/index.js.map +3 -3
  51. package/lib/esm/api/model/ContactsVersionRequirements.js +1 -1
  52. package/lib/esm/api/model/ContactsVersionRequirements.js.map +3 -3
  53. package/lib/esm/api/model/ContactsVersionRequirements.test.js +1 -1
  54. package/lib/esm/api/model/ContactsVersionRequirements.test.js.map +3 -3
  55. package/lib/esm/api/model/ProvideContact.js +1 -0
  56. package/lib/esm/api/model/ProvideContact.js.map +7 -0
  57. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js +1 -1
  58. package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.js.map +3 -3
  59. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js +1 -1
  60. package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.js.map +3 -3
  61. package/lib/esm/internal/app-binder/command/ProvideContactCommand.js +2 -0
  62. package/lib/esm/internal/app-binder/command/ProvideContactCommand.js.map +7 -0
  63. package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js +2 -0
  64. package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js.map +7 -0
  65. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.js +1 -1
  66. package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.js.map +3 -3
  67. package/lib/esm/internal/app-binder/command/RenameContactCommand.js +1 -1
  68. package/lib/esm/internal/app-binder/command/RenameContactCommand.js.map +3 -3
  69. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +1 -1
  70. package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +3 -3
  71. package/lib/esm/internal/app-binder/contactsVersionGuards.js +1 -1
  72. package/lib/esm/internal/app-binder/contactsVersionGuards.js.map +3 -3
  73. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js +1 -1
  74. package/lib/esm/internal/app-binder/contactsVersionGuards.test.js.map +3 -3
  75. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js +1 -1
  76. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.js.map +3 -3
  77. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +1 -1
  78. package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +3 -3
  79. package/lib/esm/internal/app-binder/model/contactsConstants.js +1 -1
  80. package/lib/esm/internal/app-binder/model/contactsConstants.js.map +3 -3
  81. package/lib/esm/internal/app-binder/model/contactsErrors.js +1 -1
  82. package/lib/esm/internal/app-binder/model/contactsErrors.js.map +3 -3
  83. package/lib/esm/internal/app-binder/services/provideContact.js +2 -0
  84. package/lib/esm/internal/app-binder/services/provideContact.js.map +7 -0
  85. package/lib/esm/internal/app-binder/services/provideContact.test.js +2 -0
  86. package/lib/esm/internal/app-binder/services/provideContact.test.js.map +7 -0
  87. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.js.map +2 -2
  88. package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +1 -1
  89. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js +1 -1
  90. package/lib/esm/internal/app-binder/task/SendRenameContactTask.js.map +2 -2
  91. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +1 -1
  92. package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +3 -3
  93. package/lib/esm/package.json +2 -2
  94. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts +2 -1
  95. package/lib/types/api/app-binder/RenameContactDeviceActionTypes.d.ts.map +1 -1
  96. package/lib/types/api/index.d.ts +4 -1
  97. package/lib/types/api/index.d.ts.map +1 -1
  98. package/lib/types/api/model/ContactsVersionRequirements.d.ts +38 -23
  99. package/lib/types/api/model/ContactsVersionRequirements.d.ts.map +1 -1
  100. package/lib/types/api/model/ProvideContact.d.ts +20 -0
  101. package/lib/types/api/model/ProvideContact.d.ts.map +1 -0
  102. package/lib/types/api/model/RenameContact.d.ts +5 -3
  103. package/lib/types/api/model/RenameContact.d.ts.map +1 -1
  104. package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.d.ts.map +1 -1
  105. package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.d.ts.map +1 -1
  106. package/lib/types/internal/app-binder/command/ProvideContactCommand.d.ts +18 -0
  107. package/lib/types/internal/app-binder/command/ProvideContactCommand.d.ts.map +1 -0
  108. package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts +2 -0
  109. package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts.map +1 -0
  110. package/lib/types/internal/app-binder/command/RegisterIdentityCommand.d.ts.map +1 -1
  111. package/lib/types/internal/app-binder/command/RenameContactCommand.d.ts.map +1 -1
  112. package/lib/types/internal/app-binder/contactsVersionGuards.d.ts +9 -1
  113. package/lib/types/internal/app-binder/contactsVersionGuards.d.ts.map +1 -1
  114. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts +4 -3
  115. package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.d.ts.map +1 -1
  116. package/lib/types/internal/app-binder/model/contactsConstants.d.ts +2 -0
  117. package/lib/types/internal/app-binder/model/contactsConstants.d.ts.map +1 -1
  118. package/lib/types/internal/app-binder/model/contactsErrors.d.ts +21 -2
  119. package/lib/types/internal/app-binder/model/contactsErrors.d.ts.map +1 -1
  120. package/lib/types/internal/app-binder/services/provideContact.d.ts +15 -0
  121. package/lib/types/internal/app-binder/services/provideContact.d.ts.map +1 -0
  122. package/lib/types/internal/app-binder/services/provideContact.test.d.ts +2 -0
  123. package/lib/types/internal/app-binder/services/provideContact.test.d.ts.map +1 -0
  124. package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.d.ts.map +1 -1
  125. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts +8 -0
  126. package/lib/types/internal/app-binder/task/SendRenameContactTask.d.ts.map +1 -1
  127. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  128. package/package.json +6 -6
package/README.md CHANGED
@@ -94,7 +94,8 @@ consume them without duplicating the values:
94
94
  ```ts
95
95
  import {
96
96
  CONTACTS_VERSION_REQUIREMENTS,
97
- isContactsSupported,
97
+ ETHEREUM_APP_NAME,
98
+ isVersionAtLeast,
98
99
  resolveContactsVersionRequirements,
99
100
  } from "@ledgerhq/device-contacts-kit";
100
101
 
@@ -102,17 +103,25 @@ import {
102
103
  const requirement = resolveContactsVersionRequirements(deviceModelId);
103
104
  // { supported: true, minOsVersion, minAppVersion: { Ethereum } } | { supported: false }
104
105
 
105
- // Or evaluate support directly.
106
- const supported = isContactsSupported({
107
- deviceModelId,
108
- osVersion,
109
- appName,
110
- appVersion,
111
- });
106
+ if (requirement.supported) {
107
+ // OS-owned operations, e.g. renaming a contact from the dashboard.
108
+ const osReady = isVersionAtLeast(osVersion, requirement.minOsVersion);
109
+
110
+ // App-owned operations, e.g. registering an external address.
111
+ const minAppVersion = requirement.minAppVersion[ETHEREUM_APP_NAME];
112
+ const appReady =
113
+ minAppVersion !== undefined && isVersionAtLeast(appVersion, minAppVersion);
114
+ }
112
115
  ```
113
116
 
114
- There are two independent axes: `minOsVersion` gates OS-owned operations (served by the device OS,
115
- e.g. renaming a contact from the dashboard) and `minAppVersion` gates app-owned operations (served
116
- by the embedded app, keyed by app name — v1 ships Ethereum only). The `isContactsSupported` helper
117
- and the raw `CONTACTS_VERSION_REQUIREMENTS` table are pure and dependency-light, so a host such as
118
- Ledger Wallet can import either to compose its own app-readiness checks.
117
+ The two axes are checked independently, never as one combined verdict: `minOsVersion` gates
118
+ OS-owned operations (served by the device OS, e.g. renaming a contact from the dashboard) and
119
+ `minAppVersion` gates app-owned operations (served by the embedded app, keyed by app name — v1
120
+ ships Ethereum only). A device can satisfy one and not the other, and each Contacts operation
121
+ depends on exactly one of them, so collapsing them into a single "is Contacts supported" answer
122
+ would reject devices that can serve the operation the host actually wants.
123
+
124
+ `isVersionAtLeast` and the raw `CONTACTS_VERSION_REQUIREMENTS` table are pure and
125
+ dependency-light, so a host such as Ledger Wallet can import either to compose its own
126
+ app-readiness checks. Version comparison ignores prerelease and build tags, so a device on a
127
+ release candidate of a minimum (`1.7.0-rc2` against a `1.7.0` minimum) counts as meeting it.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/app-binder/RenameContactDeviceActionTypes.ts"],
4
- "sourcesContent": ["import {\n type CommandErrorResult,\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type GoToDashboardDAError,\n type GoToDashboardDARequiredInteraction,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n type RenameContactInput,\n type RenameContactOutput,\n} from \"@api/model/RenameContact\";\nimport {\n type ContactsErrorCodes,\n type ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\nimport { type ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\n/**\n * Rename is a dashboard operation, so the machine input is exactly the public\n * input \u2014 no embedded-app name is injected (the OS serves the command; there is\n * no app to open).\n */\nexport type RenameContactDAInput = RenameContactInput;\n\nexport type RenameContactDAOutput = RenameContactOutput;\n\nexport type RenameContactDAError =\n | GoToDashboardDAError\n | ContactsValidationError\n | ContactsVersionRequirementError\n | CommandErrorResult<ContactsErrorCodes>[\"error\"];\n\nexport type RenameContactDARequiredInteraction =\n | GoToDashboardDARequiredInteraction\n | UserInteractionRequired.RegisterWallet;\n\nexport type RenameContactDAIntermediateValue = {\n readonly requiredUserInteraction: RenameContactDARequiredInteraction;\n};\n\nexport type RenameContactDAState = DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n>;\n\nexport type RenameContactDAInternalState = {\n readonly error: RenameContactDAError | null;\n readonly proof: {\n readonly hmacProof: Uint8Array;\n } | null;\n};\n\nexport type RenameContactDAReturnType = ExecuteDeviceActionReturnType<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n>;\n"],
4
+ "sourcesContent": ["import {\n type CommandErrorResult,\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type GoToDashboardDAError,\n type GoToDashboardDARequiredInteraction,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport {\n type RenameContactInput,\n type RenameContactOutput,\n} from \"@api/model/RenameContact\";\nimport {\n type ContactsErrorCodes,\n type ContactsVersionRequirementError,\n} from \"@internal/app-binder/model/contactsErrors\";\nimport { type ContactsValidationError } from \"@internal/app-binder/model/contactsValidation\";\n\n/**\n * Rename is a dashboard operation, so the machine input is exactly the public\n * input \u2014 no embedded-app name is injected (the OS serves the command; there is\n * no app to open).\n */\nexport type RenameContactDAInput = RenameContactInput;\n\nexport type RenameContactDAOutput = RenameContactOutput;\n\nexport type RenameContactDAError =\n | GoToDashboardDAError\n | ContactsValidationError\n | ContactsVersionRequirementError\n // A `GetOsVersion` failure surfaces as the command error itself (not a\n // version-requirement error). `GetOsVersion` carries no Contacts-specific\n // error codes, so its error type is the bare command error.\n | CommandErrorResult[\"error\"]\n | CommandErrorResult<ContactsErrorCodes>[\"error\"];\n\nexport type RenameContactDARequiredInteraction =\n | GoToDashboardDARequiredInteraction\n | UserInteractionRequired.RegisterWallet;\n\nexport type RenameContactDAIntermediateValue = {\n readonly requiredUserInteraction: RenameContactDARequiredInteraction;\n};\n\nexport type RenameContactDAState = DeviceActionState<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n>;\n\nexport type RenameContactDAInternalState = {\n readonly error: RenameContactDAError | null;\n // The device OS version read freshly via `GetOsVersion` after reaching the\n // dashboard, fed to the version guard instead of the session state (whose\n // firmware version is often absent on this path).\n readonly osVersion: string | null;\n readonly proof: {\n readonly hmacProof: Uint8Array;\n } | null;\n};\n\nexport type RenameContactDAReturnType = ExecuteDeviceActionReturnType<\n RenameContactDAOutput,\n RenameContactDAError,\n RenameContactDAIntermediateValue\n>;\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["RenameContactDeviceActionTypes_exports", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var p=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var E=(r,t)=>{for(var d in t)p(r,d,{get:t[d],enumerable:!0})},y=(r,t,d,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of i(t))!A.call(r,n)&&n!==d&&p(r,n,{get:()=>t[n],enumerable:!(s=o(t,n))||s.enumerable});return r};var u=r=>y(p({},"__esModule",{value:!0}),r);var x={};E(x,{CONTACTS_VERSION_REQUIREMENTS:()=>e.CONTACTS_VERSION_REQUIREMENTS,ContactsManagerBuilder:()=>a.ContactsManagerBuilder,ETHEREUM_APP_NAME:()=>e.ETHEREUM_APP_NAME,isContactsSupported:()=>e.isContactsSupported,isVersionAtLeast:()=>e.isVersionAtLeast,resolveContactsVersionRequirements:()=>e.resolveContactsVersionRequirements});module.exports=u(x);var a=require("./ContactsManagerBuilder"),e=require("./model/ContactsVersionRequirements");0&&(module.exports={CONTACTS_VERSION_REQUIREMENTS,ContactsManagerBuilder,ETHEREUM_APP_NAME,isContactsSupported,isVersionAtLeast,resolveContactsVersionRequirements});
1
+ "use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var y=(r,e)=>{for(var n in e)o(r,n,{get:e[n],enumerable:!0})},u=(r,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let d of A(e))!E.call(r,d)&&d!==n&&o(r,d,{get:()=>e[d],enumerable:!(s=i(e,d))||s.enumerable});return r};var x=r=>u(o({},"__esModule",{value:!0}),r);var l={};y(l,{CONTACTS_VERSION_REQUIREMENTS:()=>t.CONTACTS_VERSION_REQUIREMENTS,ContactsManagerBuilder:()=>a.ContactsManagerBuilder,ETHEREUM_APP_NAME:()=>t.ETHEREUM_APP_NAME,buildProvideContactPayload:()=>p.buildProvideContactPayload,isVersionAtLeast:()=>t.isVersionAtLeast,resolveContactsVersionRequirements:()=>t.resolveContactsVersionRequirements,sendProvideContactPayload:()=>p.sendProvideContactPayload});module.exports=x(l);var a=require("./ContactsManagerBuilder"),t=require("./model/ContactsVersionRequirements"),p=require("../internal/app-binder/services/provideContact");0&&(module.exports={CONTACTS_VERSION_REQUIREMENTS,ContactsManagerBuilder,ETHEREUM_APP_NAME,buildProvideContactPayload,isVersionAtLeast,resolveContactsVersionRequirements,sendProvideContactPayload});
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/api/index.ts"],
4
- "sourcesContent": ["export {\n type EditExternalAddressIdentifierDAError,\n type EditExternalAddressIdentifierDAInput,\n type EditExternalAddressIdentifierDAIntermediateValue,\n type EditExternalAddressIdentifierDAOutput,\n type EditExternalAddressIdentifierDARequiredInteraction,\n type EditExternalAddressIdentifierDAReturnType,\n type EditExternalAddressIdentifierDAState,\n} from \"@api/app-binder/EditExternalAddressIdentifierDeviceActionTypes\";\nexport {\n type EditExternalAddressScopeDAError,\n type EditExternalAddressScopeDAInput,\n type EditExternalAddressScopeDAIntermediateValue,\n type EditExternalAddressScopeDAOutput,\n type EditExternalAddressScopeDARequiredInteraction,\n type EditExternalAddressScopeDAReturnType,\n type EditExternalAddressScopeDAState,\n} from \"@api/app-binder/EditExternalAddressScopeDeviceActionTypes\";\nexport {\n type RegisterExternalAddressDAError,\n type RegisterExternalAddressDAInput,\n type RegisterExternalAddressDAIntermediateValue,\n type RegisterExternalAddressDAOutput,\n type RegisterExternalAddressDARequiredInteraction,\n type RegisterExternalAddressDAReturnType,\n type RegisterExternalAddressDAState,\n} from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\nexport {\n type RenameContactDAError,\n type RenameContactDAInput,\n type RenameContactDAIntermediateValue,\n type RenameContactDAOutput,\n type RenameContactDARequiredInteraction,\n type RenameContactDAReturnType,\n type RenameContactDAState,\n} from \"@api/app-binder/RenameContactDeviceActionTypes\";\nexport { type ContactsManager } from \"@api/ContactsManager\";\nexport { ContactsManagerBuilder } from \"@api/ContactsManagerBuilder\";\nexport {\n CONTACTS_VERSION_REQUIREMENTS,\n type ContactsModelRequirement,\n type ContactsModelSupport,\n type ContactsModelUnsupported,\n type ContactsSupportQuery,\n type ContactsVersionRequirements,\n ETHEREUM_APP_NAME,\n isContactsSupported,\n isVersionAtLeast,\n resolveContactsVersionRequirements,\n} from \"@api/model/ContactsVersionRequirements\";\nexport {\n type EditExternalAddressIdentifierInput,\n type EditExternalAddressIdentifierOutput,\n} from \"@api/model/EditExternalAddressIdentifier\";\nexport {\n type EditExternalAddressScopeInput,\n type EditExternalAddressScopeOutput,\n} from \"@api/model/EditExternalAddressScope\";\nexport {\n type ExistingContactGroup,\n type RegisterExternalAddressInput,\n type RegisterExternalAddressMode,\n type RegisterExternalAddressOutput,\n} from \"@api/model/RegisterExternalAddress\";\nexport {\n type RenameContactInput,\n type RenameContactOutput,\n} from \"@api/model/RenameContact\";\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oVAAAE,EAAAF,GAqCA,IAAAG,EAAuC,uCACvCC,EAWO",
6
- "names": ["api_exports", "__export", "__toCommonJS", "import_ContactsManagerBuilder", "import_ContactsVersionRequirements"]
4
+ "sourcesContent": ["export {\n type EditExternalAddressIdentifierDAError,\n type EditExternalAddressIdentifierDAInput,\n type EditExternalAddressIdentifierDAIntermediateValue,\n type EditExternalAddressIdentifierDAOutput,\n type EditExternalAddressIdentifierDARequiredInteraction,\n type EditExternalAddressIdentifierDAReturnType,\n type EditExternalAddressIdentifierDAState,\n} from \"@api/app-binder/EditExternalAddressIdentifierDeviceActionTypes\";\nexport {\n type EditExternalAddressScopeDAError,\n type EditExternalAddressScopeDAInput,\n type EditExternalAddressScopeDAIntermediateValue,\n type EditExternalAddressScopeDAOutput,\n type EditExternalAddressScopeDARequiredInteraction,\n type EditExternalAddressScopeDAReturnType,\n type EditExternalAddressScopeDAState,\n} from \"@api/app-binder/EditExternalAddressScopeDeviceActionTypes\";\nexport {\n type RegisterExternalAddressDAError,\n type RegisterExternalAddressDAInput,\n type RegisterExternalAddressDAIntermediateValue,\n type RegisterExternalAddressDAOutput,\n type RegisterExternalAddressDARequiredInteraction,\n type RegisterExternalAddressDAReturnType,\n type RegisterExternalAddressDAState,\n} from \"@api/app-binder/RegisterExternalAddressDeviceActionTypes\";\nexport {\n type RenameContactDAError,\n type RenameContactDAInput,\n type RenameContactDAIntermediateValue,\n type RenameContactDAOutput,\n type RenameContactDARequiredInteraction,\n type RenameContactDAReturnType,\n type RenameContactDAState,\n} from \"@api/app-binder/RenameContactDeviceActionTypes\";\nexport { type ContactsManager } from \"@api/ContactsManager\";\nexport { ContactsManagerBuilder } from \"@api/ContactsManagerBuilder\";\nexport {\n CONTACTS_VERSION_REQUIREMENTS,\n type ContactsModelRequirement,\n type ContactsModelSupport,\n type ContactsModelUnsupported,\n type ContactsVersionRequirements,\n ETHEREUM_APP_NAME,\n isVersionAtLeast,\n resolveContactsVersionRequirements,\n} from \"@api/model/ContactsVersionRequirements\";\nexport {\n type EditExternalAddressIdentifierInput,\n type EditExternalAddressIdentifierOutput,\n} from \"@api/model/EditExternalAddressIdentifier\";\nexport {\n type EditExternalAddressScopeInput,\n type EditExternalAddressScopeOutput,\n} from \"@api/model/EditExternalAddressScope\";\nexport { type ProvideContactInput } from \"@api/model/ProvideContact\";\nexport {\n type ExistingContactGroup,\n type RegisterExternalAddressInput,\n type RegisterExternalAddressMode,\n type RegisterExternalAddressOutput,\n} from \"@api/model/RegisterExternalAddress\";\nexport {\n type RenameContactInput,\n type RenameContactOutput,\n} from \"@api/model/RenameContact\";\nexport { type ContactsErrorCodes } from \"@internal/app-binder/model/contactsErrors\";\nexport {\n buildProvideContactPayload,\n sendProvideContactPayload,\n type SendProvideContactPayloadArgs,\n} from \"@internal/app-binder/services/provideContact\";\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4ZAAAE,EAAAF,GAqCA,IAAAG,EAAuC,uCACvCC,EASO,kDAqBPC,EAIO",
6
+ "names": ["api_exports", "__export", "__toCommonJS", "import_ContactsManagerBuilder", "import_ContactsVersionRequirements", "import_provideContact"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var d=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var M=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var R=(e,o)=>{for(var n in o)d(e,n,{get:o[n],enumerable:!0})},S=(e,o,n,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of M(o))!N.call(e,r)&&r!==n&&d(e,r,{get:()=>o[r],enumerable:!(s=E(o,r))||s.enumerable});return e};var _=e=>S(d({},"__esModule",{value:!0}),e);var C={};R(C,{CONTACTS_VERSION_REQUIREMENTS:()=>V,ETHEREUM_APP_NAME:()=>i,isContactsSupported:()=>f,isVersionAtLeast:()=>c,resolveContactsVersionRequirements:()=>m});module.exports=_(C);var p=require("@ledgerhq/device-management-kit"),t=require("semver");const i="Ethereum",u={supported:!1},A="1.5.0",O="1.2.0",y="0.9.0",a="1.15.0",V={[p.DeviceModelId.NANO_S]:u,[p.DeviceModelId.NANO_SP]:u,[p.DeviceModelId.NANO_X]:u,[p.DeviceModelId.STAX]:{supported:!0,minOsVersion:A,minAppVersion:{[i]:a}},[p.DeviceModelId.FLEX]:{supported:!0,minOsVersion:O,minAppVersion:{[i]:a}},[p.DeviceModelId.APEX]:{supported:!0,minOsVersion:y,minAppVersion:{[i]:a}}};function m(e){return V[e]}function c(e,o){const n=(0,t.valid)(e)??(0,t.valid)((0,t.coerce)(e)),s=(0,t.valid)(o)??(0,t.valid)((0,t.coerce)(o));return n===null||s===null?!1:(0,t.gte)(n,s)}function f({deviceModelId:e,osVersion:o,appName:n,appVersion:s}){const r=m(e);if(!r.supported||!c(o,r.minOsVersion))return!1;const l=r.minAppVersion[n];return l===void 0?!1:c(s,l)}0&&(module.exports={CONTACTS_VERSION_REQUIREMENTS,ETHEREUM_APP_NAME,isContactsSupported,isVersionAtLeast,resolveContactsVersionRequirements});
1
+ "use strict";var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var V=(e,n)=>{for(var o in n)u(e,o,{get:n[o],enumerable:!0})},M=(e,n,o,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let p of A(n))!m.call(e,p)&&p!==o&&u(e,p,{get:()=>n[p],enumerable:!(t=R(n,p))||t.enumerable});return e};var P=e=>M(u({},"__esModule",{value:!0}),e);var U={};V(U,{CONTACTS_VERSION_REQUIREMENTS:()=>c,ETHEREUM_APP_NAME:()=>i,isVersionAtLeast:()=>D,isVersionBelow:()=>E,renameRequiresDerivationPath:()=>F,resolveContactsVersionRequirements:()=>v});module.exports=P(U);var s=require("@ledgerhq/device-management-kit"),r=require("semver");const i="Ethereum",S={supported:!1},d="1.11.0",l="1.7.0",_="1.2.0",O="2.8.0",N="1.7.0",a="1.23.0",f=`${d}-rc3`,T=`${l}-rc3`,C=`${_}-rc3`,I=`${O}-rc3`,q=`${N}-rc3`,c={[s.DeviceModelId.NANO_S]:S,[s.DeviceModelId.NANO_SP]:{supported:!0,minOsVersion:N,minAppVersion:{[i]:a},renameDerivationPathRequiredBelowOsVersion:q},[s.DeviceModelId.NANO_X]:{supported:!0,minOsVersion:O,minAppVersion:{[i]:a},renameDerivationPathRequiredBelowOsVersion:I},[s.DeviceModelId.STAX]:{supported:!0,minOsVersion:d,minAppVersion:{[i]:a},renameDerivationPathRequiredBelowOsVersion:f},[s.DeviceModelId.FLEX]:{supported:!0,minOsVersion:l,minAppVersion:{[i]:a},renameDerivationPathRequiredBelowOsVersion:T},[s.DeviceModelId.APEX]:{supported:!0,minOsVersion:_,minAppVersion:{[i]:a},renameDerivationPathRequiredBelowOsVersion:C}};function v(e){return c[e]}function D(e,n){const o=(0,r.valid)((0,r.coerce)(e)),t=(0,r.valid)((0,r.coerce)(n));return o===null||t===null?!1:(0,r.gte)(o,t)}function E(e,n){const o=(0,r.valid)(e),t=(0,r.valid)(n);return o===null||t===null?!1:(0,r.lt)(o,t)}function F(e,n){const o=c[e];if(!o.supported)return!1;const t=o.renameDerivationPathRequiredBelowOsVersion;return t===void 0?!1:E(n,t)}0&&(module.exports={CONTACTS_VERSION_REQUIREMENTS,ETHEREUM_APP_NAME,isVersionAtLeast,isVersionBelow,renameRequiresDerivationPath,resolveContactsVersionRequirements});
2
2
  //# sourceMappingURL=ContactsVersionRequirements.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/model/ContactsVersionRequirements.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { coerce, gte, valid } from \"semver\";\n\n/**\n * Version requirements for a device model on which Contacts (Address Book)\n * operations are supported.\n *\n * Contacts has two independent version axes:\n * - `minOsVersion` gates OS-owned operations (e.g. renaming a contact from the\n * device dashboard), which are served by the device OS.\n * - `minAppVersion` gates app-owned operations (registering / editing external\n * addresses and Ledger accounts), which are served by the embedded app. It is\n * keyed by app name because the required version differs per app; v1 ships\n * Ethereum only.\n */\nexport type ContactsModelSupport = {\n readonly supported: true;\n readonly minOsVersion: string;\n readonly minAppVersion: Readonly<Record<string, string>>;\n};\n\n/** Marks a device model on which Contacts is not supported at all. */\nexport type ContactsModelUnsupported = {\n readonly supported: false;\n};\n\nexport type ContactsModelRequirement =\n | ContactsModelSupport\n | ContactsModelUnsupported;\n\n/**\n * The full, static Contacts version-requirement table, keyed by device model.\n * Serializable plain data with no runtime dependencies, so hosts (e.g. Ledger\n * Wallet) can import and consume it directly when composing their own\n * app-readiness checks, without duplicating the values.\n */\nexport type ContactsVersionRequirements = Readonly<\n Record<DeviceModelId, ContactsModelRequirement>\n>;\n\n/** The name of the Ethereum embedded app (the only app supported in v1). */\nexport const ETHEREUM_APP_NAME = \"Ethereum\";\n\nconst UNSUPPORTED: ContactsModelUnsupported = { supported: false };\n\n// TODO(DSDK-1376): replace these placeholder versions with the real minimums\n// confirmed by the firmware and Ethereum-app owners. The shape and consumers\n// are final; only the version strings below are provisional.\nconst MIN_OS_VERSION_STAX = \"1.5.0\";\nconst MIN_OS_VERSION_FLEX = \"1.2.0\";\nconst MIN_OS_VERSION_APEX = \"0.9.0\";\nconst MIN_ETHEREUM_APP_VERSION = \"1.15.0\";\n\n/**\n * Contacts APDUs are supported only on the touchscreen device models (Stax,\n * Flex, Apex). The Nano models do not support Contacts at all.\n */\nexport const CONTACTS_VERSION_REQUIREMENTS: ContactsVersionRequirements = {\n [DeviceModelId.NANO_S]: UNSUPPORTED,\n [DeviceModelId.NANO_SP]: UNSUPPORTED,\n [DeviceModelId.NANO_X]: UNSUPPORTED,\n [DeviceModelId.STAX]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_STAX,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n },\n [DeviceModelId.FLEX]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_FLEX,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n },\n [DeviceModelId.APEX]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_APEX,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n },\n};\n\n/**\n * Resolve the Contacts version requirements for a device model \u2014 i.e. the\n * minimum supported OS and app versions, or that the model is unsupported.\n */\nexport function resolveContactsVersionRequirements(\n deviceModelId: DeviceModelId,\n): ContactsModelRequirement {\n return CONTACTS_VERSION_REQUIREMENTS[deviceModelId];\n}\n\n/**\n * Whether `actual` is greater than or equal to `minimum`, comparing as semver.\n * Tolerant of non-strict version strings (coerces where possible) and returns\n * `false` (i.e. requirement not met) when either version cannot be parsed, so\n * an unknown version never passes a check.\n */\nexport function isVersionAtLeast(actual: string, minimum: string): boolean {\n const a = valid(actual) ?? valid(coerce(actual));\n const b = valid(minimum) ?? valid(coerce(minimum));\n if (a === null || b === null) return false;\n return gte(a, b);\n}\n\n/** Inputs for {@link isContactsSupported}. */\nexport type ContactsSupportQuery = {\n readonly deviceModelId: DeviceModelId;\n /** The device OS (firmware) version. */\n readonly osVersion: string;\n /** The name of the currently running embedded app. */\n readonly appName: string;\n /** The version of the currently running embedded app. */\n readonly appVersion: string;\n};\n\n/**\n * Whether Contacts app-owned operations are supported for the given device\n * model, OS version, and running app \u2014 checking the model is supported, the OS\n * meets its minimum, the app is known to Contacts, and the app meets its\n * minimum.\n *\n * Pure and dependency-light: hosts can call this directly, or read\n * {@link CONTACTS_VERSION_REQUIREMENTS} to build their own checks.\n */\nexport function isContactsSupported({\n deviceModelId,\n osVersion,\n appName,\n appVersion,\n}: ContactsSupportQuery): boolean {\n const requirement = resolveContactsVersionRequirements(deviceModelId);\n if (!requirement.supported) return false;\n if (!isVersionAtLeast(osVersion, requirement.minOsVersion)) return false;\n\n const minAppVersion = requirement.minAppVersion[appName];\n if (minAppVersion === undefined) return false;\n return isVersionAtLeast(appVersion, minAppVersion);\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,EAAA,sBAAAC,EAAA,wBAAAC,EAAA,qBAAAC,EAAA,uCAAAC,IAAA,eAAAC,EAAAP,GAAA,IAAAQ,EAA8B,2CAC9BC,EAAmC,kBAwC5B,MAAMN,EAAoB,WAE3BO,EAAwC,CAAE,UAAW,EAAM,EAK3DC,EAAsB,QACtBC,EAAsB,QACtBC,EAAsB,QACtBC,EAA2B,SAMpBZ,EAA6D,CACxE,CAAC,gBAAc,MAAM,EAAGQ,EACxB,CAAC,gBAAc,OAAO,EAAGA,EACzB,CAAC,gBAAc,MAAM,EAAGA,EACxB,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAcC,EACd,cAAe,CAAE,CAACR,CAAiB,EAAGW,CAAyB,CACjE,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAcF,EACd,cAAe,CAAE,CAACT,CAAiB,EAAGW,CAAyB,CACjE,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAcD,EACd,cAAe,CAAE,CAACV,CAAiB,EAAGW,CAAyB,CACjE,CACF,EAMO,SAASR,EACdS,EAC0B,CAC1B,OAAOb,EAA8Ba,CAAa,CACpD,CAQO,SAASV,EAAiBW,EAAgBC,EAA0B,CACzE,MAAMC,KAAI,SAAMF,CAAM,MAAK,YAAM,UAAOA,CAAM,CAAC,EACzCG,KAAI,SAAMF,CAAO,MAAK,YAAM,UAAOA,CAAO,CAAC,EACjD,OAAIC,IAAM,MAAQC,IAAM,KAAa,MAC9B,OAAID,EAAGC,CAAC,CACjB,CAsBO,SAASf,EAAoB,CAClC,cAAAW,EACA,UAAAK,EACA,QAAAC,EACA,WAAAC,CACF,EAAkC,CAChC,MAAMC,EAAcjB,EAAmCS,CAAa,EAEpE,GADI,CAACQ,EAAY,WACb,CAAClB,EAAiBe,EAAWG,EAAY,YAAY,EAAG,MAAO,GAEnE,MAAMC,EAAgBD,EAAY,cAAcF,CAAO,EACvD,OAAIG,IAAkB,OAAkB,GACjCnB,EAAiBiB,EAAYE,CAAa,CACnD",
6
- "names": ["ContactsVersionRequirements_exports", "__export", "CONTACTS_VERSION_REQUIREMENTS", "ETHEREUM_APP_NAME", "isContactsSupported", "isVersionAtLeast", "resolveContactsVersionRequirements", "__toCommonJS", "import_device_management_kit", "import_semver", "UNSUPPORTED", "MIN_OS_VERSION_STAX", "MIN_OS_VERSION_FLEX", "MIN_OS_VERSION_APEX", "MIN_ETHEREUM_APP_VERSION", "deviceModelId", "actual", "minimum", "a", "b", "osVersion", "appName", "appVersion", "requirement", "minAppVersion"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { coerce, gte, lt, valid } from \"semver\";\n\n/**\n * Version requirements for a device model on which Contacts (Address Book)\n * operations are supported.\n *\n * Contacts has two independent version axes:\n * - `minOsVersion` gates OS-owned operations (e.g. renaming a contact from the\n * device dashboard), which are served by the device OS.\n * - `minAppVersion` gates app-owned operations (registering / editing external\n * addresses and Ledger accounts), which are served by the embedded app. It is\n * keyed by app name because the required version differs per app; v1 ships\n * Ethereum only.\n */\nexport type ContactsModelSupport = {\n readonly supported: true;\n readonly minOsVersion: string;\n readonly minAppVersion: Readonly<Record<string, string>>;\n /**\n * TEMPORARY (DSDK-1481) \u2014 the first OS build for this model that no longer\n * wants the `DERIVATION_PATH` (tag 0x69) on EDIT CONTACT NAME. Rename is\n * served by the OS, and OS builds *below* this version still require the path\n * (omitting it yields 0x686A), while this build and later reject it\n * (0x6A80). So the path is sent only when the device OS is below this\n * cutoff. Absent means the model never wanted the path (send nothing \u2014 the\n * GA end-state). Delete this field, its constants, and\n * {@link renameRequiresDerivationPath} once no in-the-field OS predates the\n * cutoff.\n */\n readonly renameDerivationPathRequiredBelowOsVersion?: string;\n};\n\n/** Marks a device model on which Contacts is not supported at all. */\nexport type ContactsModelUnsupported = {\n readonly supported: false;\n};\n\nexport type ContactsModelRequirement =\n | ContactsModelSupport\n | ContactsModelUnsupported;\n\n/**\n * The full, static Contacts version-requirement table, keyed by device model.\n * Serializable plain data with no runtime dependencies, so hosts (e.g. Ledger\n * Wallet) can import and consume it directly when composing their own\n * app-readiness checks, without duplicating the values.\n */\nexport type ContactsVersionRequirements = Readonly<\n Record<DeviceModelId, ContactsModelRequirement>\n>;\n\n/** The name of the Ethereum embedded app (the only app supported in v1). */\nexport const ETHEREUM_APP_NAME = \"Ethereum\";\n\nconst UNSUPPORTED: ContactsModelUnsupported = { supported: false };\n\nconst MIN_OS_VERSION_STAX = \"1.11.0\";\nconst MIN_OS_VERSION_FLEX = \"1.7.0\";\nconst MIN_OS_VERSION_APEX = \"1.2.0\";\nconst MIN_OS_VERSION_NANO_X = \"2.8.0\";\nconst MIN_OS_VERSION_NANO_SP = \"1.7.0\";\n\nconst MIN_ETHEREUM_APP_VERSION = \"1.23.0\";\n\n// TEMPORARY (DSDK-1481) \u2014 per-model cutoff below which the OS still requires the\n// EDIT CONTACT NAME derivation path. Each model's Address-Book-introducing OS\n// release shipped an rc2 that mandates the path (0x686A without it) and an rc3\n// that drops it (0x6A80 with it), so the cutoff is that release's `-rc3`. Only\n// Flex is hardware-confirmed (rc2 on a real device); the others follow the same\n// rc2/rc3 split per firmware \u2014 revise here if firmware says a model differs.\nconst RENAME_PATH_CUTOFF_STAX = `${MIN_OS_VERSION_STAX}-rc3`;\nconst RENAME_PATH_CUTOFF_FLEX = `${MIN_OS_VERSION_FLEX}-rc3`;\nconst RENAME_PATH_CUTOFF_APEX = `${MIN_OS_VERSION_APEX}-rc3`;\nconst RENAME_PATH_CUTOFF_NANO_X = `${MIN_OS_VERSION_NANO_X}-rc3`;\nconst RENAME_PATH_CUTOFF_NANO_SP = `${MIN_OS_VERSION_NANO_SP}-rc3`;\n\n/**\n * Contacts APDUs are supported on the touchscreen device models (Stax, Flex,\n * Apex) and on Nano X / Nano SP. Nano S does not support Contacts at all.\n */\nexport const CONTACTS_VERSION_REQUIREMENTS: ContactsVersionRequirements = {\n [DeviceModelId.NANO_S]: UNSUPPORTED,\n [DeviceModelId.NANO_SP]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_NANO_SP,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n renameDerivationPathRequiredBelowOsVersion: RENAME_PATH_CUTOFF_NANO_SP,\n },\n [DeviceModelId.NANO_X]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_NANO_X,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n renameDerivationPathRequiredBelowOsVersion: RENAME_PATH_CUTOFF_NANO_X,\n },\n [DeviceModelId.STAX]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_STAX,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n renameDerivationPathRequiredBelowOsVersion: RENAME_PATH_CUTOFF_STAX,\n },\n [DeviceModelId.FLEX]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_FLEX,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n renameDerivationPathRequiredBelowOsVersion: RENAME_PATH_CUTOFF_FLEX,\n },\n [DeviceModelId.APEX]: {\n supported: true,\n minOsVersion: MIN_OS_VERSION_APEX,\n minAppVersion: { [ETHEREUM_APP_NAME]: MIN_ETHEREUM_APP_VERSION },\n renameDerivationPathRequiredBelowOsVersion: RENAME_PATH_CUTOFF_APEX,\n },\n};\n\n/**\n * Resolve the Contacts version requirements for a device model \u2014 i.e. the\n * minimum supported OS and app versions, or that the model is unsupported.\n */\nexport function resolveContactsVersionRequirements(\n deviceModelId: DeviceModelId,\n): ContactsModelRequirement {\n return CONTACTS_VERSION_REQUIREMENTS[deviceModelId];\n}\n\n/**\n * Whether `actual` is greater than or equal to `minimum`, comparing as semver.\n * Tolerant of non-strict version strings and prerelease/build tags (coerces\n * both sides, which drops them) so a release candidate such as `1.7.0-rc2`\n * counts as meeting a `1.7.0` minimum. Returns `false` (i.e. requirement not\n * met) when either version cannot be parsed, so an unknown version never\n * passes a check.\n */\nexport function isVersionAtLeast(actual: string, minimum: string): boolean {\n const a = valid(coerce(actual));\n const b = valid(coerce(minimum));\n if (a === null || b === null) return false;\n return gte(a, b);\n}\n\n/**\n * Whether `actual` is strictly less than `boundary`, comparing as semver with\n * prerelease precedence preserved \u2014 unlike {@link isVersionAtLeast}, neither\n * side is coerced, so `1.7.0-rc2` sorts *below* `1.7.0-rc3` (and both below the\n * `1.7.0` release). Used to tell release candidates apart for the DSDK-1481\n * derivation-path cutoff, which `isVersionAtLeast` cannot do (it drops the\n * `-rcN` tag). Requires strict semver on both sides; returns `false` when\n * either cannot be parsed, so an unknown version is treated as *not* below the\n * boundary (i.e. the newer/GA payload shape).\n */\nexport function isVersionBelow(actual: string, boundary: string): boolean {\n const a = valid(actual);\n const b = valid(boundary);\n if (a === null || b === null) return false;\n return lt(a, b);\n}\n\n/**\n * TEMPORARY (DSDK-1481) \u2014 whether the EDIT CONTACT NAME (rename) payload must\n * carry the `DERIVATION_PATH` (tag 0x69) for a device on `osVersion`. True only\n * when the model is supported, declares a\n * {@link ContactsModelSupport.renameDerivationPathRequiredBelowOsVersion}\n * cutoff, and the fresh device OS version is strictly below that cutoff\n * (prerelease-aware). Callers pass the OS version read freshly from the device\n * (not the session state, which may be stale/absent on the dashboard path).\n */\nexport function renameRequiresDerivationPath(\n deviceModelId: DeviceModelId,\n osVersion: string,\n): boolean {\n const requirement = CONTACTS_VERSION_REQUIREMENTS[deviceModelId];\n if (!requirement.supported) return false;\n const cutoff = requirement.renameDerivationPathRequiredBelowOsVersion;\n if (cutoff === undefined) return false;\n return isVersionBelow(osVersion, cutoff);\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,EAAA,sBAAAC,EAAA,qBAAAC,EAAA,mBAAAC,EAAA,iCAAAC,EAAA,uCAAAC,IAAA,eAAAC,EAAAR,GAAA,IAAAS,EAA8B,2CAC9BC,EAAuC,kBAoDhC,MAAMP,EAAoB,WAE3BQ,EAAwC,CAAE,UAAW,EAAM,EAE3DC,EAAsB,SACtBC,EAAsB,QACtBC,EAAsB,QACtBC,EAAwB,QACxBC,EAAyB,QAEzBC,EAA2B,SAQ3BC,EAA0B,GAAGN,CAAmB,OAChDO,EAA0B,GAAGN,CAAmB,OAChDO,EAA0B,GAAGN,CAAmB,OAChDO,EAA4B,GAAGN,CAAqB,OACpDO,EAA6B,GAAGN,CAAsB,OAM/Cd,EAA6D,CACxE,CAAC,gBAAc,MAAM,EAAGS,EACxB,CAAC,gBAAc,OAAO,EAAG,CACvB,UAAW,GACX,aAAcK,EACd,cAAe,CAAE,CAACb,CAAiB,EAAGc,CAAyB,EAC/D,2CAA4CK,CAC9C,EACA,CAAC,gBAAc,MAAM,EAAG,CACtB,UAAW,GACX,aAAcP,EACd,cAAe,CAAE,CAACZ,CAAiB,EAAGc,CAAyB,EAC/D,2CAA4CI,CAC9C,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAcT,EACd,cAAe,CAAE,CAACT,CAAiB,EAAGc,CAAyB,EAC/D,2CAA4CC,CAC9C,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAcL,EACd,cAAe,CAAE,CAACV,CAAiB,EAAGc,CAAyB,EAC/D,2CAA4CE,CAC9C,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAcL,EACd,cAAe,CAAE,CAACX,CAAiB,EAAGc,CAAyB,EAC/D,2CAA4CG,CAC9C,CACF,EAMO,SAASb,EACdgB,EAC0B,CAC1B,OAAOrB,EAA8BqB,CAAa,CACpD,CAUO,SAASnB,EAAiBoB,EAAgBC,EAA0B,CACzE,MAAMC,KAAI,YAAM,UAAOF,CAAM,CAAC,EACxBG,KAAI,YAAM,UAAOF,CAAO,CAAC,EAC/B,OAAIC,IAAM,MAAQC,IAAM,KAAa,MAC9B,OAAID,EAAGC,CAAC,CACjB,CAYO,SAAStB,EAAemB,EAAgBI,EAA2B,CACxE,MAAMF,KAAI,SAAMF,CAAM,EAChBG,KAAI,SAAMC,CAAQ,EACxB,OAAIF,IAAM,MAAQC,IAAM,KAAa,MAC9B,MAAGD,EAAGC,CAAC,CAChB,CAWO,SAASrB,EACdiB,EACAM,EACS,CACT,MAAMC,EAAc5B,EAA8BqB,CAAa,EAC/D,GAAI,CAACO,EAAY,UAAW,MAAO,GACnC,MAAMC,EAASD,EAAY,2CAC3B,OAAIC,IAAW,OAAkB,GAC1B1B,EAAewB,EAAWE,CAAM,CACzC",
6
+ "names": ["ContactsVersionRequirements_exports", "__export", "CONTACTS_VERSION_REQUIREMENTS", "ETHEREUM_APP_NAME", "isVersionAtLeast", "isVersionBelow", "renameRequiresDerivationPath", "resolveContactsVersionRequirements", "__toCommonJS", "import_device_management_kit", "import_semver", "UNSUPPORTED", "MIN_OS_VERSION_STAX", "MIN_OS_VERSION_FLEX", "MIN_OS_VERSION_APEX", "MIN_OS_VERSION_NANO_X", "MIN_OS_VERSION_NANO_SP", "MIN_ETHEREUM_APP_VERSION", "RENAME_PATH_CUTOFF_STAX", "RENAME_PATH_CUTOFF_FLEX", "RENAME_PATH_CUTOFF_APEX", "RENAME_PATH_CUTOFF_NANO_X", "RENAME_PATH_CUTOFF_NANO_SP", "deviceModelId", "actual", "minimum", "a", "b", "boundary", "osVersion", "requirement", "cutoff"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=require("@ledgerhq/device-management-kit"),e=require("./ContactsVersionRequirements");const a="0.0.1",p="999.0.0";function n(t){const s=(0,e.resolveContactsVersionRequirements)(t);if(!s.supported)throw new Error(`expected ${t} to be supported in the test fixture`);return s}function r(t){const s=t.minAppVersion[e.ETHEREUM_APP_NAME];if(s===void 0)throw new Error("expected an Ethereum minimum app version in the fixture");return s}describe("ContactsVersionRequirements",()=>{describe("resolveContactsVersionRequirements",()=>{it("marks every device model, supported or not",()=>{for(const t of Object.values(o.DeviceModelId))expect(e.CONTACTS_VERSION_REQUIREMENTS[t]).toBeDefined()}),it("reports Nano models as unsupported",()=>{expect((0,e.resolveContactsVersionRequirements)(o.DeviceModelId.NANO_S)).toEqual({supported:!1}),expect((0,e.resolveContactsVersionRequirements)(o.DeviceModelId.NANO_X)).toEqual({supported:!1})}),it("reports touchscreen models as supported with OS and app minimums",()=>{const t=n(o.DeviceModelId.FLEX);expect(t.minOsVersion).toEqual(expect.any(String)),expect(r(t)).toEqual(expect.any(String))})}),describe("isContactsSupported",()=>{it("returns false for an unsupported device model",()=>{const t=n(o.DeviceModelId.FLEX);expect((0,e.isContactsSupported)({deviceModelId:o.DeviceModelId.NANO_S,osVersion:p,appName:e.ETHEREUM_APP_NAME,appVersion:r(t)})).toBe(!1)}),it("gates on the minimum app version",()=>{const t=n(o.DeviceModelId.FLEX),s=r(t),i={deviceModelId:o.DeviceModelId.FLEX,osVersion:t.minOsVersion,appName:e.ETHEREUM_APP_NAME};expect((0,e.isContactsSupported)({...i,appVersion:a})).toBe(!1),expect((0,e.isContactsSupported)({...i,appVersion:s})).toBe(!0),expect((0,e.isContactsSupported)({...i,appVersion:p})).toBe(!0)}),it("returns false for an app that is unknown to Contacts",()=>{const t=n(o.DeviceModelId.FLEX);expect((0,e.isContactsSupported)({deviceModelId:o.DeviceModelId.FLEX,osVersion:t.minOsVersion,appName:"Bitcoin",appVersion:p})).toBe(!1)}),it("gates on the minimum OS version",()=>{const t=n(o.DeviceModelId.FLEX),s={deviceModelId:o.DeviceModelId.FLEX,appName:e.ETHEREUM_APP_NAME,appVersion:r(t)};expect((0,e.isContactsSupported)({...s,osVersion:a})).toBe(!1),expect((0,e.isContactsSupported)({...s,osVersion:t.minOsVersion})).toBe(!0)})}),describe("isVersionAtLeast",()=>{it("compares versions as semver, inclusive of equality",()=>{expect((0,e.isVersionAtLeast)("1.2.0","1.2.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.3.0","1.2.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.1.9","1.2.0")).toBe(!1)}),it("coerces non-strict version strings",()=>{expect((0,e.isVersionAtLeast)("1.2","1.2.0")).toBe(!0)}),it("returns false when a version cannot be parsed",()=>{expect((0,e.isVersionAtLeast)("not-a-version","1.2.0")).toBe(!1),expect((0,e.isVersionAtLeast)("1.2.0","not-a-version")).toBe(!1)})})});
1
+ "use strict";var t=require("@ledgerhq/device-management-kit"),e=require("./ContactsVersionRequirements");describe("ContactsVersionRequirements",()=>{describe("resolveContactsVersionRequirements",()=>{it("marks every device model, supported or not",()=>{for(const r of Object.values(t.DeviceModelId))expect(e.CONTACTS_VERSION_REQUIREMENTS[r]).toBeDefined()}),it("reports Nano S as unsupported",()=>{expect((0,e.resolveContactsVersionRequirements)(t.DeviceModelId.NANO_S)).toEqual({supported:!1})}),it("pins the minimum OS and app versions of every supported model",()=>{const r={[e.ETHEREUM_APP_NAME]:"1.23.0"};expect(e.CONTACTS_VERSION_REQUIREMENTS).toEqual({[t.DeviceModelId.NANO_S]:{supported:!1},[t.DeviceModelId.NANO_SP]:{supported:!0,minOsVersion:"1.7.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.7.0-rc3"},[t.DeviceModelId.NANO_X]:{supported:!0,minOsVersion:"2.8.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"2.8.0-rc3"},[t.DeviceModelId.STAX]:{supported:!0,minOsVersion:"1.11.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.11.0-rc3"},[t.DeviceModelId.FLEX]:{supported:!0,minOsVersion:"1.7.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.7.0-rc3"},[t.DeviceModelId.APEX]:{supported:!0,minOsVersion:"1.2.0",minAppVersion:r,renameDerivationPathRequiredBelowOsVersion:"1.2.0-rc3"}})})}),describe("isVersionAtLeast",()=>{it("compares versions as semver, inclusive of equality",()=>{expect((0,e.isVersionAtLeast)("1.2.0","1.2.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.3.0","1.2.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.1.9","1.2.0")).toBe(!1)}),it("coerces non-strict version strings",()=>{expect((0,e.isVersionAtLeast)("1.2","1.2.0")).toBe(!0)}),it("returns false when a version cannot be parsed",()=>{expect((0,e.isVersionAtLeast)("not-a-version","1.2.0")).toBe(!1),expect((0,e.isVersionAtLeast)("1.2.0","not-a-version")).toBe(!1)}),it("ignores prerelease and build tags when comparing to the minimum",()=>{expect((0,e.isVersionAtLeast)("1.7.0-rc2","1.7.0")).toBe(!0),expect((0,e.isVersionAtLeast)("1.23.0-dev","1.23.0")).toBe(!0)}),it("still fails a minimum strictly above the tagged version's core",()=>{expect((0,e.isVersionAtLeast)("1.6.9-rc5","1.7.0")).toBe(!1)})}),describe("isVersionBelow",()=>{it("orders release candidates of the same core (unlike isVersionAtLeast)",()=>{expect((0,e.isVersionBelow)("1.7.0-rc2","1.7.0-rc3")).toBe(!0),expect((0,e.isVersionBelow)("1.7.0-rc3","1.7.0-rc3")).toBe(!1),expect((0,e.isVersionBelow)("1.7.0-rc4","1.7.0-rc3")).toBe(!1)}),it("treats the final release as newer than any of its prereleases",()=>{expect((0,e.isVersionBelow)("1.7.0","1.7.0-rc3")).toBe(!1)}),it("compares the release core when it differs",()=>{expect((0,e.isVersionBelow)("1.6.9","1.7.0-rc3")).toBe(!0),expect((0,e.isVersionBelow)("1.8.0","1.7.0-rc3")).toBe(!1)}),it("does not coerce, so a non-strict version is unparseable and returns false",()=>{expect((0,e.isVersionBelow)("1.7","1.7.0-rc3")).toBe(!1),expect((0,e.isVersionBelow)("not-a-version","1.7.0-rc3")).toBe(!1),expect((0,e.isVersionBelow)("1.7.0-rc2","not-a-version")).toBe(!1)})}),describe("renameRequiresDerivationPath",()=>{it("requires the path below the model's cutoff (rc2) and not at/after it",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.7.0-rc2")).toBe(!0),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.7.0-rc3")).toBe(!1),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.7.0")).toBe(!1),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"1.8.0")).toBe(!1)}),it("applies the same rc2/rc3 split to the other supported models",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.STAX,"1.11.0-rc2")).toBe(!0),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.STAX,"1.11.0-rc3")).toBe(!1),expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.NANO_SP,"1.7.0-rc2")).toBe(!0)}),it("returns false for an unsupported model",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.NANO_S,"1.7.0-rc2")).toBe(!1)}),it("returns false (no path) when the OS version is unparseable",()=>{expect((0,e.renameRequiresDerivationPath)(t.DeviceModelId.FLEX,"")).toBe(!1)})})});
2
2
  //# sourceMappingURL=ContactsVersionRequirements.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/model/ContactsVersionRequirements.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACTS_VERSION_REQUIREMENTS,\n type ContactsModelSupport,\n ETHEREUM_APP_NAME,\n isContactsSupported,\n isVersionAtLeast,\n resolveContactsVersionRequirements,\n} from \"./ContactsVersionRequirements\";\n\nconst BELOW_ANY_VERSION = \"0.0.1\";\nconst ABOVE_ANY_VERSION = \"999.0.0\";\n\nfunction supportOf(modelId: DeviceModelId): ContactsModelSupport {\n const requirement = resolveContactsVersionRequirements(modelId);\n if (!requirement.supported) {\n throw new Error(`expected ${modelId} to be supported in the test fixture`);\n }\n return requirement;\n}\n\nfunction ethAppVersionOf(support: ContactsModelSupport): string {\n const version = support.minAppVersion[ETHEREUM_APP_NAME];\n if (version === undefined) {\n throw new Error(\"expected an Ethereum minimum app version in the fixture\");\n }\n return version;\n}\n\ndescribe(\"ContactsVersionRequirements\", () => {\n describe(\"resolveContactsVersionRequirements\", () => {\n it(\"marks every device model, supported or not\", () => {\n for (const modelId of Object.values(DeviceModelId)) {\n expect(CONTACTS_VERSION_REQUIREMENTS[modelId]).toBeDefined();\n }\n });\n\n it(\"reports Nano models as unsupported\", () => {\n expect(resolveContactsVersionRequirements(DeviceModelId.NANO_S)).toEqual({\n supported: false,\n });\n expect(resolveContactsVersionRequirements(DeviceModelId.NANO_X)).toEqual({\n supported: false,\n });\n });\n\n it(\"reports touchscreen models as supported with OS and app minimums\", () => {\n const flex = supportOf(DeviceModelId.FLEX);\n expect(flex.minOsVersion).toEqual(expect.any(String));\n expect(ethAppVersionOf(flex)).toEqual(expect.any(String));\n });\n });\n\n describe(\"isContactsSupported\", () => {\n it(\"returns false for an unsupported device model\", () => {\n const flex = supportOf(DeviceModelId.FLEX);\n expect(\n isContactsSupported({\n deviceModelId: DeviceModelId.NANO_S,\n osVersion: ABOVE_ANY_VERSION,\n appName: ETHEREUM_APP_NAME,\n appVersion: ethAppVersionOf(flex),\n }),\n ).toBe(false);\n });\n\n // App-version requirement.\n it(\"gates on the minimum app version\", () => {\n const flex = supportOf(DeviceModelId.FLEX);\n const minAppVersion = ethAppVersionOf(flex);\n const base = {\n deviceModelId: DeviceModelId.FLEX,\n osVersion: flex.minOsVersion,\n appName: ETHEREUM_APP_NAME,\n };\n\n expect(\n isContactsSupported({ ...base, appVersion: BELOW_ANY_VERSION }),\n ).toBe(false);\n expect(isContactsSupported({ ...base, appVersion: minAppVersion })).toBe(\n true,\n );\n expect(\n isContactsSupported({ ...base, appVersion: ABOVE_ANY_VERSION }),\n ).toBe(true);\n });\n\n it(\"returns false for an app that is unknown to Contacts\", () => {\n const flex = supportOf(DeviceModelId.FLEX);\n expect(\n isContactsSupported({\n deviceModelId: DeviceModelId.FLEX,\n osVersion: flex.minOsVersion,\n appName: \"Bitcoin\",\n appVersion: ABOVE_ANY_VERSION,\n }),\n ).toBe(false);\n });\n\n // OS-version requirement.\n it(\"gates on the minimum OS version\", () => {\n const flex = supportOf(DeviceModelId.FLEX);\n const base = {\n deviceModelId: DeviceModelId.FLEX,\n appName: ETHEREUM_APP_NAME,\n appVersion: ethAppVersionOf(flex),\n };\n\n expect(\n isContactsSupported({ ...base, osVersion: BELOW_ANY_VERSION }),\n ).toBe(false);\n expect(\n isContactsSupported({ ...base, osVersion: flex.minOsVersion }),\n ).toBe(true);\n });\n });\n\n describe(\"isVersionAtLeast\", () => {\n it(\"compares versions as semver, inclusive of equality\", () => {\n expect(isVersionAtLeast(\"1.2.0\", \"1.2.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.3.0\", \"1.2.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.1.9\", \"1.2.0\")).toBe(false);\n });\n\n it(\"coerces non-strict version strings\", () => {\n expect(isVersionAtLeast(\"1.2\", \"1.2.0\")).toBe(true);\n });\n\n it(\"returns false when a version cannot be parsed\", () => {\n expect(isVersionAtLeast(\"not-a-version\", \"1.2.0\")).toBe(false);\n expect(isVersionAtLeast(\"1.2.0\", \"not-a-version\")).toBe(false);\n });\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAA8B,2CAE9BC,EAOO,yCAEP,MAAMC,EAAoB,QACpBC,EAAoB,UAE1B,SAASC,EAAUC,EAA8C,CAC/D,MAAMC,KAAc,sCAAmCD,CAAO,EAC9D,GAAI,CAACC,EAAY,UACf,MAAM,IAAI,MAAM,YAAYD,CAAO,sCAAsC,EAE3E,OAAOC,CACT,CAEA,SAASC,EAAgBC,EAAuC,CAC9D,MAAMC,EAAUD,EAAQ,cAAc,mBAAiB,EACvD,GAAIC,IAAY,OACd,MAAM,IAAI,MAAM,yDAAyD,EAE3E,OAAOA,CACT,CAEA,SAAS,8BAA+B,IAAM,CAC5C,SAAS,qCAAsC,IAAM,CACnD,GAAG,6CAA8C,IAAM,CACrD,UAAWJ,KAAW,OAAO,OAAO,eAAa,EAC/C,OAAO,gCAA8BA,CAAO,CAAC,EAAE,YAAY,CAE/D,CAAC,EAED,GAAG,qCAAsC,IAAM,CAC7C,UAAO,sCAAmC,gBAAc,MAAM,CAAC,EAAE,QAAQ,CACvE,UAAW,EACb,CAAC,EACD,UAAO,sCAAmC,gBAAc,MAAM,CAAC,EAAE,QAAQ,CACvE,UAAW,EACb,CAAC,CACH,CAAC,EAED,GAAG,mEAAoE,IAAM,CAC3E,MAAMK,EAAON,EAAU,gBAAc,IAAI,EACzC,OAAOM,EAAK,YAAY,EAAE,QAAQ,OAAO,IAAI,MAAM,CAAC,EACpD,OAAOH,EAAgBG,CAAI,CAAC,EAAE,QAAQ,OAAO,IAAI,MAAM,CAAC,CAC1D,CAAC,CACH,CAAC,EAED,SAAS,sBAAuB,IAAM,CACpC,GAAG,gDAAiD,IAAM,CACxD,MAAMA,EAAON,EAAU,gBAAc,IAAI,EACzC,UACE,uBAAoB,CAClB,cAAe,gBAAc,OAC7B,UAAWD,EACX,QAAS,oBACT,WAAYI,EAAgBG,CAAI,CAClC,CAAC,CACH,EAAE,KAAK,EAAK,CACd,CAAC,EAGD,GAAG,mCAAoC,IAAM,CAC3C,MAAMA,EAAON,EAAU,gBAAc,IAAI,EACnCO,EAAgBJ,EAAgBG,CAAI,EACpCE,EAAO,CACX,cAAe,gBAAc,KAC7B,UAAWF,EAAK,aAChB,QAAS,mBACX,EAEA,UACE,uBAAoB,CAAE,GAAGE,EAAM,WAAYV,CAAkB,CAAC,CAChE,EAAE,KAAK,EAAK,EACZ,UAAO,uBAAoB,CAAE,GAAGU,EAAM,WAAYD,CAAc,CAAC,CAAC,EAAE,KAClE,EACF,EACA,UACE,uBAAoB,CAAE,GAAGC,EAAM,WAAYT,CAAkB,CAAC,CAChE,EAAE,KAAK,EAAI,CACb,CAAC,EAED,GAAG,uDAAwD,IAAM,CAC/D,MAAMO,EAAON,EAAU,gBAAc,IAAI,EACzC,UACE,uBAAoB,CAClB,cAAe,gBAAc,KAC7B,UAAWM,EAAK,aAChB,QAAS,UACT,WAAYP,CACd,CAAC,CACH,EAAE,KAAK,EAAK,CACd,CAAC,EAGD,GAAG,kCAAmC,IAAM,CAC1C,MAAMO,EAAON,EAAU,gBAAc,IAAI,EACnCQ,EAAO,CACX,cAAe,gBAAc,KAC7B,QAAS,oBACT,WAAYL,EAAgBG,CAAI,CAClC,EAEA,UACE,uBAAoB,CAAE,GAAGE,EAAM,UAAWV,CAAkB,CAAC,CAC/D,EAAE,KAAK,EAAK,EACZ,UACE,uBAAoB,CAAE,GAAGU,EAAM,UAAWF,EAAK,YAAa,CAAC,CAC/D,EAAE,KAAK,EAAI,CACb,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,qDAAsD,IAAM,CAC7D,UAAO,oBAAiB,QAAS,OAAO,CAAC,EAAE,KAAK,EAAI,EACpD,UAAO,oBAAiB,QAAS,OAAO,CAAC,EAAE,KAAK,EAAI,EACpD,UAAO,oBAAiB,QAAS,OAAO,CAAC,EAAE,KAAK,EAAK,CACvD,CAAC,EAED,GAAG,qCAAsC,IAAM,CAC7C,UAAO,oBAAiB,MAAO,OAAO,CAAC,EAAE,KAAK,EAAI,CACpD,CAAC,EAED,GAAG,gDAAiD,IAAM,CACxD,UAAO,oBAAiB,gBAAiB,OAAO,CAAC,EAAE,KAAK,EAAK,EAC7D,UAAO,oBAAiB,QAAS,eAAe,CAAC,EAAE,KAAK,EAAK,CAC/D,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["import_device_management_kit", "import_ContactsVersionRequirements", "BELOW_ANY_VERSION", "ABOVE_ANY_VERSION", "supportOf", "modelId", "requirement", "ethAppVersionOf", "support", "version", "flex", "minAppVersion", "base"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACTS_VERSION_REQUIREMENTS,\n ETHEREUM_APP_NAME,\n isVersionAtLeast,\n isVersionBelow,\n renameRequiresDerivationPath,\n resolveContactsVersionRequirements,\n} from \"./ContactsVersionRequirements\";\n\ndescribe(\"ContactsVersionRequirements\", () => {\n describe(\"resolveContactsVersionRequirements\", () => {\n it(\"marks every device model, supported or not\", () => {\n for (const modelId of Object.values(DeviceModelId)) {\n expect(CONTACTS_VERSION_REQUIREMENTS[modelId]).toBeDefined();\n }\n });\n\n it(\"reports Nano S as unsupported\", () => {\n expect(resolveContactsVersionRequirements(DeviceModelId.NANO_S)).toEqual({\n supported: false,\n });\n });\n\n // Pins the minimums themselves, not just their shape: each OS version is\n // the release whose changelog introduces the Address Book feature, so a\n // change here has to be a deliberate one, reviewed against that release.\n it(\"pins the minimum OS and app versions of every supported model\", () => {\n const ethereum = { [ETHEREUM_APP_NAME]: \"1.23.0\" };\n\n expect(CONTACTS_VERSION_REQUIREMENTS).toEqual({\n [DeviceModelId.NANO_S]: { supported: false },\n [DeviceModelId.NANO_SP]: {\n supported: true,\n minOsVersion: \"1.7.0\",\n minAppVersion: ethereum,\n renameDerivationPathRequiredBelowOsVersion: \"1.7.0-rc3\",\n },\n [DeviceModelId.NANO_X]: {\n supported: true,\n minOsVersion: \"2.8.0\",\n minAppVersion: ethereum,\n renameDerivationPathRequiredBelowOsVersion: \"2.8.0-rc3\",\n },\n [DeviceModelId.STAX]: {\n supported: true,\n minOsVersion: \"1.11.0\",\n minAppVersion: ethereum,\n renameDerivationPathRequiredBelowOsVersion: \"1.11.0-rc3\",\n },\n [DeviceModelId.FLEX]: {\n supported: true,\n minOsVersion: \"1.7.0\",\n minAppVersion: ethereum,\n renameDerivationPathRequiredBelowOsVersion: \"1.7.0-rc3\",\n },\n [DeviceModelId.APEX]: {\n supported: true,\n minOsVersion: \"1.2.0\",\n minAppVersion: ethereum,\n renameDerivationPathRequiredBelowOsVersion: \"1.2.0-rc3\",\n },\n });\n });\n });\n\n describe(\"isVersionAtLeast\", () => {\n it(\"compares versions as semver, inclusive of equality\", () => {\n expect(isVersionAtLeast(\"1.2.0\", \"1.2.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.3.0\", \"1.2.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.1.9\", \"1.2.0\")).toBe(false);\n });\n\n it(\"coerces non-strict version strings\", () => {\n expect(isVersionAtLeast(\"1.2\", \"1.2.0\")).toBe(true);\n });\n\n it(\"returns false when a version cannot be parsed\", () => {\n expect(isVersionAtLeast(\"not-a-version\", \"1.2.0\")).toBe(false);\n expect(isVersionAtLeast(\"1.2.0\", \"not-a-version\")).toBe(false);\n });\n\n it(\"ignores prerelease and build tags when comparing to the minimum\", () => {\n expect(isVersionAtLeast(\"1.7.0-rc2\", \"1.7.0\")).toBe(true);\n expect(isVersionAtLeast(\"1.23.0-dev\", \"1.23.0\")).toBe(true);\n });\n\n it(\"still fails a minimum strictly above the tagged version's core\", () => {\n expect(isVersionAtLeast(\"1.6.9-rc5\", \"1.7.0\")).toBe(false);\n });\n });\n\n describe(\"isVersionBelow\", () => {\n it(\"orders release candidates of the same core (unlike isVersionAtLeast)\", () => {\n // The whole reason this helper exists: rc2 must sort below rc3.\n expect(isVersionBelow(\"1.7.0-rc2\", \"1.7.0-rc3\")).toBe(true);\n expect(isVersionBelow(\"1.7.0-rc3\", \"1.7.0-rc3\")).toBe(false);\n expect(isVersionBelow(\"1.7.0-rc4\", \"1.7.0-rc3\")).toBe(false);\n });\n\n it(\"treats the final release as newer than any of its prereleases\", () => {\n expect(isVersionBelow(\"1.7.0\", \"1.7.0-rc3\")).toBe(false);\n });\n\n it(\"compares the release core when it differs\", () => {\n expect(isVersionBelow(\"1.6.9\", \"1.7.0-rc3\")).toBe(true);\n expect(isVersionBelow(\"1.8.0\", \"1.7.0-rc3\")).toBe(false);\n });\n\n it(\"does not coerce, so a non-strict version is unparseable and returns false\", () => {\n expect(isVersionBelow(\"1.7\", \"1.7.0-rc3\")).toBe(false);\n expect(isVersionBelow(\"not-a-version\", \"1.7.0-rc3\")).toBe(false);\n expect(isVersionBelow(\"1.7.0-rc2\", \"not-a-version\")).toBe(false);\n });\n });\n\n describe(\"renameRequiresDerivationPath\", () => {\n it(\"requires the path below the model's cutoff (rc2) and not at/after it\", () => {\n expect(\n renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.7.0-rc2\"),\n ).toBe(true);\n expect(\n renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.7.0-rc3\"),\n ).toBe(false);\n // GA and later never want the path.\n expect(renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.7.0\")).toBe(\n false,\n );\n expect(renameRequiresDerivationPath(DeviceModelId.FLEX, \"1.8.0\")).toBe(\n false,\n );\n });\n\n it(\"applies the same rc2/rc3 split to the other supported models\", () => {\n expect(\n renameRequiresDerivationPath(DeviceModelId.STAX, \"1.11.0-rc2\"),\n ).toBe(true);\n expect(\n renameRequiresDerivationPath(DeviceModelId.STAX, \"1.11.0-rc3\"),\n ).toBe(false);\n expect(\n renameRequiresDerivationPath(DeviceModelId.NANO_SP, \"1.7.0-rc2\"),\n ).toBe(true);\n });\n\n it(\"returns false for an unsupported model\", () => {\n expect(\n renameRequiresDerivationPath(DeviceModelId.NANO_S, \"1.7.0-rc2\"),\n ).toBe(false);\n });\n\n it(\"returns false (no path) when the OS version is unparseable\", () => {\n expect(renameRequiresDerivationPath(DeviceModelId.FLEX, \"\")).toBe(false);\n });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAA8B,2CAE9BC,EAOO,yCAEP,SAAS,8BAA+B,IAAM,CAC5C,SAAS,qCAAsC,IAAM,CACnD,GAAG,6CAA8C,IAAM,CACrD,UAAWC,KAAW,OAAO,OAAO,eAAa,EAC/C,OAAO,gCAA8BA,CAAO,CAAC,EAAE,YAAY,CAE/D,CAAC,EAED,GAAG,gCAAiC,IAAM,CACxC,UAAO,sCAAmC,gBAAc,MAAM,CAAC,EAAE,QAAQ,CACvE,UAAW,EACb,CAAC,CACH,CAAC,EAKD,GAAG,gEAAiE,IAAM,CACxE,MAAMC,EAAW,CAAE,CAAC,mBAAiB,EAAG,QAAS,EAEjD,OAAO,+BAA6B,EAAE,QAAQ,CAC5C,CAAC,gBAAc,MAAM,EAAG,CAAE,UAAW,EAAM,EAC3C,CAAC,gBAAc,OAAO,EAAG,CACvB,UAAW,GACX,aAAc,QACd,cAAeA,EACf,2CAA4C,WAC9C,EACA,CAAC,gBAAc,MAAM,EAAG,CACtB,UAAW,GACX,aAAc,QACd,cAAeA,EACf,2CAA4C,WAC9C,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAc,SACd,cAAeA,EACf,2CAA4C,YAC9C,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAc,QACd,cAAeA,EACf,2CAA4C,WAC9C,EACA,CAAC,gBAAc,IAAI,EAAG,CACpB,UAAW,GACX,aAAc,QACd,cAAeA,EACf,2CAA4C,WAC9C,CACF,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,mBAAoB,IAAM,CACjC,GAAG,qDAAsD,IAAM,CAC7D,UAAO,oBAAiB,QAAS,OAAO,CAAC,EAAE,KAAK,EAAI,EACpD,UAAO,oBAAiB,QAAS,OAAO,CAAC,EAAE,KAAK,EAAI,EACpD,UAAO,oBAAiB,QAAS,OAAO,CAAC,EAAE,KAAK,EAAK,CACvD,CAAC,EAED,GAAG,qCAAsC,IAAM,CAC7C,UAAO,oBAAiB,MAAO,OAAO,CAAC,EAAE,KAAK,EAAI,CACpD,CAAC,EAED,GAAG,gDAAiD,IAAM,CACxD,UAAO,oBAAiB,gBAAiB,OAAO,CAAC,EAAE,KAAK,EAAK,EAC7D,UAAO,oBAAiB,QAAS,eAAe,CAAC,EAAE,KAAK,EAAK,CAC/D,CAAC,EAED,GAAG,kEAAmE,IAAM,CAC1E,UAAO,oBAAiB,YAAa,OAAO,CAAC,EAAE,KAAK,EAAI,EACxD,UAAO,oBAAiB,aAAc,QAAQ,CAAC,EAAE,KAAK,EAAI,CAC5D,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,UAAO,oBAAiB,YAAa,OAAO,CAAC,EAAE,KAAK,EAAK,CAC3D,CAAC,CACH,CAAC,EAED,SAAS,iBAAkB,IAAM,CAC/B,GAAG,uEAAwE,IAAM,CAE/E,UAAO,kBAAe,YAAa,WAAW,CAAC,EAAE,KAAK,EAAI,EAC1D,UAAO,kBAAe,YAAa,WAAW,CAAC,EAAE,KAAK,EAAK,EAC3D,UAAO,kBAAe,YAAa,WAAW,CAAC,EAAE,KAAK,EAAK,CAC7D,CAAC,EAED,GAAG,gEAAiE,IAAM,CACxE,UAAO,kBAAe,QAAS,WAAW,CAAC,EAAE,KAAK,EAAK,CACzD,CAAC,EAED,GAAG,4CAA6C,IAAM,CACpD,UAAO,kBAAe,QAAS,WAAW,CAAC,EAAE,KAAK,EAAI,EACtD,UAAO,kBAAe,QAAS,WAAW,CAAC,EAAE,KAAK,EAAK,CACzD,CAAC,EAED,GAAG,4EAA6E,IAAM,CACpF,UAAO,kBAAe,MAAO,WAAW,CAAC,EAAE,KAAK,EAAK,EACrD,UAAO,kBAAe,gBAAiB,WAAW,CAAC,EAAE,KAAK,EAAK,EAC/D,UAAO,kBAAe,YAAa,eAAe,CAAC,EAAE,KAAK,EAAK,CACjE,CAAC,CACH,CAAC,EAED,SAAS,+BAAgC,IAAM,CAC7C,GAAG,uEAAwE,IAAM,CAC/E,UACE,gCAA6B,gBAAc,KAAM,WAAW,CAC9D,EAAE,KAAK,EAAI,EACX,UACE,gCAA6B,gBAAc,KAAM,WAAW,CAC9D,EAAE,KAAK,EAAK,EAEZ,UAAO,gCAA6B,gBAAc,KAAM,OAAO,CAAC,EAAE,KAChE,EACF,EACA,UAAO,gCAA6B,gBAAc,KAAM,OAAO,CAAC,EAAE,KAChE,EACF,CACF,CAAC,EAED,GAAG,+DAAgE,IAAM,CACvE,UACE,gCAA6B,gBAAc,KAAM,YAAY,CAC/D,EAAE,KAAK,EAAI,EACX,UACE,gCAA6B,gBAAc,KAAM,YAAY,CAC/D,EAAE,KAAK,EAAK,EACZ,UACE,gCAA6B,gBAAc,QAAS,WAAW,CACjE,EAAE,KAAK,EAAI,CACb,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,UACE,gCAA6B,gBAAc,OAAQ,WAAW,CAChE,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,6DAA8D,IAAM,CACrE,UAAO,gCAA6B,gBAAc,KAAM,EAAE,CAAC,EAAE,KAAK,EAAK,CACzE,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_ContactsVersionRequirements", "modelId", "ethereum"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var l=(n,r,t,e)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of y(r))!d.call(n,a)&&a!==t&&o(n,a,{get:()=>r[a],enumerable:!(e=i(r,a))||e.enumerable});return n};var c=n=>l(o({},"__esModule",{value:!0}),n);var g={};module.exports=c(g);
2
+ //# sourceMappingURL=ProvideContact.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/api/model/ProvideContact.ts"],
4
+ "sourcesContent": ["/**\n * Everything the device needs to accept a registered external contact as a\n * decoration for an upcoming signing flow: the name-level material shared by\n * the whole contact group, plus the address-level material of the one matched\n * address.\n */\nexport type ProvideContactInput = {\n readonly contactName: string;\n readonly scope: string;\n /** Raw bytes, chain-dependent: a 20-byte address for Ethereum. */\n readonly identifier: Uint8Array;\n readonly groupHandle: Uint8Array;\n readonly hmacProof: Uint8Array;\n readonly hmacRest: Uint8Array;\n /** Lowercase family name, e.g. `\"ethereum\"`. */\n readonly blockchainFamily: string;\n /** Mandatory for Ethereum, omitted for every other family. */\n readonly chainId?: bigint;\n};\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["ProvideContact_exports", "__toCommonJS"]
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/model/RenameContact.ts"],
4
- "sourcesContent": ["/**\n * Public input/output types for `ContactsManager.renameContact`.\n *\n * Rename (EDIT CONTACT NAME) is a blockchain-agnostic OS/dashboard operation:\n * it rotates the contact-level `hmacProof` (the device's `hmac_name`) and\n * returns the fresh proof. The per-entry `hmacRest` values are untouched \u2014 they\n * bind scope/identifier/family/chainId, never the name \u2014 so only the group's\n * name proof needs re-persisting.\n *\n * Proof material (`groupHandle`, `hmacProof`) is passed and returned as raw\n * bytes; the host owns persistence and address-book state. `derivationPath` is\n * kit-internal and not exposed: the Ethereum app requires a path on the wire\n * (a default m/44'/60'/0'/0/0 is sent), but the rename itself is name-only.\n */\n\nexport type RenameContactInput = {\n /** The contact's current name, proven to the device via `hmacProof`. */\n readonly previousContactName: string;\n /** The new name to assign to the contact group. */\n readonly newContactName: string;\n /** 64-byte group handle returned by the group's Register Identity. */\n readonly groupHandle: Uint8Array;\n /**\n * The existing 32-byte name proof (device `hmac_name`) bound to the current\n * name \u2014 passed back so the device can verify continuity before approving the\n * rename. Replaced by the returned `hmacProof` on success.\n */\n readonly hmacProof: Uint8Array;\n};\n\nexport type RenameContactOutput = {\n /** Echoed previous name, for the host to locate the entry it is replacing. */\n readonly previousContactName: string;\n /** The new name now bound to the contact group. */\n readonly contactName: string;\n /** Echoed group handle, unchanged by the rename. */\n readonly groupHandle: Uint8Array;\n /** The replacement group-level name proof (rotated `hmac_name`) to persist. */\n readonly hmacProof: Uint8Array;\n};\n"],
4
+ "sourcesContent": ["/**\n * Public input/output types for `ContactsManager.renameContact`.\n *\n * Rename (EDIT CONTACT NAME) is a blockchain-agnostic OS/dashboard operation:\n * it rotates the contact-level `hmacProof` (the device's `hmac_name`) and\n * returns the fresh proof. The per-entry `hmacRest` values are untouched \u2014 they\n * bind scope/identifier/family/chainId, never the name \u2014 so only the group's\n * name proof needs re-persisting.\n *\n * Proof material (`groupHandle`, `hmacProof`) is passed and returned as raw\n * bytes; the host owns persistence and address-book state. The rename itself is\n * name-only, so no derivation path is exposed. As a temporary compatibility\n * shim (DSDK-1481), the kit sends a fixed `m/44'/60'/0'/0/0` on the wire only\n * for OS builds below the model's cutoff, which still mandate it; newer builds\n * send nothing. Either way the host never chooses this.\n */\n\nexport type RenameContactInput = {\n /** The contact's current name, proven to the device via `hmacProof`. */\n readonly previousContactName: string;\n /** The new name to assign to the contact group. */\n readonly newContactName: string;\n /** 64-byte group handle returned by the group's Register Identity. */\n readonly groupHandle: Uint8Array;\n /**\n * The existing 32-byte name proof (device `hmac_name`) bound to the current\n * name \u2014 passed back so the device can verify continuity before approving the\n * rename. Replaced by the returned `hmacProof` on success.\n */\n readonly hmacProof: Uint8Array;\n};\n\nexport type RenameContactOutput = {\n /** Echoed previous name, for the host to locate the entry it is replacing. */\n readonly previousContactName: string;\n /** The new name now bound to the contact group. */\n readonly contactName: string;\n /** Echoed group handle, unchanged by the rename. */\n readonly groupHandle: Uint8Array;\n /** The replacement group-level name proof (rotated `hmac_name`) to persist. */\n readonly hmacProof: Uint8Array;\n};\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["RenameContact_exports", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var f=(d,r)=>{for(var t in r)i(d,t,{get:r[t],enumerable:!0})},c=(d,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of C(r))!A.call(d,n)&&n!==t&&i(d,n,{get:()=>r[n],enumerable:!(a=u(r,n))||a.enumerable});return d};var y=d=>c(i({},"__esModule",{value:!0}),d);var T={};f(T,{EditExternalAddressIdentifierCommand:()=>R});module.exports=y(T);var e=require("@ledgerhq/device-management-kit"),p=require("@ledgerhq/signer-utils"),E=require("purify-ts"),o=require("../../app-binder/model/contactsConstants"),s=require("../../app-binder/model/contactsErrors"),l=require("../../app-binder/services/contactsTlvSerializer");const m=l.STRUCT_TYPE_EDIT_IDENTIFIER;function I(d,r){const t=d.extractFieldByLength(r);if(!(!t||t.length!==r))return Uint8Array.from(t)}class R{name="editExternalAddressIdentifier";args;errorHelper=new p.CommandErrorHelper(s.CONTACTS_APP_ERRORS,s.contactsCommandErrorFactory);constructor(r){this.args=r}getApdu(){return new e.ApduBuilder({cla:o.CONTACTS_APDU_CLA,ins:o.CONTACTS_APDU_INS,p1:o.SUB_CMD_EDIT_IDENTIFIER,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(r){return E.Maybe.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{if(r.data.length===0)return(0,e.CommandResultFactory)({data:{}});const t=new e.ApduParser(r),a=t.extract8BitUInt();if(a!==m)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError(`Expected struct_type 0x${m.toString(16)}, got ${a===void 0?"undefined":`0x${a.toString(16)}`}`)});const n=I(t,o.HMAC_REST_BYTES);return n?(0,e.CommandResultFactory)({data:{hmacRest:n}}):(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_rest missing or truncated")})})}}0&&(module.exports={EditExternalAddressIdentifierCommand});
1
+ "use strict";var s=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var C=(d,r)=>{for(var t in r)s(d,t,{get:r[t],enumerable:!0})},f=(d,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of u(r))!A.call(d,n)&&n!==t&&s(d,n,{get:()=>r[n],enumerable:!(o=l(r,n))||o.enumerable});return d};var c=d=>f(s({},"__esModule",{value:!0}),d);var x={};C(x,{EditExternalAddressIdentifierCommand:()=>I});module.exports=c(x);var e=require("@ledgerhq/device-management-kit"),m=require("purify-ts"),a=require("../../app-binder/model/contactsConstants"),p=require("../../app-binder/model/contactsErrors"),E=require("../../app-binder/services/contactsTlvSerializer");const i=E.STRUCT_TYPE_EDIT_IDENTIFIER;function y(d,r){const t=d.extractFieldByLength(r);if(!(!t||t.length!==r))return Uint8Array.from(t)}class I{name="editExternalAddressIdentifier";args;errorHelper=new p.ContactsCommandErrorHelper;constructor(r){this.args=r}getApdu(){return new e.ApduBuilder({cla:a.CONTACTS_APDU_CLA,ins:a.CONTACTS_APDU_INS,p1:a.SUB_CMD_EDIT_IDENTIFIER,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(r){return m.Maybe.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{if(r.data.length===0)return(0,e.CommandResultFactory)({data:{}});const t=new e.ApduParser(r),o=t.extract8BitUInt();if(o!==i)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError(`Expected struct_type 0x${i.toString(16)}, got ${o===void 0?"undefined":`0x${o.toString(16)}`}`)});const n=y(t,a.HMAC_REST_BYTES);return n?(0,e.CommandResultFactory)({data:{hmacRest:n}}):(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_rest missing or truncated")})})}}0&&(module.exports={EditExternalAddressIdentifierCommand});
2
2
  //# sourceMappingURL=EditExternalAddressIdentifierCommand.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/EditExternalAddressIdentifierCommand.ts"],
4
- "sourcesContent": ["// Edit Identifier \u2014 sub-command P1=0x03 of the address-book APDU (CLA 0xB0 /\n// INS 0x10). Frames one chunk; on the final chunk parses the 33-byte response\n// struct_type(0x31) + hmac_rest(32) (the rotated address-level proof).\n// Intermediate chunks ack SW=0x9000 with no data. SW 0x6982 = seed/handle\n// mismatch, surfaced via the shared error helper before any device UI.\n// Protocol: Address Book Final Specifications \u2014 Edit Identifier.\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n CONTACTS_APDU_CLA,\n CONTACTS_APDU_INS,\n HMAC_REST_BYTES,\n SUB_CMD_EDIT_IDENTIFIER,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport {\n CONTACTS_APP_ERRORS,\n contactsCommandErrorFactory,\n type ContactsErrorCodes,\n} from \"@internal/app-binder/model/contactsErrors\";\nimport { STRUCT_TYPE_EDIT_IDENTIFIER } from \"@internal/app-binder/services/contactsTlvSerializer\";\n\nexport type EditExternalAddressIdentifierCommandArgs = {\n /** One framed chunk built by sendFramedContactsPayload. */\n readonly data: Uint8Array;\n /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */\n readonly p2: number;\n};\n\nexport type EditExternalAddressIdentifierCommandResponse = {\n /**\n * Present only on the final chunk \u2014 the device returns struct_type(0x31) +\n * hmac_rest(32) there. Intermediate chunks return SW=0x9000 with no data.\n * This is the replacement address-level proof (rotated `hmac_rest`).\n */\n readonly hmacRest?: Uint8Array;\n};\n\nconst RESPONSE_STRUCT_TYPE = STRUCT_TYPE_EDIT_IDENTIFIER;\n\n/**\n * Extract `length` bytes as a freshly-owned plain `Uint8Array` (the parser may\n * hand back a `Buffer` view backed by the response), or `undefined` if the\n * response is too short.\n */\nfunction extractField(\n parser: ApduParser,\n length: number,\n): Uint8Array | undefined {\n const field = parser.extractFieldByLength(length);\n if (!field || field.length !== length) return undefined;\n return Uint8Array.from(field);\n}\n\nexport class EditExternalAddressIdentifierCommand\n implements\n Command<\n EditExternalAddressIdentifierCommandResponse,\n EditExternalAddressIdentifierCommandArgs,\n ContactsErrorCodes\n >\n{\n readonly name = \"editExternalAddressIdentifier\";\n readonly args: EditExternalAddressIdentifierCommandArgs;\n private readonly errorHelper = new CommandErrorHelper<\n EditExternalAddressIdentifierCommandResponse,\n ContactsErrorCodes\n >(CONTACTS_APP_ERRORS, contactsCommandErrorFactory);\n\n constructor(args: EditExternalAddressIdentifierCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CONTACTS_APDU_CLA,\n ins: CONTACTS_APDU_INS,\n p1: SUB_CMD_EDIT_IDENTIFIER,\n p2: this.args.p2,\n })\n .addBufferToData(this.args.data)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<\n EditExternalAddressIdentifierCommandResponse,\n ContactsErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n if (response.data.length === 0) {\n // Intermediate chunk \u2014 device acks with SW=0x9000 and no payload.\n return CommandResultFactory({ data: {} });\n }\n\n const parser = new ApduParser(response);\n\n const structType = parser.extract8BitUInt();\n if (structType !== RESPONSE_STRUCT_TYPE) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Expected struct_type 0x${RESPONSE_STRUCT_TYPE.toString(16)}, got ${\n structType === undefined\n ? \"undefined\"\n : `0x${structType.toString(16)}`\n }`,\n ),\n });\n }\n\n const hmacRest = extractField(parser, HMAC_REST_BYTES);\n if (!hmacRest) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_rest missing or truncated\"),\n });\n }\n\n return CommandResultFactory({\n data: { hmacRest },\n });\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0CAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EASO,2CACPC,EAAmC,kCACnCC,EAAsB,qBAEtBC,EAKO,wDACPC,EAIO,qDACPC,EAA4C,+DAkB5C,MAAMC,EAAuB,8BAO7B,SAASC,EACPC,EACAC,EACwB,CACxB,MAAMC,EAAQF,EAAO,qBAAqBC,CAAM,EAChD,GAAI,GAACC,GAASA,EAAM,SAAWD,GAC/B,OAAO,WAAW,KAAKC,CAAK,CAC9B,CAEO,MAAMZ,CAOb,CACW,KAAO,gCACP,KACQ,YAAc,IAAI,qBAGjC,sBAAqB,6BAA2B,EAElD,YAAYa,EAAgD,CAC1D,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAI,cAAY,CACrB,IAAK,oBACL,IAAK,oBACL,GAAI,0BACJ,GAAI,KAAK,KAAK,EAChB,CAAC,EACE,gBAAgB,KAAK,KAAK,IAAI,EAC9B,MAAM,CACX,CAEA,cACEC,EAIA,CACA,OAAO,QAAM,aACX,KAAK,YAAY,SAASA,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,GAAIA,EAAS,KAAK,SAAW,EAE3B,SAAO,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,EAG1C,MAAMJ,EAAS,IAAI,aAAWI,CAAQ,EAEhCC,EAAaL,EAAO,gBAAgB,EAC1C,GAAIK,IAAeP,EACjB,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0BAA0BA,EAAqB,SAAS,EAAE,CAAC,SACzDO,IAAe,OACX,YACA,KAAKA,EAAW,SAAS,EAAE,CAAC,EAClC,EACF,CACF,CAAC,EAGH,MAAMC,EAAWP,EAAaC,EAAQ,iBAAe,EACrD,OAAKM,KAME,wBAAqB,CAC1B,KAAM,CAAE,SAAAA,CAAS,CACnB,CAAC,KAPQ,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,CAML,CAAC,CACH,CACF",
6
- "names": ["EditExternalAddressIdentifierCommand_exports", "__export", "EditExternalAddressIdentifierCommand", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_purify_ts", "import_contactsConstants", "import_contactsErrors", "import_contactsTlvSerializer", "RESPONSE_STRUCT_TYPE", "extractField", "parser", "length", "field", "args", "response", "structType", "hmacRest"]
4
+ "sourcesContent": ["// Edit Identifier \u2014 sub-command P1=0x03 of the address-book APDU (CLA 0xB0 /\n// INS 0x10). Frames one chunk; on the final chunk parses the 33-byte response\n// struct_type(0x31) + hmac_rest(32) (the rotated address-level proof).\n// Intermediate chunks ack SW=0x9000 with no data. SW 0x6982 = seed/handle\n// mismatch, surfaced via the shared error helper before any device UI.\n// Protocol: Address Book Final Specifications \u2014 Edit Identifier.\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n CONTACTS_APDU_CLA,\n CONTACTS_APDU_INS,\n HMAC_REST_BYTES,\n SUB_CMD_EDIT_IDENTIFIER,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport {\n ContactsCommandErrorHelper,\n type ContactsErrorCodes,\n} from \"@internal/app-binder/model/contactsErrors\";\nimport { STRUCT_TYPE_EDIT_IDENTIFIER } from \"@internal/app-binder/services/contactsTlvSerializer\";\n\nexport type EditExternalAddressIdentifierCommandArgs = {\n /** One framed chunk built by sendFramedContactsPayload. */\n readonly data: Uint8Array;\n /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */\n readonly p2: number;\n};\n\nexport type EditExternalAddressIdentifierCommandResponse = {\n /**\n * Present only on the final chunk \u2014 the device returns struct_type(0x31) +\n * hmac_rest(32) there. Intermediate chunks return SW=0x9000 with no data.\n * This is the replacement address-level proof (rotated `hmac_rest`).\n */\n readonly hmacRest?: Uint8Array;\n};\n\nconst RESPONSE_STRUCT_TYPE = STRUCT_TYPE_EDIT_IDENTIFIER;\n\n/**\n * Extract `length` bytes as a freshly-owned plain `Uint8Array` (the parser may\n * hand back a `Buffer` view backed by the response), or `undefined` if the\n * response is too short.\n */\nfunction extractField(\n parser: ApduParser,\n length: number,\n): Uint8Array | undefined {\n const field = parser.extractFieldByLength(length);\n if (!field || field.length !== length) return undefined;\n return Uint8Array.from(field);\n}\n\nexport class EditExternalAddressIdentifierCommand\n implements\n Command<\n EditExternalAddressIdentifierCommandResponse,\n EditExternalAddressIdentifierCommandArgs,\n ContactsErrorCodes\n >\n{\n readonly name = \"editExternalAddressIdentifier\";\n readonly args: EditExternalAddressIdentifierCommandArgs;\n private readonly errorHelper =\n new ContactsCommandErrorHelper<EditExternalAddressIdentifierCommandResponse>();\n\n constructor(args: EditExternalAddressIdentifierCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CONTACTS_APDU_CLA,\n ins: CONTACTS_APDU_INS,\n p1: SUB_CMD_EDIT_IDENTIFIER,\n p2: this.args.p2,\n })\n .addBufferToData(this.args.data)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<\n EditExternalAddressIdentifierCommandResponse,\n ContactsErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n if (response.data.length === 0) {\n // Intermediate chunk \u2014 device acks with SW=0x9000 and no payload.\n return CommandResultFactory({ data: {} });\n }\n\n const parser = new ApduParser(response);\n\n const structType = parser.extract8BitUInt();\n if (structType !== RESPONSE_STRUCT_TYPE) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Expected struct_type 0x${RESPONSE_STRUCT_TYPE.toString(16)}, got ${\n structType === undefined\n ? \"undefined\"\n : `0x${structType.toString(16)}`\n }`,\n ),\n });\n }\n\n const hmacRest = extractField(parser, HMAC_REST_BYTES);\n if (!hmacRest) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_rest missing or truncated\"),\n });\n }\n\n return CommandResultFactory({\n data: { hmacRest },\n });\n });\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0CAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EASO,2CACPC,EAAsB,qBAEtBC,EAKO,wDACPC,EAGO,qDACPC,EAA4C,+DAkB5C,MAAMC,EAAuB,8BAO7B,SAASC,EACPC,EACAC,EACwB,CACxB,MAAMC,EAAQF,EAAO,qBAAqBC,CAAM,EAChD,GAAI,GAACC,GAASA,EAAM,SAAWD,GAC/B,OAAO,WAAW,KAAKC,CAAK,CAC9B,CAEO,MAAMX,CAOb,CACW,KAAO,gCACP,KACQ,YACf,IAAI,6BAEN,YAAYY,EAAgD,CAC1D,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAI,cAAY,CACrB,IAAK,oBACL,IAAK,oBACL,GAAI,0BACJ,GAAI,KAAK,KAAK,EAChB,CAAC,EACE,gBAAgB,KAAK,KAAK,IAAI,EAC9B,MAAM,CACX,CAEA,cACEC,EAIA,CACA,OAAO,QAAM,aACX,KAAK,YAAY,SAASA,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,GAAIA,EAAS,KAAK,SAAW,EAE3B,SAAO,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,EAG1C,MAAMJ,EAAS,IAAI,aAAWI,CAAQ,EAEhCC,EAAaL,EAAO,gBAAgB,EAC1C,GAAIK,IAAeP,EACjB,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0BAA0BA,EAAqB,SAAS,EAAE,CAAC,SACzDO,IAAe,OACX,YACA,KAAKA,EAAW,SAAS,EAAE,CAAC,EAClC,EACF,CACF,CAAC,EAGH,MAAMC,EAAWP,EAAaC,EAAQ,iBAAe,EACrD,OAAKM,KAME,wBAAqB,CAC1B,KAAM,CAAE,SAAAA,CAAS,CACnB,CAAC,KAPQ,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,CAML,CAAC,CACH,CACF",
6
+ "names": ["EditExternalAddressIdentifierCommand_exports", "__export", "EditExternalAddressIdentifierCommand", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_contactsConstants", "import_contactsErrors", "import_contactsTlvSerializer", "RESPONSE_STRUCT_TYPE", "extractField", "parser", "length", "field", "args", "response", "structType", "hmacRest"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var m=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var A=(o,r)=>{for(var t in r)m(o,t,{get:r[t],enumerable:!0})},S=(o,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of l(r))!u.call(o,d)&&d!==t&&m(o,d,{get:()=>r[d],enumerable:!(a=C(r,d))||a.enumerable});return o};var y=o=>S(m({},"__esModule",{value:!0}),o);var R={};A(R,{EditExternalAddressScopeCommand:()=>x});module.exports=y(R);var e=require("@ledgerhq/device-management-kit"),i=require("@ledgerhq/signer-utils"),E=require("purify-ts"),n=require("../../app-binder/model/contactsConstants"),s=require("../../app-binder/model/contactsErrors"),c=require("../../app-binder/services/contactsTlvSerializer");const p=c.STRUCT_TYPE_EDIT_SCOPE;function f(o,r){const t=o.extractFieldByLength(r);if(!(!t||t.length!==r))return Uint8Array.from(t)}class x{name="editExternalAddressScope";args;errorHelper=new i.CommandErrorHelper(s.CONTACTS_APP_ERRORS,s.contactsCommandErrorFactory);constructor(r){this.args=r}getApdu(){return new e.ApduBuilder({cla:n.CONTACTS_APDU_CLA,ins:n.CONTACTS_APDU_INS,p1:n.SUB_CMD_EDIT_SCOPE,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(r){return E.Maybe.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{if(r.data.length===0)return(0,e.CommandResultFactory)({data:{}});const t=new e.ApduParser(r),a=t.extract8BitUInt();if(a!==p)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError(`Expected struct_type 0x${p.toString(16)}, got ${a===void 0?"undefined":`0x${a.toString(16)}`}`)});const d=f(t,n.HMAC_REST_BYTES);return d?(0,e.CommandResultFactory)({data:{hmacRest:d}}):(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_rest missing or truncated")})})}}0&&(module.exports={EditExternalAddressScopeCommand});
1
+ "use strict";var s=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var C=(d,r)=>{for(var t in r)s(d,t,{get:r[t],enumerable:!0})},A=(d,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of E(r))!c.call(d,n)&&n!==t&&s(d,n,{get:()=>r[n],enumerable:!(a=u(r,n))||a.enumerable});return d};var S=d=>A(s({},"__esModule",{value:!0}),d);var x={};C(x,{EditExternalAddressScopeCommand:()=>f});module.exports=S(x);var e=require("@ledgerhq/device-management-kit"),m=require("purify-ts"),o=require("../../app-binder/model/contactsConstants"),i=require("../../app-binder/model/contactsErrors"),l=require("../../app-binder/services/contactsTlvSerializer");const p=l.STRUCT_TYPE_EDIT_SCOPE;function y(d,r){const t=d.extractFieldByLength(r);if(!(!t||t.length!==r))return Uint8Array.from(t)}class f{name="editExternalAddressScope";args;errorHelper=new i.ContactsCommandErrorHelper;constructor(r){this.args=r}getApdu(){return new e.ApduBuilder({cla:o.CONTACTS_APDU_CLA,ins:o.CONTACTS_APDU_INS,p1:o.SUB_CMD_EDIT_SCOPE,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(r){return m.Maybe.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{if(r.data.length===0)return(0,e.CommandResultFactory)({data:{}});const t=new e.ApduParser(r),a=t.extract8BitUInt();if(a!==p)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError(`Expected struct_type 0x${p.toString(16)}, got ${a===void 0?"undefined":`0x${a.toString(16)}`}`)});const n=y(t,o.HMAC_REST_BYTES);return n?(0,e.CommandResultFactory)({data:{hmacRest:n}}):(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_rest missing or truncated")})})}}0&&(module.exports={EditExternalAddressScopeCommand});
2
2
  //# sourceMappingURL=EditExternalAddressScopeCommand.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/EditExternalAddressScopeCommand.ts"],
4
- "sourcesContent": ["// Edit Scope \u2014 sub-command P1=0x04 of the address-book APDU (CLA 0xB0 /\n// INS 0x10). Frames one chunk; on the final chunk parses the 33-byte response\n// struct_type(0x32) + hmac_rest(32) (the rotated address-level proof).\n// Intermediate chunks ack SW=0x9000 with no data. SW 0x6982 = seed/handle\n// mismatch, surfaced via the shared error helper before any device UI.\n// Protocol: Address Book Final Specifications \u2014 Edit Scope.\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n CONTACTS_APDU_CLA,\n CONTACTS_APDU_INS,\n HMAC_REST_BYTES,\n SUB_CMD_EDIT_SCOPE,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport {\n CONTACTS_APP_ERRORS,\n contactsCommandErrorFactory,\n type ContactsErrorCodes,\n} from \"@internal/app-binder/model/contactsErrors\";\nimport { STRUCT_TYPE_EDIT_SCOPE } from \"@internal/app-binder/services/contactsTlvSerializer\";\n\nexport type EditExternalAddressScopeCommandArgs = {\n /** One framed chunk built by sendFramedContactsPayload. */\n readonly data: Uint8Array;\n /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */\n readonly p2: number;\n};\n\nexport type EditExternalAddressScopeCommandResponse = {\n /**\n * Present only on the final chunk \u2014 the device returns struct_type(0x32) +\n * hmac_rest(32) there. Intermediate chunks return SW=0x9000 with no data.\n * This is the replacement address-level proof (rotated `hmac_rest`).\n */\n readonly hmacRest?: Uint8Array;\n};\n\nconst RESPONSE_STRUCT_TYPE = STRUCT_TYPE_EDIT_SCOPE;\n\n/**\n * Extract `length` bytes as a freshly-owned plain `Uint8Array` (the parser may\n * hand back a `Buffer` view backed by the response), or `undefined` if the\n * response is too short.\n */\nfunction extractField(\n parser: ApduParser,\n length: number,\n): Uint8Array | undefined {\n const field = parser.extractFieldByLength(length);\n if (!field || field.length !== length) return undefined;\n return Uint8Array.from(field);\n}\n\nexport class EditExternalAddressScopeCommand\n implements\n Command<\n EditExternalAddressScopeCommandResponse,\n EditExternalAddressScopeCommandArgs,\n ContactsErrorCodes\n >\n{\n readonly name = \"editExternalAddressScope\";\n readonly args: EditExternalAddressScopeCommandArgs;\n private readonly errorHelper = new CommandErrorHelper<\n EditExternalAddressScopeCommandResponse,\n ContactsErrorCodes\n >(CONTACTS_APP_ERRORS, contactsCommandErrorFactory);\n\n constructor(args: EditExternalAddressScopeCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CONTACTS_APDU_CLA,\n ins: CONTACTS_APDU_INS,\n p1: SUB_CMD_EDIT_SCOPE,\n p2: this.args.p2,\n })\n .addBufferToData(this.args.data)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<\n EditExternalAddressScopeCommandResponse,\n ContactsErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n if (response.data.length === 0) {\n // Intermediate chunk \u2014 device acks with SW=0x9000 and no payload.\n return CommandResultFactory({ data: {} });\n }\n\n const parser = new ApduParser(response);\n\n const structType = parser.extract8BitUInt();\n if (structType !== RESPONSE_STRUCT_TYPE) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Expected struct_type 0x${RESPONSE_STRUCT_TYPE.toString(16)}, got ${\n structType === undefined\n ? \"undefined\"\n : `0x${structType.toString(16)}`\n }`,\n ),\n });\n }\n\n const hmacRest = extractField(parser, HMAC_REST_BYTES);\n if (!hmacRest) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_rest missing or truncated\"),\n });\n }\n\n return CommandResultFactory({\n data: { hmacRest },\n });\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EASO,2CACPC,EAAmC,kCACnCC,EAAsB,qBAEtBC,EAKO,wDACPC,EAIO,qDACPC,EAAuC,+DAkBvC,MAAMC,EAAuB,yBAO7B,SAASC,EACPC,EACAC,EACwB,CACxB,MAAMC,EAAQF,EAAO,qBAAqBC,CAAM,EAChD,GAAI,GAACC,GAASA,EAAM,SAAWD,GAC/B,OAAO,WAAW,KAAKC,CAAK,CAC9B,CAEO,MAAMZ,CAOb,CACW,KAAO,2BACP,KACQ,YAAc,IAAI,qBAGjC,sBAAqB,6BAA2B,EAElD,YAAYa,EAA2C,CACrD,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAI,cAAY,CACrB,IAAK,oBACL,IAAK,oBACL,GAAI,qBACJ,GAAI,KAAK,KAAK,EAChB,CAAC,EACE,gBAAgB,KAAK,KAAK,IAAI,EAC9B,MAAM,CACX,CAEA,cACEC,EAIA,CACA,OAAO,QAAM,aACX,KAAK,YAAY,SAASA,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,GAAIA,EAAS,KAAK,SAAW,EAE3B,SAAO,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,EAG1C,MAAMJ,EAAS,IAAI,aAAWI,CAAQ,EAEhCC,EAAaL,EAAO,gBAAgB,EAC1C,GAAIK,IAAeP,EACjB,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0BAA0BA,EAAqB,SAAS,EAAE,CAAC,SACzDO,IAAe,OACX,YACA,KAAKA,EAAW,SAAS,EAAE,CAAC,EAClC,EACF,CACF,CAAC,EAGH,MAAMC,EAAWP,EAAaC,EAAQ,iBAAe,EACrD,OAAKM,KAME,wBAAqB,CAC1B,KAAM,CAAE,SAAAA,CAAS,CACnB,CAAC,KAPQ,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,CAML,CAAC,CACH,CACF",
6
- "names": ["EditExternalAddressScopeCommand_exports", "__export", "EditExternalAddressScopeCommand", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_purify_ts", "import_contactsConstants", "import_contactsErrors", "import_contactsTlvSerializer", "RESPONSE_STRUCT_TYPE", "extractField", "parser", "length", "field", "args", "response", "structType", "hmacRest"]
4
+ "sourcesContent": ["// Edit Scope \u2014 sub-command P1=0x04 of the address-book APDU (CLA 0xB0 /\n// INS 0x10). Frames one chunk; on the final chunk parses the 33-byte response\n// struct_type(0x32) + hmac_rest(32) (the rotated address-level proof).\n// Intermediate chunks ack SW=0x9000 with no data. SW 0x6982 = seed/handle\n// mismatch, surfaced via the shared error helper before any device UI.\n// Protocol: Address Book Final Specifications \u2014 Edit Scope.\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n CONTACTS_APDU_CLA,\n CONTACTS_APDU_INS,\n HMAC_REST_BYTES,\n SUB_CMD_EDIT_SCOPE,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport {\n ContactsCommandErrorHelper,\n type ContactsErrorCodes,\n} from \"@internal/app-binder/model/contactsErrors\";\nimport { STRUCT_TYPE_EDIT_SCOPE } from \"@internal/app-binder/services/contactsTlvSerializer\";\n\nexport type EditExternalAddressScopeCommandArgs = {\n /** One framed chunk built by sendFramedContactsPayload. */\n readonly data: Uint8Array;\n /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */\n readonly p2: number;\n};\n\nexport type EditExternalAddressScopeCommandResponse = {\n /**\n * Present only on the final chunk \u2014 the device returns struct_type(0x32) +\n * hmac_rest(32) there. Intermediate chunks return SW=0x9000 with no data.\n * This is the replacement address-level proof (rotated `hmac_rest`).\n */\n readonly hmacRest?: Uint8Array;\n};\n\nconst RESPONSE_STRUCT_TYPE = STRUCT_TYPE_EDIT_SCOPE;\n\n/**\n * Extract `length` bytes as a freshly-owned plain `Uint8Array` (the parser may\n * hand back a `Buffer` view backed by the response), or `undefined` if the\n * response is too short.\n */\nfunction extractField(\n parser: ApduParser,\n length: number,\n): Uint8Array | undefined {\n const field = parser.extractFieldByLength(length);\n if (!field || field.length !== length) return undefined;\n return Uint8Array.from(field);\n}\n\nexport class EditExternalAddressScopeCommand\n implements\n Command<\n EditExternalAddressScopeCommandResponse,\n EditExternalAddressScopeCommandArgs,\n ContactsErrorCodes\n >\n{\n readonly name = \"editExternalAddressScope\";\n readonly args: EditExternalAddressScopeCommandArgs;\n private readonly errorHelper =\n new ContactsCommandErrorHelper<EditExternalAddressScopeCommandResponse>();\n\n constructor(args: EditExternalAddressScopeCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CONTACTS_APDU_CLA,\n ins: CONTACTS_APDU_INS,\n p1: SUB_CMD_EDIT_SCOPE,\n p2: this.args.p2,\n })\n .addBufferToData(this.args.data)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<\n EditExternalAddressScopeCommandResponse,\n ContactsErrorCodes\n > {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n if (response.data.length === 0) {\n // Intermediate chunk \u2014 device acks with SW=0x9000 and no payload.\n return CommandResultFactory({ data: {} });\n }\n\n const parser = new ApduParser(response);\n\n const structType = parser.extract8BitUInt();\n if (structType !== RESPONSE_STRUCT_TYPE) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Expected struct_type 0x${RESPONSE_STRUCT_TYPE.toString(16)}, got ${\n structType === undefined\n ? \"undefined\"\n : `0x${structType.toString(16)}`\n }`,\n ),\n });\n }\n\n const hmacRest = extractField(parser, HMAC_REST_BYTES);\n if (!hmacRest) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_rest missing or truncated\"),\n });\n }\n\n return CommandResultFactory({\n data: { hmacRest },\n });\n });\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qCAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EASO,2CACPC,EAAsB,qBAEtBC,EAKO,wDACPC,EAGO,qDACPC,EAAuC,+DAkBvC,MAAMC,EAAuB,yBAO7B,SAASC,EACPC,EACAC,EACwB,CACxB,MAAMC,EAAQF,EAAO,qBAAqBC,CAAM,EAChD,GAAI,GAACC,GAASA,EAAM,SAAWD,GAC/B,OAAO,WAAW,KAAKC,CAAK,CAC9B,CAEO,MAAMX,CAOb,CACW,KAAO,2BACP,KACQ,YACf,IAAI,6BAEN,YAAYY,EAA2C,CACrD,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAI,cAAY,CACrB,IAAK,oBACL,IAAK,oBACL,GAAI,qBACJ,GAAI,KAAK,KAAK,EAChB,CAAC,EACE,gBAAgB,KAAK,KAAK,IAAI,EAC9B,MAAM,CACX,CAEA,cACEC,EAIA,CACA,OAAO,QAAM,aACX,KAAK,YAAY,SAASA,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,GAAIA,EAAS,KAAK,SAAW,EAE3B,SAAO,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,EAG1C,MAAMJ,EAAS,IAAI,aAAWI,CAAQ,EAEhCC,EAAaL,EAAO,gBAAgB,EAC1C,GAAIK,IAAeP,EACjB,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0BAA0BA,EAAqB,SAAS,EAAE,CAAC,SACzDO,IAAe,OACX,YACA,KAAKA,EAAW,SAAS,EAAE,CAAC,EAClC,EACF,CACF,CAAC,EAGH,MAAMC,EAAWP,EAAaC,EAAQ,iBAAe,EACrD,OAAKM,KAME,wBAAqB,CAC1B,KAAM,CAAE,SAAAA,CAAS,CACnB,CAAC,KAPQ,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,CAML,CAAC,CACH,CACF",
6
+ "names": ["EditExternalAddressScopeCommand_exports", "__export", "EditExternalAddressScopeCommand", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_contactsConstants", "import_contactsErrors", "import_contactsTlvSerializer", "RESPONSE_STRUCT_TYPE", "extractField", "parser", "length", "field", "args", "response", "structType", "hmacRest"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var d=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var l=(r,o)=>{for(var a in o)d(r,a,{get:o[a],enumerable:!0})},u=(r,o,a,s)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of i(o))!c.call(r,t)&&t!==a&&d(r,t,{get:()=>o[t],enumerable:!(s=p(o,t))||s.enumerable});return r};var A=r=>u(d({},"__esModule",{value:!0}),r);var v={};l(v,{ProvideContactCommand:()=>y});module.exports=A(v);var n=require("@ledgerhq/device-management-kit"),m=require("purify-ts"),e=require("../../app-binder/model/contactsConstants"),C=require("../../app-binder/model/contactsErrors");class y{name="provideContact";args;errorHelper=new C.ContactsCommandErrorHelper;constructor(o){this.args=o}getApdu(){return new n.ApduBuilder({cla:e.CONTACTS_APDU_CLA,ins:e.CONTACTS_APDU_INS,p1:e.SUB_CMD_PROVIDE_CONTACT,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(o){return m.Maybe.fromNullable(this.errorHelper.getError(o)).orDefaultLazy(()=>(0,n.CommandResultFactory)({data:void 0}))}}0&&(module.exports={ProvideContactCommand});
2
+ //# sourceMappingURL=ProvideContactCommand.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/command/ProvideContactCommand.ts"],
4
+ "sourcesContent": ["// Provide Contact \u2014 sub-command P1=0x20 of the address-book APDU (CLA 0xB0 /\n// INS 0x10). Sent before a signing APDU so the device renders a registered\n// contact name in place of the raw recipient address. Caller\n// (sendProvideContactPayload) assembles the TLV, prepends the 2-byte BE total\n// length and slices into <=255B chunks; this command frames one chunk. Every\n// chunk answers with SW=0x9000 and no data \u2014 the outcome is a device-side\n// effect, not a returned value.\n// Protocol: Address Book Final Specifications \u2014 Provide Contact.\nimport {\n type Apdu,\n ApduBuilder,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n} from \"@ledgerhq/device-management-kit\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n CONTACTS_APDU_CLA,\n CONTACTS_APDU_INS,\n SUB_CMD_PROVIDE_CONTACT,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport {\n ContactsCommandErrorHelper,\n type ContactsErrorCodes,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nexport type ProvideContactCommandArgs = {\n /** One framed chunk built by sendProvideContactPayload. */\n readonly data: Uint8Array;\n /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */\n readonly p2: number;\n};\n\nexport type ProvideContactCommandResponse = void;\n\nexport class ProvideContactCommand\n implements\n Command<\n ProvideContactCommandResponse,\n ProvideContactCommandArgs,\n ContactsErrorCodes\n >\n{\n readonly name = \"provideContact\";\n readonly args: ProvideContactCommandArgs;\n private readonly errorHelper =\n new ContactsCommandErrorHelper<ProvideContactCommandResponse>();\n\n constructor(args: ProvideContactCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CONTACTS_APDU_CLA,\n ins: CONTACTS_APDU_INS,\n p1: SUB_CMD_PROVIDE_CONTACT,\n p2: this.args.p2,\n })\n .addBufferToData(this.args.data)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<ProvideContactCommandResponse, ContactsErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() =>\n CommandResultFactory<ProvideContactCommandResponse, ContactsErrorCodes>({\n data: undefined,\n }),\n );\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,2BAAAE,IAAA,eAAAC,EAAAH,GAQA,IAAAI,EAOO,2CACPC,EAAsB,qBAEtBC,EAIO,wDACPC,EAGO,qDAWA,MAAML,CAOb,CACW,KAAO,iBACP,KACQ,YACf,IAAI,6BAEN,YAAYM,EAAiC,CAC3C,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAI,cAAY,CACrB,IAAK,oBACL,IAAK,oBACL,GAAI,0BACJ,GAAI,KAAK,KAAK,EAChB,CAAC,EACE,gBAAgB,KAAK,KAAK,IAAI,EAC9B,MAAM,CACX,CAEA,cACEC,EACkE,CAClE,OAAO,QAAM,aACX,KAAK,YAAY,SAASA,CAAQ,CACpC,EAAE,cAAc,OACd,wBAAwE,CACtE,KAAM,MACR,CAAC,CACH,CACF,CACF",
6
+ "names": ["ProvideContactCommand_exports", "__export", "ProvideContactCommand", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_contactsConstants", "import_contactsErrors", "args", "response"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=require("@ledgerhq/device-management-kit"),a=require("../../app-binder/model/contactsErrors"),e=require("./ProvideContactCommand");describe("ProvideContactCommand",()=>{describe("getApdu",()=>{it("wraps the framed chunk under B0 10 20 with P2=0x00 for the first/only chunk",()=>{const t=Uint8Array.from([0,3,170,187,204]),o=new e.ProvideContactCommand({data:t,p2:0}).getApdu();expect(o.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,32,0,5,0,3,170,187,204]))}),it("uses P2=0x80 for continuation chunks",()=>{const t=Uint8Array.from([170,187]),o=new e.ProvideContactCommand({data:t,p2:128}).getApdu();expect(o.getRawApdu()).toStrictEqual(Uint8Array.from([176,16,32,128,2,170,187]))})}),describe("parseResponse",()=>{it("succeeds with no data on SW=0x9000",()=>{const t=new e.ProvideContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([144,0])});expect(t).toStrictEqual({status:r.CommandResultStatus.Success,data:void 0})}),it("maps SW=0x6982 to a seed-mismatch ContactsCommandError",()=>{const t=new e.ProvideContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([105,130])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&(expect(t.error).toBeInstanceOf(a.ContactsCommandError),expect(t.error.errorCode).toBe(a.CONTACT_SEED_MISMATCH_ERROR_CODE))}),it("maps SW=0x6a80 to a ContactsCommandError",()=>{const t=new e.ProvideContactCommand({data:new Uint8Array,p2:0}).parseResponse({data:Buffer.from([]),statusCode:Buffer.from([106,128])});expect(t.status).toBe(r.CommandResultStatus.Error),t.status===r.CommandResultStatus.Error&&expect(t.error.errorCode).toBe("6a80")})})});
2
+ //# sourceMappingURL=ProvideContactCommand.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/command/ProvideContactCommand.test.ts"],
4
+ "sourcesContent": ["import { CommandResultStatus } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n ContactsCommandError,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nimport { ProvideContactCommand } from \"./ProvideContactCommand\";\n\ndescribe(\"ProvideContactCommand\", () => {\n describe(\"getApdu\", () => {\n it(\"wraps the framed chunk under B0 10 20 with P2=0x00 for the first/only chunk\", () => {\n const data = Uint8Array.from([0x00, 0x03, 0xaa, 0xbb, 0xcc]);\n\n const apdu = new ProvideContactCommand({ data, p2: 0x00 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([\n 0xb0, 0x10, 0x20, 0x00, 0x05, 0x00, 0x03, 0xaa, 0xbb, 0xcc,\n ]),\n );\n });\n\n it(\"uses P2=0x80 for continuation chunks\", () => {\n const data = Uint8Array.from([0xaa, 0xbb]);\n\n const apdu = new ProvideContactCommand({ data, p2: 0x80 }).getApdu();\n\n expect(apdu.getRawApdu()).toStrictEqual(\n Uint8Array.from([0xb0, 0x10, 0x20, 0x80, 0x02, 0xaa, 0xbb]),\n );\n });\n });\n\n describe(\"parseResponse\", () => {\n it(\"succeeds with no data on SW=0x9000\", () => {\n const result = new ProvideContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x90, 0x00]),\n });\n\n expect(result).toStrictEqual({\n status: CommandResultStatus.Success,\n data: undefined,\n });\n });\n\n it(\"maps SW=0x6982 to a seed-mismatch ContactsCommandError\", () => {\n const result = new ProvideContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x69, 0x82]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect(result.error).toBeInstanceOf(ContactsCommandError);\n expect((result.error as ContactsCommandError).errorCode).toBe(\n CONTACT_SEED_MISMATCH_ERROR_CODE,\n );\n }\n });\n\n it(\"maps SW=0x6a80 to a ContactsCommandError\", () => {\n const result = new ProvideContactCommand({\n data: new Uint8Array(),\n p2: 0x00,\n }).parseResponse({\n data: Buffer.from([]),\n statusCode: Buffer.from([0x6a, 0x80]),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n if (result.status === CommandResultStatus.Error) {\n expect((result.error as ContactsCommandError).errorCode).toBe(\"6a80\");\n }\n });\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAAoC,2CAEpCC,EAGO,qDAEPC,EAAsC,mCAEtC,SAAS,wBAAyB,IAAM,CACtC,SAAS,UAAW,IAAM,CACxB,GAAG,8EAA+E,IAAM,CACtF,MAAMC,EAAO,WAAW,KAAK,CAAC,EAAM,EAAM,IAAM,IAAM,GAAI,CAAC,EAErDC,EAAO,IAAI,wBAAsB,CAAE,KAAAD,EAAM,GAAI,CAAK,CAAC,EAAE,QAAQ,EAEnE,OAAOC,EAAK,WAAW,CAAC,EAAE,cACxB,WAAW,KAAK,CACd,IAAM,GAAM,GAAM,EAAM,EAAM,EAAM,EAAM,IAAM,IAAM,GACxD,CAAC,CACH,CACF,CAAC,EAED,GAAG,uCAAwC,IAAM,CAC/C,MAAMD,EAAO,WAAW,KAAK,CAAC,IAAM,GAAI,CAAC,EAEnCC,EAAO,IAAI,wBAAsB,CAAE,KAAAD,EAAM,GAAI,GAAK,CAAC,EAAE,QAAQ,EAEnE,OAAOC,EAAK,WAAW,CAAC,EAAE,cACxB,WAAW,KAAK,CAAC,IAAM,GAAM,GAAM,IAAM,EAAM,IAAM,GAAI,CAAC,CAC5D,CACF,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,qCAAsC,IAAM,CAC7C,MAAMC,EAAS,IAAI,wBAAsB,CACvC,KAAM,IAAI,WACV,GAAI,CACN,CAAC,EAAE,cAAc,CACf,KAAM,OAAO,KAAK,CAAC,CAAC,EACpB,WAAY,OAAO,KAAK,CAAC,IAAM,CAAI,CAAC,CACtC,CAAC,EAED,OAAOA,CAAM,EAAE,cAAc,CAC3B,OAAQ,sBAAoB,QAC5B,KAAM,MACR,CAAC,CACH,CAAC,EAED,GAAG,yDAA0D,IAAM,CACjE,MAAMA,EAAS,IAAI,wBAAsB,CACvC,KAAM,IAAI,WACV,GAAI,CACN,CAAC,EAAE,cAAc,CACf,KAAM,OAAO,KAAK,CAAC,CAAC,EACpB,WAAY,OAAO,KAAK,CAAC,IAAM,GAAI,CAAC,CACtC,CAAC,EAED,OAAOA,EAAO,MAAM,EAAE,KAAK,sBAAoB,KAAK,EAChDA,EAAO,SAAW,sBAAoB,QACxC,OAAOA,EAAO,KAAK,EAAE,eAAe,sBAAoB,EACxD,OAAQA,EAAO,MAA+B,SAAS,EAAE,KACvD,kCACF,EAEJ,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,MAAMA,EAAS,IAAI,wBAAsB,CACvC,KAAM,IAAI,WACV,GAAI,CACN,CAAC,EAAE,cAAc,CACf,KAAM,OAAO,KAAK,CAAC,CAAC,EACpB,WAAY,OAAO,KAAK,CAAC,IAAM,GAAI,CAAC,CACtC,CAAC,EAED,OAAOA,EAAO,MAAM,EAAE,KAAK,sBAAoB,KAAK,EAChDA,EAAO,SAAW,sBAAoB,OACxC,OAAQA,EAAO,MAA+B,SAAS,EAAE,KAAK,MAAM,CAExE,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_contactsErrors", "import_ProvideContactCommand", "data", "apdu", "result"]
7
+ }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var A=(o,r)=>{for(var t in r)i(o,t,{get:r[t],enumerable:!0})},f=(o,r,t,d)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of l(r))!R.call(o,a)&&a!==t&&i(o,a,{get:()=>r[a],enumerable:!(d=g(r,a))||d.enumerable});return o};var E=o=>f(i({},"__esModule",{value:!0}),o);var T={};A(T,{RegisterIdentityCommand:()=>_});module.exports=E(T);var e=require("@ledgerhq/device-management-kit"),c=require("@ledgerhq/signer-utils"),C=require("purify-ts"),n=require("../../app-binder/model/contactsConstants"),s=require("../../app-binder/model/contactsErrors");const y=45;function m(o,r){const t=o.extractFieldByLength(r);if(!(!t||t.length!==r))return Uint8Array.from(t)}class _{name="registerIdentity";args;errorHelper=new c.CommandErrorHelper(s.CONTACTS_APP_ERRORS,s.contactsCommandErrorFactory);constructor(r){this.args=r}getApdu(){return new e.ApduBuilder({cla:n.CONTACTS_APDU_CLA,ins:n.CONTACTS_APDU_INS,p1:n.SUB_CMD_REGISTER_IDENTITY,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(r){return C.Maybe.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{if(r.data.length===0)return(0,e.CommandResultFactory)({data:{}});const t=new e.ApduParser(r),d=t.extract8BitUInt();if(d!==y)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError(`Expected struct_type 0x${y.toString(16)}, got ${d===void 0?"undefined":`0x${d.toString(16)}`}`)});const a=m(t,n.GROUP_HANDLE_BYTES);if(!a)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("group_handle missing or truncated")});const p=m(t,n.HMAC_PROOF_BYTES);if(!p)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_name missing or truncated")});const u=m(t,n.HMAC_REST_BYTES);return u?(0,e.CommandResultFactory)({data:{groupHandle:a,hmacProof:p,hmacRest:u}}):(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_rest missing or truncated")})})}}0&&(module.exports={RegisterIdentityCommand});
1
+ "use strict";var s=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var R=(o,r)=>{for(var t in r)s(o,t,{get:r[t],enumerable:!0})},A=(o,r,t,d)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of l(r))!C.call(o,a)&&a!==t&&s(o,a,{get:()=>r[a],enumerable:!(d=g(r,a))||d.enumerable});return o};var f=o=>A(s({},"__esModule",{value:!0}),o);var E={};R(E,{RegisterIdentityCommand:()=>_});module.exports=f(E);var e=require("@ledgerhq/device-management-kit"),y=require("purify-ts"),n=require("../../app-binder/model/contactsConstants"),c=require("../../app-binder/model/contactsErrors");const u=45;function i(o,r){const t=o.extractFieldByLength(r);if(!(!t||t.length!==r))return Uint8Array.from(t)}class _{name="registerIdentity";args;errorHelper=new c.ContactsCommandErrorHelper;constructor(r){this.args=r}getApdu(){return new e.ApduBuilder({cla:n.CONTACTS_APDU_CLA,ins:n.CONTACTS_APDU_INS,p1:n.SUB_CMD_REGISTER_IDENTITY,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(r){return y.Maybe.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{if(r.data.length===0)return(0,e.CommandResultFactory)({data:{}});const t=new e.ApduParser(r),d=t.extract8BitUInt();if(d!==u)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError(`Expected struct_type 0x${u.toString(16)}, got ${d===void 0?"undefined":`0x${d.toString(16)}`}`)});const a=i(t,n.GROUP_HANDLE_BYTES);if(!a)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("group_handle missing or truncated")});const m=i(t,n.HMAC_PROOF_BYTES);if(!m)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_name missing or truncated")});const p=i(t,n.HMAC_REST_BYTES);return p?(0,e.CommandResultFactory)({data:{groupHandle:a,hmacProof:m,hmacRest:p}}):(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_rest missing or truncated")})})}}0&&(module.exports={RegisterIdentityCommand});
2
2
  //# sourceMappingURL=RegisterIdentityCommand.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/command/RegisterIdentityCommand.ts"],
4
- "sourcesContent": ["// Register Identity (register external address) \u2014 sub-command P1=0x01 of the\n// address-book APDU (CLA 0xB0 / INS 0x10). Caller (SendRegisterIdentityTask +\n// sendFramedContactsPayload) assembles the TLV, prepends the 2-byte BE total\n// length and slices into <=255B chunks; this command frames one chunk and, on\n// the final chunk, parses the 129-byte response: struct_type(0x2d) +\n// group_handle(64) + hmac_proof(32) + hmac_rest(32). Intermediate chunks ack\n// with SW=0x9000 and no data.\n// Protocol: Address Book Final Specifications \u2014 Register Identity.\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n CONTACTS_APDU_CLA,\n CONTACTS_APDU_INS,\n GROUP_HANDLE_BYTES,\n HMAC_PROOF_BYTES,\n HMAC_REST_BYTES,\n SUB_CMD_REGISTER_IDENTITY,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport {\n CONTACTS_APP_ERRORS,\n contactsCommandErrorFactory,\n type ContactsErrorCodes,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nexport type RegisterIdentityCommandArgs = {\n /** One framed chunk built by sendFramedContactsPayload. */\n readonly data: Uint8Array;\n /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */\n readonly p2: number;\n};\n\nexport type RegisterIdentityCommandResponse = {\n /**\n * Present only on the final chunk \u2014 the device returns struct_type(0x2d) +\n * group_handle(64) + hmac_proof(32) + hmac_rest(32) there. Intermediate\n * chunks return SW=0x9000 with no data.\n *\n * `hmacProof` is the device's HMAC_PROOF (binds the contact name);\n * `hmacRest` is the HMAC_REST (binds scope + identifier + family).\n */\n readonly groupHandle?: Uint8Array;\n readonly hmacProof?: Uint8Array;\n readonly hmacRest?: Uint8Array;\n};\n\nconst RESPONSE_STRUCT_TYPE = 0x2d;\n\n/**\n * Extract `length` bytes as a freshly-owned plain `Uint8Array` (the parser may\n * hand back a `Buffer` view backed by the response), or `undefined` if the\n * response is too short.\n */\nfunction extractField(\n parser: ApduParser,\n length: number,\n): Uint8Array | undefined {\n const field = parser.extractFieldByLength(length);\n if (!field || field.length !== length) return undefined;\n return Uint8Array.from(field);\n}\n\nexport class RegisterIdentityCommand\n implements\n Command<\n RegisterIdentityCommandResponse,\n RegisterIdentityCommandArgs,\n ContactsErrorCodes\n >\n{\n readonly name = \"registerIdentity\";\n readonly args: RegisterIdentityCommandArgs;\n private readonly errorHelper = new CommandErrorHelper<\n RegisterIdentityCommandResponse,\n ContactsErrorCodes\n >(CONTACTS_APP_ERRORS, contactsCommandErrorFactory);\n\n constructor(args: RegisterIdentityCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CONTACTS_APDU_CLA,\n ins: CONTACTS_APDU_INS,\n p1: SUB_CMD_REGISTER_IDENTITY,\n p2: this.args.p2,\n })\n .addBufferToData(this.args.data)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<RegisterIdentityCommandResponse, ContactsErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n if (response.data.length === 0) {\n // Intermediate chunk \u2014 device acks with SW=0x9000 and no payload.\n return CommandResultFactory({ data: {} });\n }\n\n const parser = new ApduParser(response);\n\n const structType = parser.extract8BitUInt();\n if (structType !== RESPONSE_STRUCT_TYPE) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Expected struct_type 0x${RESPONSE_STRUCT_TYPE.toString(16)}, got ${\n structType === undefined\n ? \"undefined\"\n : `0x${structType.toString(16)}`\n }`,\n ),\n });\n }\n\n const groupHandle = extractField(parser, GROUP_HANDLE_BYTES);\n if (!groupHandle) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"group_handle missing or truncated\",\n ),\n });\n }\n\n const hmacProof = extractField(parser, HMAC_PROOF_BYTES);\n if (!hmacProof) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_name missing or truncated\"),\n });\n }\n\n const hmacRest = extractField(parser, HMAC_REST_BYTES);\n if (!hmacRest) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_rest missing or truncated\"),\n });\n }\n\n return CommandResultFactory({\n data: { groupHandle, hmacProof, hmacRest },\n });\n });\n }\n}\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAQA,IAAAI,EASO,2CACPC,EAAmC,kCACnCC,EAAsB,qBAEtBC,EAOO,wDACPC,EAIO,qDAuBP,MAAMC,EAAuB,GAO7B,SAASC,EACPC,EACAC,EACwB,CACxB,MAAMC,EAAQF,EAAO,qBAAqBC,CAAM,EAChD,GAAI,GAACC,GAASA,EAAM,SAAWD,GAC/B,OAAO,WAAW,KAAKC,CAAK,CAC9B,CAEO,MAAMX,CAOb,CACW,KAAO,mBACP,KACQ,YAAc,IAAI,qBAGjC,sBAAqB,6BAA2B,EAElD,YAAYY,EAAmC,CAC7C,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAI,cAAY,CACrB,IAAK,oBACL,IAAK,oBACL,GAAI,4BACJ,GAAI,KAAK,KAAK,EAChB,CAAC,EACE,gBAAgB,KAAK,KAAK,IAAI,EAC9B,MAAM,CACX,CAEA,cACEC,EACoE,CACpE,OAAO,QAAM,aACX,KAAK,YAAY,SAASA,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,GAAIA,EAAS,KAAK,SAAW,EAE3B,SAAO,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,EAG1C,MAAMJ,EAAS,IAAI,aAAWI,CAAQ,EAEhCC,EAAaL,EAAO,gBAAgB,EAC1C,GAAIK,IAAeP,EACjB,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0BAA0BA,EAAqB,SAAS,EAAE,CAAC,SACzDO,IAAe,OACX,YACA,KAAKA,EAAW,SAAS,EAAE,CAAC,EAClC,EACF,CACF,CAAC,EAGH,MAAMC,EAAcP,EAAaC,EAAQ,oBAAkB,EAC3D,GAAI,CAACM,EACH,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,mCACF,CACF,CAAC,EAGH,MAAMC,EAAYR,EAAaC,EAAQ,kBAAgB,EACvD,GAAI,CAACO,EACH,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,EAGH,MAAMC,EAAWT,EAAaC,EAAQ,iBAAe,EACrD,OAAKQ,KAME,wBAAqB,CAC1B,KAAM,CAAE,YAAAF,EAAa,UAAAC,EAAW,SAAAC,CAAS,CAC3C,CAAC,KAPQ,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,CAML,CAAC,CACH,CACF",
6
- "names": ["RegisterIdentityCommand_exports", "__export", "RegisterIdentityCommand", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_purify_ts", "import_contactsConstants", "import_contactsErrors", "RESPONSE_STRUCT_TYPE", "extractField", "parser", "length", "field", "args", "response", "structType", "groupHandle", "hmacProof", "hmacRest"]
4
+ "sourcesContent": ["// Register Identity (register external address) \u2014 sub-command P1=0x01 of the\n// address-book APDU (CLA 0xB0 / INS 0x10). Caller (SendRegisterIdentityTask +\n// sendFramedContactsPayload) assembles the TLV, prepends the 2-byte BE total\n// length and slices into <=255B chunks; this command frames one chunk and, on\n// the final chunk, parses the 129-byte response: struct_type(0x2d) +\n// group_handle(64) + hmac_proof(32) + hmac_rest(32). Intermediate chunks ack\n// with SW=0x9000 and no data.\n// Protocol: Address Book Final Specifications \u2014 Register Identity.\nimport {\n type Apdu,\n ApduBuilder,\n ApduParser,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Maybe } from \"purify-ts\";\n\nimport {\n CONTACTS_APDU_CLA,\n CONTACTS_APDU_INS,\n GROUP_HANDLE_BYTES,\n HMAC_PROOF_BYTES,\n HMAC_REST_BYTES,\n SUB_CMD_REGISTER_IDENTITY,\n} from \"@internal/app-binder/model/contactsConstants\";\nimport {\n ContactsCommandErrorHelper,\n type ContactsErrorCodes,\n} from \"@internal/app-binder/model/contactsErrors\";\n\nexport type RegisterIdentityCommandArgs = {\n /** One framed chunk built by sendFramedContactsPayload. */\n readonly data: Uint8Array;\n /** 0x00 for the first/only chunk, 0x80 for continuation chunks. */\n readonly p2: number;\n};\n\nexport type RegisterIdentityCommandResponse = {\n /**\n * Present only on the final chunk \u2014 the device returns struct_type(0x2d) +\n * group_handle(64) + hmac_proof(32) + hmac_rest(32) there. Intermediate\n * chunks return SW=0x9000 with no data.\n *\n * `hmacProof` is the device's HMAC_PROOF (binds the contact name);\n * `hmacRest` is the HMAC_REST (binds scope + identifier + family).\n */\n readonly groupHandle?: Uint8Array;\n readonly hmacProof?: Uint8Array;\n readonly hmacRest?: Uint8Array;\n};\n\nconst RESPONSE_STRUCT_TYPE = 0x2d;\n\n/**\n * Extract `length` bytes as a freshly-owned plain `Uint8Array` (the parser may\n * hand back a `Buffer` view backed by the response), or `undefined` if the\n * response is too short.\n */\nfunction extractField(\n parser: ApduParser,\n length: number,\n): Uint8Array | undefined {\n const field = parser.extractFieldByLength(length);\n if (!field || field.length !== length) return undefined;\n return Uint8Array.from(field);\n}\n\nexport class RegisterIdentityCommand\n implements\n Command<\n RegisterIdentityCommandResponse,\n RegisterIdentityCommandArgs,\n ContactsErrorCodes\n >\n{\n readonly name = \"registerIdentity\";\n readonly args: RegisterIdentityCommandArgs;\n private readonly errorHelper =\n new ContactsCommandErrorHelper<RegisterIdentityCommandResponse>();\n\n constructor(args: RegisterIdentityCommandArgs) {\n this.args = args;\n }\n\n getApdu(): Apdu {\n return new ApduBuilder({\n cla: CONTACTS_APDU_CLA,\n ins: CONTACTS_APDU_INS,\n p1: SUB_CMD_REGISTER_IDENTITY,\n p2: this.args.p2,\n })\n .addBufferToData(this.args.data)\n .build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<RegisterIdentityCommandResponse, ContactsErrorCodes> {\n return Maybe.fromNullable(\n this.errorHelper.getError(response),\n ).orDefaultLazy(() => {\n if (response.data.length === 0) {\n // Intermediate chunk \u2014 device acks with SW=0x9000 and no payload.\n return CommandResultFactory({ data: {} });\n }\n\n const parser = new ApduParser(response);\n\n const structType = parser.extract8BitUInt();\n if (structType !== RESPONSE_STRUCT_TYPE) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Expected struct_type 0x${RESPONSE_STRUCT_TYPE.toString(16)}, got ${\n structType === undefined\n ? \"undefined\"\n : `0x${structType.toString(16)}`\n }`,\n ),\n });\n }\n\n const groupHandle = extractField(parser, GROUP_HANDLE_BYTES);\n if (!groupHandle) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"group_handle missing or truncated\",\n ),\n });\n }\n\n const hmacProof = extractField(parser, HMAC_PROOF_BYTES);\n if (!hmacProof) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_name missing or truncated\"),\n });\n }\n\n const hmacRest = extractField(parser, HMAC_REST_BYTES);\n if (!hmacRest) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"hmac_rest missing or truncated\"),\n });\n }\n\n return CommandResultFactory({\n data: { groupHandle, hmacProof, hmacRest },\n });\n });\n }\n}\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAQA,IAAAI,EASO,2CACPC,EAAsB,qBAEtBC,EAOO,wDACPC,EAGO,qDAuBP,MAAMC,EAAuB,GAO7B,SAASC,EACPC,EACAC,EACwB,CACxB,MAAMC,EAAQF,EAAO,qBAAqBC,CAAM,EAChD,GAAI,GAACC,GAASA,EAAM,SAAWD,GAC/B,OAAO,WAAW,KAAKC,CAAK,CAC9B,CAEO,MAAMV,CAOb,CACW,KAAO,mBACP,KACQ,YACf,IAAI,6BAEN,YAAYW,EAAmC,CAC7C,KAAK,KAAOA,CACd,CAEA,SAAgB,CACd,OAAO,IAAI,cAAY,CACrB,IAAK,oBACL,IAAK,oBACL,GAAI,4BACJ,GAAI,KAAK,KAAK,EAChB,CAAC,EACE,gBAAgB,KAAK,KAAK,IAAI,EAC9B,MAAM,CACX,CAEA,cACEC,EACoE,CACpE,OAAO,QAAM,aACX,KAAK,YAAY,SAASA,CAAQ,CACpC,EAAE,cAAc,IAAM,CACpB,GAAIA,EAAS,KAAK,SAAW,EAE3B,SAAO,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,EAG1C,MAAMJ,EAAS,IAAI,aAAWI,CAAQ,EAEhCC,EAAaL,EAAO,gBAAgB,EAC1C,GAAIK,IAAeP,EACjB,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,0BAA0BA,EAAqB,SAAS,EAAE,CAAC,SACzDO,IAAe,OACX,YACA,KAAKA,EAAW,SAAS,EAAE,CAAC,EAClC,EACF,CACF,CAAC,EAGH,MAAMC,EAAcP,EAAaC,EAAQ,oBAAkB,EAC3D,GAAI,CAACM,EACH,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBACT,mCACF,CACF,CAAC,EAGH,MAAMC,EAAYR,EAAaC,EAAQ,kBAAgB,EACvD,GAAI,CAACO,EACH,SAAO,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,EAGH,MAAMC,EAAWT,EAAaC,EAAQ,iBAAe,EACrD,OAAKQ,KAME,wBAAqB,CAC1B,KAAM,CAAE,YAAAF,EAAa,UAAAC,EAAW,SAAAC,CAAS,CAC3C,CAAC,KAPQ,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,gCAAgC,CACpE,CAAC,CAML,CAAC,CACH,CACF",
6
+ "names": ["RegisterIdentityCommand_exports", "__export", "RegisterIdentityCommand", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_contactsConstants", "import_contactsErrors", "RESPONSE_STRUCT_TYPE", "extractField", "parser", "length", "field", "args", "response", "structType", "groupHandle", "hmacProof", "hmacRest"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var l=(n,r)=>{for(var t in r)s(n,t,{get:r[t],enumerable:!0})},y=(n,r,t,m)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of A(r))!R.call(n,o)&&o!==t&&s(n,o,{get:()=>r[o],enumerable:!(m=u(r,o))||m.enumerable});return n};var E=n=>y(s({},"__esModule",{value:!0}),n);var _={};l(_,{RenameContactCommand:()=>T});module.exports=E(_);var e=require("@ledgerhq/device-management-kit"),p=require("@ledgerhq/signer-utils"),c=require("purify-ts"),a=require("../../app-binder/model/contactsConstants"),d=require("../../app-binder/model/contactsErrors"),i=require("../../app-binder/services/contactsTlvSerializer");const C=i.STRUCT_TYPE_EDIT_CONTACT_NAME;function f(n,r){const t=n.extractFieldByLength(r);if(!(!t||t.length!==r))return Uint8Array.from(t)}class T{name="renameContact";args;errorHelper=new p.CommandErrorHelper(d.CONTACTS_APP_ERRORS,d.contactsCommandErrorFactory);constructor(r){this.args=r}getApdu(){return new e.ApduBuilder({cla:a.RENAME_CONTACT_APDU_CLA,ins:a.RENAME_CONTACT_APDU_INS,p1:a.RENAME_CONTACT_P1,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(r){return c.Maybe.fromNullable(this.errorHelper.getError(r)).orDefaultLazy(()=>{if(r.data.length===0)return(0,e.CommandResultFactory)({data:{}});const t=new e.ApduParser(r),m=t.extract8BitUInt();if(m!==C)return(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError(`Expected struct_type 0x${C.toString(16)}, got ${m===void 0?"undefined":`0x${m.toString(16)}`}`)});const o=f(t,a.HMAC_NAME_BYTES);return o?(0,e.CommandResultFactory)({data:{hmacProof:o}}):(0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("hmac_name missing or truncated")})})}}0&&(module.exports={RenameContactCommand});
1
+ "use strict";var d=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var l=(n,e)=>{for(var t in e)d(n,t,{get:e[t],enumerable:!0})},R=(n,e,t,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of c(e))!A.call(n,a)&&a!==t&&d(n,a,{get:()=>e[a],enumerable:!(m=u(e,a))||m.enumerable});return n};var y=n=>R(d({},"__esModule",{value:!0}),n);var T={};l(T,{RenameContactCommand:()=>E});module.exports=y(T);var r=require("@ledgerhq/device-management-kit"),C=require("purify-ts"),o=require("../../app-binder/model/contactsConstants"),p=require("../../app-binder/model/contactsErrors"),i=require("../../app-binder/services/contactsTlvSerializer");const s=i.STRUCT_TYPE_EDIT_CONTACT_NAME;function f(n,e){const t=n.extractFieldByLength(e);if(!(!t||t.length!==e))return Uint8Array.from(t)}class E{name="renameContact";args;errorHelper=new p.ContactsCommandErrorHelper;constructor(e){this.args=e}getApdu(){return new r.ApduBuilder({cla:o.RENAME_CONTACT_APDU_CLA,ins:o.RENAME_CONTACT_APDU_INS,p1:o.RENAME_CONTACT_P1,p2:this.args.p2}).addBufferToData(this.args.data).build()}parseResponse(e){return C.Maybe.fromNullable(this.errorHelper.getError(e)).orDefaultLazy(()=>{if(e.data.length===0)return(0,r.CommandResultFactory)({data:{}});const t=new r.ApduParser(e),m=t.extract8BitUInt();if(m!==s)return(0,r.CommandResultFactory)({error:new r.InvalidStatusWordError(`Expected struct_type 0x${s.toString(16)}, got ${m===void 0?"undefined":`0x${m.toString(16)}`}`)});const a=f(t,o.HMAC_NAME_BYTES);return a?(0,r.CommandResultFactory)({data:{hmacProof:a}}):(0,r.CommandResultFactory)({error:new r.InvalidStatusWordError("hmac_name missing or truncated")})})}}0&&(module.exports={RenameContactCommand});
2
2
  //# sourceMappingURL=RenameContactCommand.js.map