@ledgerhq/device-contacts-kit 0.0.0-develop-20261105000842 → 0.0.0-develop-20261107000805
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/package.json +1 -1
- package/lib/esm/package.json +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/lib/cjs/api/ContactsManagerBuilder.test.js +0 -2
- package/lib/cjs/api/ContactsManagerBuilder.test.js.map +0 -7
- package/lib/cjs/api/model/ContactsVersionRequirements.test.js +0 -2
- package/lib/cjs/api/model/ContactsVersionRequirements.test.js.map +0 -7
- package/lib/cjs/internal/DefaultContactsManager.test.js +0 -2
- package/lib/cjs/internal/DefaultContactsManager.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/ProvideContactCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/RegisterIdentityCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/RenameContactCommand.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js +0 -2
- package/lib/cjs/internal/app-binder/contactsVersionGuards.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +0 -7
- package/lib/cjs/internal/app-binder/model/contactsValidation.test.js +0 -2
- package/lib/cjs/internal/app-binder/model/contactsValidation.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/contactsTlvSerializer.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/provideContact.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/provideContact.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/sendFramedContactsPayload.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js +0 -2
- package/lib/cjs/internal/app-binder/task/SendRenameContactTask.test.js.map +0 -7
- package/lib/cjs/internal/di.test.js +0 -2
- package/lib/cjs/internal/di.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +0 -7
- package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/RenameContactUseCase.test.js.map +0 -7
- package/lib/esm/api/ContactsManagerBuilder.test.js +0 -2
- package/lib/esm/api/ContactsManagerBuilder.test.js.map +0 -7
- package/lib/esm/api/model/ContactsVersionRequirements.test.js +0 -2
- package/lib/esm/api/model/ContactsVersionRequirements.test.js.map +0 -7
- package/lib/esm/internal/DefaultContactsManager.test.js +0 -2
- package/lib/esm/internal/DefaultContactsManager.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/EditExternalAddressScopeCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/ProvideContactCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/RegisterIdentityCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/RenameContactCommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/contactsVersionGuards.test.js +0 -2
- package/lib/esm/internal/app-binder/contactsVersionGuards.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js +0 -2
- package/lib/esm/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js +0 -2
- package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map +0 -7
- package/lib/esm/internal/app-binder/model/contactsValidation.test.js +0 -2
- package/lib/esm/internal/app-binder/model/contactsValidation.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js +0 -2
- package/lib/esm/internal/app-binder/services/contactsTlvSerializer.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/provideContact.test.js +0 -2
- package/lib/esm/internal/app-binder/services/provideContact.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js +0 -2
- package/lib/esm/internal/app-binder/services/sendFramedContactsPayload.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendEditExternalAddressScopeTask.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendRegisterIdentityTask.test.js.map +0 -7
- package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js +0 -2
- package/lib/esm/internal/app-binder/task/SendRenameContactTask.test.js.map +0 -7
- package/lib/esm/internal/di.test.js +0 -2
- package/lib/esm/internal/di.test.js.map +0 -7
- package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/EditExternalAddressIdentifierUseCase.test.js.map +0 -7
- package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/EditExternalAddressScopeUseCase.test.js.map +0 -7
- package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/RegisterExternalAddressUseCase.test.js.map +0 -7
- package/lib/esm/internal/use-cases/RenameContactUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/RenameContactUseCase.test.js.map +0 -7
- package/lib/types/api/ContactsManagerBuilder.test.d.ts +0 -2
- package/lib/types/api/ContactsManagerBuilder.test.d.ts.map +0 -1
- package/lib/types/api/model/ContactsVersionRequirements.test.d.ts +0 -2
- package/lib/types/api/model/ContactsVersionRequirements.test.d.ts.map +0 -1
- package/lib/types/internal/DefaultContactsManager.test.d.ts +0 -2
- package/lib/types/internal/DefaultContactsManager.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/EditExternalAddressScopeCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/ProvideContactCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/RegisterIdentityCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/RenameContactCommand.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts +0 -2
- package/lib/types/internal/app-binder/contactsVersionGuards.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RegisterExternalAddress/validateRegisterExternalAddressInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RenameContact/RenameContactDeviceAction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/RenameContact/validateRenameContactInput.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts +0 -4
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts +0 -12
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupGoToDashboardDAMock.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts +0 -2
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts +0 -17
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts +0 -15
- package/lib/types/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.d.ts.map +0 -1
- package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts +0 -2
- package/lib/types/internal/app-binder/model/contactsValidation.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/contactsTlvSerializer.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/provideContact.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/provideContact.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/sendFramedContactsPayload.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendEditExternalAddressScopeTask.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendRegisterIdentityTask.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts +0 -2
- package/lib/types/internal/app-binder/task/SendRenameContactTask.test.d.ts.map +0 -1
- package/lib/types/internal/di.test.d.ts +0 -2
- package/lib/types/internal/di.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/EditExternalAddressIdentifierUseCase.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/EditExternalAddressScopeUseCase.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/RegisterExternalAddressUseCase.test.d.ts.map +0 -1
- package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/RenameContactUseCase.test.d.ts.map +0 -1
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n OpenAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { assign, createMachine } from \"xstate\";\n\nexport const setupOpenAppDAMock = (error?: unknown) => {\n (OpenAppDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n states: {\n pending: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n }),\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (error ? Left(error) : Right(undefined)),\n }),\n ),\n }));\n};\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,uBAAAA,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAE5B,OAAS,UAAAC,EAAQ,iBAAAC,MAAqB,SAE/B,MAAMC,EAAsBC,GAAoB,CACpDP,EAA6B,mBAAmB,KAAO,CACtD,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,IAC3CK,EAAc,CACZ,QAAS,UACT,OAAQ,CACN,QAAS,CACP,MAAOD,EAAO,CACZ,kBAAmB,CACjB,wBAAyBH,EAAwB,cACnD,CACF,CAAC,EACD,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAOM,EAAQL,EAAKK,CAAK,EAAIJ,EAAM,MAAS,CACtD,CAAC,CACH,CACF,EAAE,CACJ",
|
|
6
|
-
"names": ["OpenAppDeviceAction", "UserInteractionRequired", "Left", "Right", "assign", "createMachine", "setupOpenAppDAMock", "error"]
|
|
7
|
-
}
|
package/lib/esm/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{UserInteractionRequired as t,WaitForAppAndVersionDeviceAction as o}from"@ledgerhq/device-management-kit";import{Left as r,Right as i}from"purify-ts";import{createMachine as a}from"xstate";const s=(e={name:"Ethereum",version:"1.15.0"},n=t.None)=>{o.mockImplementation(()=>({makeStateMachine:vi.fn().mockImplementation(()=>a({initial:"pending",context:{intermediateValue:{requiredUserInteraction:n}},states:{pending:{after:{0:"done"}},done:{type:"final"}},output:()=>"error"in e?r(e.error):i(e)}))}))};export{s as setupWaitForAppAndVersionDAMock};
|
|
2
|
-
//# sourceMappingURL=setupWaitForAppAndVersionDAMock.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/setupWaitForAppAndVersionDAMock.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n UserInteractionRequired,\n WaitForAppAndVersionDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { type Mock } from \"vitest\";\nimport { createMachine } from \"xstate\";\n\n/**\n * Mock WaitForAppAndVersionDeviceAction to resolve immediately with either a\n * fresh `{ name, version }` (default) or an error.\n *\n * The mock machine carries an `intermediateValue` in its context (matching the\n * real DA) so the parent's onSnapshot propagation has a defined value to read.\n * Pass `requiredUserInteraction` to have the child emit an interaction (e.g.\n * UnlockDevice for a locked device) before completing.\n */\nexport const setupWaitForAppAndVersionDAMock = (\n result: { name: string; version: string } | { error: unknown } = {\n name: \"Ethereum\",\n version: \"1.15.0\",\n },\n requiredUserInteraction: UserInteractionRequired = UserInteractionRequired.None,\n) => {\n (WaitForAppAndVersionDeviceAction as Mock).mockImplementation(() => ({\n makeStateMachine: vi.fn().mockImplementation(() =>\n createMachine({\n initial: \"pending\",\n context: {\n intermediateValue: { requiredUserInteraction },\n },\n states: {\n pending: {\n after: {\n 0: \"done\",\n },\n },\n done: {\n type: \"final\",\n },\n },\n output: () => (\"error\" in result ? Left(result.error) : Right(result)),\n }),\n ),\n }));\n};\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,2BAAAA,EACA,oCAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAE5B,OAAS,iBAAAC,MAAqB,SAWvB,MAAMC,EAAkC,CAC7CC,EAAiE,CAC/D,KAAM,WACN,QAAS,QACX,EACAC,EAAmDP,EAAwB,OACxE,CACFC,EAA0C,mBAAmB,KAAO,CACnE,iBAAkB,GAAG,GAAG,EAAE,mBAAmB,IAC3CG,EAAc,CACZ,QAAS,UACT,QAAS,CACP,kBAAmB,CAAE,wBAAAG,CAAwB,CAC/C,EACA,OAAQ,CACN,QAAS,CACP,MAAO,CACL,EAAG,MACL,CACF,EACA,KAAM,CACJ,KAAM,OACR,CACF,EACA,OAAQ,IAAO,UAAWD,EAASJ,EAAKI,EAAO,KAAK,EAAIH,EAAMG,CAAM,CACtE,CAAC,CACH,CACF,EAAE,CACJ",
|
|
6
|
-
"names": ["UserInteractionRequired", "WaitForAppAndVersionDeviceAction", "Left", "Right", "createMachine", "setupWaitForAppAndVersionDAMock", "result", "requiredUserInteraction"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function p(n,i,c,{onDone:a,onError:t}){const r=[],{observable:o,cancel:u}=n._execute(c);return o.subscribe({next:e=>{r.push(e)},error:e=>{t(e)},complete:()=>{try{expect(r).toEqual(i),a()}catch(e){t(e)}}}),{observable:o,cancel:u}}export{p as testDeviceActionStates};
|
|
2
|
-
//# sourceMappingURL=testDeviceActionStates.js.map
|
package/lib/esm/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/testDeviceActionStates.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type DeviceAction,\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n type DmkError,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\n\n/**\n * Test that the states emitted by a device action match the expected states.\n * @param deviceAction The device action to test.\n * @param expectedStates The expected states.\n * @param callbacks { onDone, onError } The callbacks to call when the test is done or an error occurs.\n */\nexport function testDeviceActionStates<\n Output,\n Input,\n Error extends DmkError,\n IntermediateValue extends DeviceActionIntermediateValue,\n>(\n deviceAction: DeviceAction<Output, Input, Error, IntermediateValue>,\n expectedStates: Array<DeviceActionState<Output, Error, IntermediateValue>>,\n internalApi: InternalApi,\n {\n onDone,\n onError,\n }: {\n onDone: () => void;\n onError: (error: Error) => void;\n },\n) {\n const observedStates: Array<\n DeviceActionState<Output, Error, IntermediateValue>\n > = [];\n\n const { observable, cancel } = deviceAction._execute(internalApi);\n observable.subscribe({\n next: (state) => {\n observedStates.push(state);\n },\n error: (error) => {\n onError(error);\n },\n complete: () => {\n try {\n expect(observedStates).toEqual(expectedStates);\n onDone();\n } catch (e) {\n onError(e as Error);\n }\n },\n });\n return { observable, cancel };\n}\n"],
|
|
5
|
-
"mappings": "AAcO,SAASA,EAMdC,EACAC,EACAC,EACA,CACE,OAAAC,EACA,QAAAC,CACF,EAIA,CACA,MAAMC,EAEF,CAAC,EAEC,CAAE,WAAAC,EAAY,OAAAC,CAAO,EAAIP,EAAa,SAASE,CAAW,EAChE,OAAAI,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfH,EAAe,KAAKG,CAAK,CAC3B,EACA,MAAQC,GAAU,CAChBL,EAAQK,CAAK,CACf,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOJ,CAAc,EAAE,QAAQJ,CAAc,EAC7CE,EAAO,CACT,OAAS,EAAG,CACVC,EAAQ,CAAU,CACpB,CACF,CACF,CAAC,EACM,CAAE,WAAAE,EAAY,OAAAC,CAAO,CAC9B",
|
|
6
|
-
"names": ["testDeviceActionStates", "deviceAction", "expectedStates", "internalApi", "onDone", "onError", "observedStates", "observable", "cancel", "state", "error"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CONTACT_NAME_BUFFER_LENGTH as o,ContactsValidationError as i,validateByteLength as c,validateChainId as n,validateDerivationPath as r,validateFamilyIdentifiers as t,validatePrintableLabel as a}from"./contactsValidation";const d="44'/60'/0'/0/0";describe("contactsValidation",()=>{describe("validatePrintableLabel",()=>{const e={field:"name",bufferLength:o};it("accepts a printable ASCII label within the buffer",()=>{expect(()=>a("Alice",e)).not.toThrow()}),it("rejects an empty label",()=>{expect(()=>a("",e)).toThrow(i)}),it("rejects a label exceeding bufferLength - 1 bytes",()=>{expect(()=>a("x".repeat(o),e)).toThrow(i)}),it("rejects non-ASCII / accented characters (byte-level isprint)",()=>{expect(()=>a("Am\xE9lie",e)).toThrow(i)})}),describe("validateByteLength",()=>{it("accepts an exact-length buffer",()=>{expect(()=>c(new Uint8Array(20),{field:"identifier",expectedBytes:20})).not.toThrow()}),it("rejects a wrong-length buffer",()=>{expect(()=>c(new Uint8Array(19),{field:"identifier",expectedBytes:20})).toThrow(i)})}),describe("validateChainId",()=>{it("accepts a positive integer and bigint",()=>{expect(()=>n(1)).not.toThrow(),expect(()=>n(56n)).not.toThrow()}),it("rejects zero, negative, and non-integer",()=>{expect(()=>n(0)).toThrow(i),expect(()=>n(-1)).toThrow(i),expect(()=>n(1.5)).toThrow(i)})}),describe("validateDerivationPath",()=>{it("accepts a representative BIP32 path",()=>{expect(()=>r(d)).not.toThrow()}),it("accepts m-prefixed and hardened paths",()=>{expect(()=>r("m/44'/60'/0'/0/0")).not.toThrow()}),it("rejects a non-numeric segment",()=>{expect(()=>r("44'/x/0")).toThrow(i)})}),describe("validateFamilyIdentifiers",()=>{const e=l=>[{field:"identifier",value:new Uint8Array(l).fill(17)}];it("returns the BLOCKCHAIN_FAMILY byte, case-insensitively",()=>{expect(t({blockchainFamily:"Ethereum",identifiers:e(20),chainId:1n})).toBe(1),expect(t({blockchainFamily:"solana",identifiers:e(32)})).toBe(2),expect(t({blockchainFamily:"tron",identifiers:e(21)})).toBe(6)}),it("rejects an unknown family",()=>{expect(()=>t({blockchainFamily:"dogecoin",identifiers:e(20)})).toThrow("Unsupported blockchain family: dogecoin")}),it("requires 20-byte identifiers and a chainId for Ethereum",()=>{expect(()=>t({blockchainFamily:"ethereum",identifiers:e(32),chainId:1n})).toThrow("identifier is 32 bytes, expected 20."),expect(()=>t({blockchainFamily:"ethereum",identifiers:e(20)})).toThrow("chainId is required for the Ethereum blockchain family.")}),it("requires 32-byte identifiers and no chainId for Solana",()=>{expect(()=>t({blockchainFamily:"solana",identifiers:e(20)})).toThrow("identifier is 20 bytes, expected 32."),expect(()=>t({blockchainFamily:"solana",identifiers:e(32),chainId:101n})).toThrow("chainId is not allowed for the Solana blockchain family.")}),it("only requires non-empty identifiers for other families",()=>{expect(()=>t({blockchainFamily:"tron",identifiers:e(0)})).toThrow("identifier must not be empty.")}),it("range-checks a chainId",()=>{expect(()=>t({blockchainFamily:"ethereum",identifiers:e(20),chainId:0n})).toThrow(i)})})});
|
|
2
|
-
//# sourceMappingURL=contactsValidation.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/model/contactsValidation.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n CONTACT_NAME_BUFFER_LENGTH,\n ContactsValidationError,\n validateByteLength,\n validateChainId,\n validateDerivationPath,\n validateFamilyIdentifiers,\n validatePrintableLabel,\n} from \"./contactsValidation\";\n\n// A representative BIP32 path (used by Ledger-Account ops, not external\n// addresses). Kept here to exercise the shared validator.\nconst SAMPLE_DERIVATION_PATH = \"44'/60'/0'/0/0\";\n\ndescribe(\"contactsValidation\", () => {\n describe(\"validatePrintableLabel\", () => {\n const opts = { field: \"name\", bufferLength: CONTACT_NAME_BUFFER_LENGTH };\n\n it(\"accepts a printable ASCII label within the buffer\", () => {\n expect(() => validatePrintableLabel(\"Alice\", opts)).not.toThrow();\n });\n\n it(\"rejects an empty label\", () => {\n expect(() => validatePrintableLabel(\"\", opts)).toThrow(\n ContactsValidationError,\n );\n });\n\n it(\"rejects a label exceeding bufferLength - 1 bytes\", () => {\n expect(() =>\n validatePrintableLabel(\"x\".repeat(CONTACT_NAME_BUFFER_LENGTH), opts),\n ).toThrow(ContactsValidationError);\n });\n\n it(\"rejects non-ASCII / accented characters (byte-level isprint)\", () => {\n expect(() => validatePrintableLabel(\"Am\u00E9lie\", opts)).toThrow(\n ContactsValidationError,\n );\n });\n });\n\n describe(\"validateByteLength\", () => {\n it(\"accepts an exact-length buffer\", () => {\n expect(() =>\n validateByteLength(new Uint8Array(20), {\n field: \"identifier\",\n expectedBytes: 20,\n }),\n ).not.toThrow();\n });\n\n it(\"rejects a wrong-length buffer\", () => {\n expect(() =>\n validateByteLength(new Uint8Array(19), {\n field: \"identifier\",\n expectedBytes: 20,\n }),\n ).toThrow(ContactsValidationError);\n });\n });\n\n describe(\"validateChainId\", () => {\n it(\"accepts a positive integer and bigint\", () => {\n expect(() => validateChainId(1)).not.toThrow();\n expect(() => validateChainId(56n)).not.toThrow();\n });\n\n it(\"rejects zero, negative, and non-integer\", () => {\n expect(() => validateChainId(0)).toThrow(ContactsValidationError);\n expect(() => validateChainId(-1)).toThrow(ContactsValidationError);\n expect(() => validateChainId(1.5)).toThrow(ContactsValidationError);\n });\n });\n\n describe(\"validateDerivationPath\", () => {\n it(\"accepts a representative BIP32 path\", () => {\n expect(() =>\n validateDerivationPath(SAMPLE_DERIVATION_PATH),\n ).not.toThrow();\n });\n\n it(\"accepts m-prefixed and hardened paths\", () => {\n expect(() => validateDerivationPath(\"m/44'/60'/0'/0/0\")).not.toThrow();\n });\n\n it(\"rejects a non-numeric segment\", () => {\n expect(() => validateDerivationPath(\"44'/x/0\")).toThrow(\n ContactsValidationError,\n );\n });\n });\n describe(\"validateFamilyIdentifiers\", () => {\n const identifier = (length: number) => [\n { field: \"identifier\", value: new Uint8Array(length).fill(0x11) },\n ];\n\n it(\"returns the BLOCKCHAIN_FAMILY byte, case-insensitively\", () => {\n expect(\n validateFamilyIdentifiers({\n blockchainFamily: \"Ethereum\",\n identifiers: identifier(20),\n chainId: 1n,\n }),\n ).toBe(0x01);\n expect(\n validateFamilyIdentifiers({\n blockchainFamily: \"solana\",\n identifiers: identifier(32),\n }),\n ).toBe(0x02);\n expect(\n validateFamilyIdentifiers({\n blockchainFamily: \"tron\",\n identifiers: identifier(21),\n }),\n ).toBe(0x06);\n });\n\n it(\"rejects an unknown family\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"dogecoin\",\n identifiers: identifier(20),\n }),\n ).toThrow(\"Unsupported blockchain family: dogecoin\");\n });\n\n it(\"requires 20-byte identifiers and a chainId for Ethereum\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"ethereum\",\n identifiers: identifier(32),\n chainId: 1n,\n }),\n ).toThrow(\"identifier is 32 bytes, expected 20.\");\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"ethereum\",\n identifiers: identifier(20),\n }),\n ).toThrow(\"chainId is required for the Ethereum blockchain family.\");\n });\n\n it(\"requires 32-byte identifiers and no chainId for Solana\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"solana\",\n identifiers: identifier(20),\n }),\n ).toThrow(\"identifier is 20 bytes, expected 32.\");\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"solana\",\n identifiers: identifier(32),\n chainId: 101n,\n }),\n ).toThrow(\"chainId is not allowed for the Solana blockchain family.\");\n });\n\n it(\"only requires non-empty identifiers for other families\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"tron\",\n identifiers: identifier(0),\n }),\n ).toThrow(\"identifier must not be empty.\");\n });\n\n it(\"range-checks a chainId\", () => {\n expect(() =>\n validateFamilyIdentifiers({\n blockchainFamily: \"ethereum\",\n identifiers: identifier(20),\n chainId: 0n,\n }),\n ).toThrow(ContactsValidationError);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CONTACT_NAME_BUFFER_LENGTH", "ContactsValidationError", "validateByteLength", "validateChainId", "validateDerivationPath", "validateFamilyIdentifiers", "validatePrintableLabel", "SAMPLE_DERIVATION_PATH", "opts", "identifier", "length"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ByteArrayBuilder as i}from"@ledgerhq/device-management-kit";import{CONTACTS_TLV_TAG as t,encodeTlvAscii as c,encodeTlvBuffer as o,encodeTlvChainId as x,encodeTlvUInt8 as a,packDerivationPath as l}from"./contactsTlvSerializer";describe("contactsTlvSerializer",()=>{describe("DERIVATION_PATH tag",()=>{it("is 0x69 (not the pre-1.23 value 0x21)",()=>{expect(t.DERIVATION_PATH).toBe(105)}),it("encodes a packed path under tag 0x69",()=>{const e=new i,r=l([2147483692,2147483708,2147483648]);o(e,t.DERIVATION_PATH,r),expect(e.build()).toStrictEqual(Uint8Array.from([105,13,3,128,0,0,44,128,0,0,60,128,0,0,0]))})}),describe("primitive encoders",()=>{it("encodes a single-byte TLV (tag < 0x80, length 1)",()=>{const e=new i;a(e,t.STRUCT_TYPE,45),expect(e.build()).toStrictEqual(Uint8Array.from([1,1,45]))}),it("encodes tags >= 0x80 as the 2-byte DER long form [0x81, tag]",()=>{const e=new i;c(e,t.CONTACT_NAME,"AB"),expect(e.build()).toStrictEqual(Uint8Array.from([129,240,2,65,66]))}),it("encodes chainId as minimal big-endian bytes",()=>{const e=new i;x(e,t.CHAIN_ID,1n),expect(e.build()).toStrictEqual(Uint8Array.from([35,1,1]));const r=new i;x(r,t.CHAIN_ID,56),expect(r.build()).toStrictEqual(Uint8Array.from([35,1,56]))}),it("emits DER long-form length for payloads >= 0x80 bytes",()=>{const e=new i,r=new Uint8Array(200).fill(171);o(e,t.ACCOUNT_IDENTIFIER,r);const n=e.build();expect(Array.from(n.slice(0,4))).toEqual([129,242,129,200]),expect(n.length).toBe(204)}),it("rejects a non-positive chainId",()=>{const e=new i;expect(()=>x(e,t.CHAIN_ID,0)).toThrow()})})});
|
|
2
|
-
//# sourceMappingURL=contactsTlvSerializer.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/services/contactsTlvSerializer.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { ByteArrayBuilder } from \"@ledgerhq/device-management-kit\";\n\nimport {\n CONTACTS_TLV_TAG,\n encodeTlvAscii,\n encodeTlvBuffer,\n encodeTlvChainId,\n encodeTlvUInt8,\n packDerivationPath,\n} from \"./contactsTlvSerializer\";\n\ndescribe(\"contactsTlvSerializer\", () => {\n describe(\"DERIVATION_PATH tag\", () => {\n // Pins the ETH-app 1.23 / BOLOS SDK protocol change (commit 963d72b7):\n // the address-book derivation-path tag moved from 0x21 to 0x69. Sending the\n // old tag makes the on-device TLV parser reject with 0x6A80.\n it(\"is 0x69 (not the pre-1.23 value 0x21)\", () => {\n expect(CONTACTS_TLV_TAG.DERIVATION_PATH).toBe(0x69);\n });\n\n it(\"encodes a packed path under tag 0x69\", () => {\n const builder = new ByteArrayBuilder();\n const path = packDerivationPath([0x8000002c, 0x8000003c, 0x80000000]);\n\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.DERIVATION_PATH, path);\n\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([\n 0x69, // DERIVATION_PATH tag\n 0x0d, // length: 1 count byte + 3 * 4-byte segments\n 0x03, // segment count\n 0x80,\n 0x00,\n 0x00,\n 0x2c, // 44'\n 0x80,\n 0x00,\n 0x00,\n 0x3c, // 60'\n 0x80,\n 0x00,\n 0x00,\n 0x00, // 0'\n ]),\n );\n });\n });\n\n describe(\"primitive encoders\", () => {\n it(\"encodes a single-byte TLV (tag < 0x80, length 1)\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvUInt8(builder, CONTACTS_TLV_TAG.STRUCT_TYPE, 0x2d);\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x01, 0x01, 0x2d]),\n );\n });\n\n it(\"encodes tags >= 0x80 as the 2-byte DER long form [0x81, tag]\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvAscii(builder, CONTACTS_TLV_TAG.CONTACT_NAME, \"AB\");\n // Tag 0xf0 -> DER long form [0x81, 0xf0], length 2, ASCII \"AB\".\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x81, 0xf0, 0x02, 0x41, 0x42]),\n );\n });\n\n it(\"encodes chainId as minimal big-endian bytes\", () => {\n const builder = new ByteArrayBuilder();\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, 1n);\n expect(builder.build()).toStrictEqual(\n Uint8Array.from([0x23, 0x01, 0x01]),\n );\n\n const builder2 = new ByteArrayBuilder();\n encodeTlvChainId(builder2, CONTACTS_TLV_TAG.CHAIN_ID, 56);\n expect(builder2.build()).toStrictEqual(\n Uint8Array.from([0x23, 0x01, 0x38]),\n );\n });\n\n it(\"emits DER long-form length for payloads >= 0x80 bytes\", () => {\n const builder = new ByteArrayBuilder();\n const value = new Uint8Array(200).fill(0xab);\n encodeTlvBuffer(builder, CONTACTS_TLV_TAG.ACCOUNT_IDENTIFIER, value);\n const out = builder.build();\n // tag 0xf2 -> [0x81, 0xf2], then long-form length 0x81 0xc8 (200).\n expect(Array.from(out.slice(0, 4))).toEqual([0x81, 0xf2, 0x81, 0xc8]);\n expect(out.length).toBe(4 + 200);\n });\n\n it(\"rejects a non-positive chainId\", () => {\n const builder = new ByteArrayBuilder();\n expect(() =>\n encodeTlvChainId(builder, CONTACTS_TLV_TAG.CHAIN_ID, 0),\n ).toThrow();\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,oBAAAA,MAAwB,kCAEjC,OACE,oBAAAC,EACA,kBAAAC,EACA,mBAAAC,EACA,oBAAAC,EACA,kBAAAC,EACA,sBAAAC,MACK,0BAEP,SAAS,wBAAyB,IAAM,CACtC,SAAS,sBAAuB,IAAM,CAIpC,GAAG,wCAAyC,IAAM,CAChD,OAAOL,EAAiB,eAAe,EAAE,KAAK,GAAI,CACpD,CAAC,EAED,GAAG,uCAAwC,IAAM,CAC/C,MAAMM,EAAU,IAAIP,EACdQ,EAAOF,EAAmB,CAAC,WAAY,WAAY,UAAU,CAAC,EAEpEH,EAAgBI,EAASN,EAAiB,gBAAiBO,CAAI,EAE/D,OAAOD,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CACd,IACA,GACA,EACA,IACA,EACA,EACA,GACA,IACA,EACA,EACA,GACA,IACA,EACA,EACA,CACF,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,GAAG,mDAAoD,IAAM,CAC3D,MAAMA,EAAU,IAAIP,EACpBK,EAAeE,EAASN,EAAiB,YAAa,EAAI,EAC1D,OAAOM,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,EAAM,EAAM,EAAI,CAAC,CACpC,CACF,CAAC,EAED,GAAG,+DAAgE,IAAM,CACvE,MAAMA,EAAU,IAAIP,EACpBE,EAAeK,EAASN,EAAiB,aAAc,IAAI,EAE3D,OAAOM,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,IAAM,IAAM,EAAM,GAAM,EAAI,CAAC,CAChD,CACF,CAAC,EAED,GAAG,8CAA+C,IAAM,CACtD,MAAMA,EAAU,IAAIP,EACpBI,EAAiBG,EAASN,EAAiB,SAAU,EAAE,EACvD,OAAOM,EAAQ,MAAM,CAAC,EAAE,cACtB,WAAW,KAAK,CAAC,GAAM,EAAM,CAAI,CAAC,CACpC,EAEA,MAAME,EAAW,IAAIT,EACrBI,EAAiBK,EAAUR,EAAiB,SAAU,EAAE,EACxD,OAAOQ,EAAS,MAAM,CAAC,EAAE,cACvB,WAAW,KAAK,CAAC,GAAM,EAAM,EAAI,CAAC,CACpC,CACF,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,MAAMF,EAAU,IAAIP,EACdU,EAAQ,IAAI,WAAW,GAAG,EAAE,KAAK,GAAI,EAC3CP,EAAgBI,EAASN,EAAiB,mBAAoBS,CAAK,EACnE,MAAMC,EAAMJ,EAAQ,MAAM,EAE1B,OAAO,MAAM,KAAKI,EAAI,MAAM,EAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACpE,OAAOA,EAAI,MAAM,EAAE,KAAK,GAAO,CACjC,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,MAAMJ,EAAU,IAAIP,EACpB,OAAO,IACLI,EAAiBG,EAASN,EAAiB,SAAU,CAAC,CACxD,EAAE,QAAQ,CACZ,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["ByteArrayBuilder", "CONTACTS_TLV_TAG", "encodeTlvAscii", "encodeTlvBuffer", "encodeTlvChainId", "encodeTlvUInt8", "packDerivationPath", "builder", "path", "builder2", "value", "out"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{bufferToHexaString as i,CommandResultFactory as s,CommandResultStatus as r}from"@ledgerhq/device-management-kit";import{ProvideContactCommand as p}from"../../app-binder/command/ProvideContactCommand";import{makeDeviceActionInternalApiMock as d}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{ContactsCommandError as f}from"../../app-binder/model/contactsErrors";import{buildProvideContactPayload as t,sendProvideContactPayload as l}from"./provideContact";const h=new Uint8Array(20).fill(17),y=new Uint8Array(64).fill(34),C=new Uint8Array(32).fill(51),u=new Uint8Array(32).fill(68),o={contactName:"Alice",scope:"Ethereum",identifier:h,groupHandle:y,hmacProof:C,hmacRest:u,blockchainFamily:"ethereum",chainId:1n},x="010133",T="020101",I="81f005416c696365",E="81f108457468657265756d",_="81f214"+"11".repeat(20),c="81f640"+"22".repeat(64),A="230101",P="510101",b="2920"+"33".repeat(32),g="81f720"+"44".repeat(32);describe("buildProvideContactPayload",()=>{it("encodes every tag in the order the spec lists",()=>{const e=t(o);expect(i(e,!1)).toBe(x+T+I+E+_+c+A+P+b+g)}),it("fits an Ethereum contact in a single 255-byte chunk",()=>{expect(t(o).length).toBeLessThanOrEqual(253)}),it("omits CHAIN_ID for a family that does not carry one",()=>{const e=t({...o,blockchainFamily:"tron",chainId:void 0});expect(i(e,!1)).toContain(c+"510106")}),it("encodes a multi-byte chain id big-endian with no leading zeroes",()=>{const e=t({...o,chainId:8453n});expect(i(e,!1)).toContain("23022105")}),it("accepts the family name case-insensitively",()=>{expect(t({...o,blockchainFamily:"Ethereum"})).toStrictEqual(t(o))}),it("encodes a Solana contact with its family byte and no CHAIN_ID",()=>{const e=t({...o,identifier:new Uint8Array(32).fill(17),blockchainFamily:"solana",chainId:void 0});expect(i(e,!1)).toContain("81f220"+"11".repeat(32)+c+"510102")}),it("throws on a Solana identifier that is not 32 bytes",()=>{expect(()=>t({...o,blockchainFamily:"solana",chainId:void 0})).toThrow("identifier is 20 bytes, expected 32.")}),it("throws on an unknown blockchain family",()=>{expect(()=>t({...o,blockchainFamily:"dogecoin"})).toThrow("Unsupported blockchain family: dogecoin")})});describe("sendProvideContactPayload",()=>{it("sends one chunk under P2=0x00, prefixed with the 2-byte BE total length",async()=>{const e=d();e.sendCommand.mockResolvedValue(s({data:void 0}));const n=t(o),m=await l(e,{payload:n});expect(e.sendCommand).toHaveBeenCalledTimes(1);const a=e.sendCommand.mock.calls[0][0];expect(a).toBeInstanceOf(p),expect(a.args.p2).toBe(0),expect(a.args.data.slice(0,2)).toStrictEqual(Uint8Array.from([n.length>>8&255,n.length&255])),expect(a.args.data.slice(2)).toStrictEqual(n),expect(m.status).toBe(r.Success)}),it("propagates a device rejection instead of throwing",async()=>{const e=d();e.sendCommand.mockResolvedValue(s({error:new f({errorCode:"6982",message:"wrong seed"})}));const n=await l(e,{payload:t(o)});expect(n.status).toBe(r.Error)})});
|
|
2
|
-
//# sourceMappingURL=provideContact.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/services/provideContact.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n bufferToHexaString,\n CommandResultFactory,\n CommandResultStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ProvideContactInput } from \"@api/model/ProvideContact\";\nimport { ProvideContactCommand } from \"@internal/app-binder/command/ProvideContactCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { ContactsCommandError } from \"@internal/app-binder/model/contactsErrors\";\n\nimport {\n buildProvideContactPayload,\n sendProvideContactPayload,\n} from \"./provideContact\";\n\nconst IDENTIFIER = new Uint8Array(20).fill(0x11);\nconst GROUP_HANDLE = new Uint8Array(64).fill(0x22);\nconst HMAC_PROOF = new Uint8Array(32).fill(0x33);\nconst HMAC_REST = new Uint8Array(32).fill(0x44);\n\nconst INPUT: ProvideContactInput = {\n contactName: \"Alice\",\n scope: \"Ethereum\",\n identifier: IDENTIFIER,\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF,\n hmacRest: HMAC_REST,\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n};\n\n// Tags >= 0x80 use the DER long form (0x81 then the tag), hence the \"81\" prefix\n// on CONTACT_NAME (0xf0), SCOPE (0xf1), ACCOUNT_IDENTIFIER (0xf2),\n// GROUP_HANDLE (0xf6) and HMAC_REST (0xf7).\nconst STRUCT_TYPE_TLV = \"010133\";\nconst STRUCT_VERSION_TLV = \"020101\";\nconst CONTACT_NAME_TLV = \"81f005\" + \"416c696365\"; // \"Alice\"\nconst SCOPE_TLV = \"81f108\" + \"457468657265756d\"; // \"Ethereum\"\nconst IDENTIFIER_TLV = \"81f214\" + \"11\".repeat(20);\nconst GROUP_HANDLE_TLV = \"81f640\" + \"22\".repeat(64);\nconst CHAIN_ID_TLV = \"230101\";\nconst FAMILY_TLV = \"510101\";\nconst HMAC_PROOF_TLV = \"2920\" + \"33\".repeat(32);\nconst HMAC_REST_TLV = \"81f720\" + \"44\".repeat(32);\n\ndescribe(\"buildProvideContactPayload\", () => {\n it(\"encodes every tag in the order the spec lists\", () => {\n const payload = buildProvideContactPayload(INPUT);\n\n expect(bufferToHexaString(payload, false)).toBe(\n STRUCT_TYPE_TLV +\n STRUCT_VERSION_TLV +\n CONTACT_NAME_TLV +\n SCOPE_TLV +\n IDENTIFIER_TLV +\n GROUP_HANDLE_TLV +\n CHAIN_ID_TLV +\n FAMILY_TLV +\n HMAC_PROOF_TLV +\n HMAC_REST_TLV,\n );\n });\n\n it(\"fits an Ethereum contact in a single 255-byte chunk\", () => {\n expect(buildProvideContactPayload(INPUT).length).toBeLessThanOrEqual(253);\n });\n\n it(\"omits CHAIN_ID for a family that does not carry one\", () => {\n const payload = buildProvideContactPayload({\n ...INPUT,\n blockchainFamily: \"tron\",\n chainId: undefined,\n });\n\n expect(bufferToHexaString(payload, false)).toContain(\n GROUP_HANDLE_TLV + \"510106\",\n );\n });\n\n it(\"encodes a multi-byte chain id big-endian with no leading zeroes\", () => {\n const payload = buildProvideContactPayload({ ...INPUT, chainId: 8453n });\n\n expect(bufferToHexaString(payload, false)).toContain(\"2302\" + \"2105\");\n });\n\n it(\"accepts the family name case-insensitively\", () => {\n expect(\n buildProvideContactPayload({ ...INPUT, blockchainFamily: \"Ethereum\" }),\n ).toStrictEqual(buildProvideContactPayload(INPUT));\n });\n\n it(\"encodes a Solana contact with its family byte and no CHAIN_ID\", () => {\n const payload = buildProvideContactPayload({\n ...INPUT,\n identifier: new Uint8Array(32).fill(0x11),\n blockchainFamily: \"solana\",\n chainId: undefined,\n });\n\n expect(bufferToHexaString(payload, false)).toContain(\n \"81f220\" + \"11\".repeat(32) + GROUP_HANDLE_TLV + \"510102\",\n );\n });\n\n it(\"throws on a Solana identifier that is not 32 bytes\", () => {\n expect(() =>\n buildProvideContactPayload({\n ...INPUT,\n blockchainFamily: \"solana\",\n chainId: undefined,\n }),\n ).toThrow(\"identifier is 20 bytes, expected 32.\");\n });\n\n it(\"throws on an unknown blockchain family\", () => {\n expect(() =>\n buildProvideContactPayload({ ...INPUT, blockchainFamily: \"dogecoin\" }),\n ).toThrow(\"Unsupported blockchain family: dogecoin\");\n });\n});\n\ndescribe(\"sendProvideContactPayload\", () => {\n it(\"sends one chunk under P2=0x00, prefixed with the 2-byte BE total length\", async () => {\n const api = makeDeviceActionInternalApiMock();\n api.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n const payload = buildProvideContactPayload(INPUT);\n\n const result = await sendProvideContactPayload(api, { payload });\n\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n const command = api.sendCommand.mock.calls[0]![0] as ProvideContactCommand;\n expect(command).toBeInstanceOf(ProvideContactCommand);\n expect(command.args.p2).toBe(0x00);\n expect(command.args.data.slice(0, 2)).toStrictEqual(\n Uint8Array.from([(payload.length >> 8) & 0xff, payload.length & 0xff]),\n );\n expect(command.args.data.slice(2)).toStrictEqual(payload);\n expect(result.status).toBe(CommandResultStatus.Success);\n });\n\n it(\"propagates a device rejection instead of throwing\", async () => {\n const api = makeDeviceActionInternalApiMock();\n api.sendCommand.mockResolvedValue(\n CommandResultFactory({\n error: new ContactsCommandError({\n errorCode: \"6982\",\n message: \"wrong seed\",\n }),\n }),\n );\n\n const result = await sendProvideContactPayload(api, {\n payload: buildProvideContactPayload(INPUT),\n });\n\n expect(result.status).toBe(CommandResultStatus.Error);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["bufferToHexaString", "CommandResultFactory", "CommandResultStatus", "ProvideContactCommand", "makeDeviceActionInternalApiMock", "ContactsCommandError", "buildProvideContactPayload", "sendProvideContactPayload", "IDENTIFIER", "GROUP_HANDLE", "HMAC_PROOF", "HMAC_REST", "INPUT", "STRUCT_TYPE_TLV", "STRUCT_VERSION_TLV", "CONTACT_NAME_TLV", "SCOPE_TLV", "IDENTIFIER_TLV", "GROUP_HANDLE_TLV", "CHAIN_ID_TLV", "FAMILY_TLV", "HMAC_PROOF_TLV", "HMAC_REST_TLV", "payload", "api", "result", "command"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as c,InvalidStatusWordError as y}from"@ledgerhq/device-management-kit";import{sendFramedContactsPayload as m}from"./sendFramedContactsPayload";function l(){return{sendCommand:vi.fn()}}function r(e,n=66){return new Uint8Array(e).fill(n)}const d=()=>vi.fn((e,n)=>({name:"test",args:{chunk:e,p2:n},getApdu:vi.fn(),parseResponse:vi.fn()}));describe("sendFramedContactsPayload",()=>{it("single-chunk: prepends BE length, uses P2=0x00, returns command result",async()=>{const e=l(),n=c({data:{ok:!0}});e.sendCommand.mockResolvedValueOnce(n);const t=d(),o=await m(e,{payload:r(100),p1:1,makeCommand:t});expect(t).toHaveBeenCalledTimes(1);const[a,s]=t.mock.calls[0];expect(s).toBe(0),expect(a[0]).toBe(0),expect(a[1]).toBe(100),expect(a.length).toBe(102),expect(o).toBe(n)}),it("multi-chunk: splits into <=255B pieces, P2 0x00 then 0x80, prefix on first only",async()=>{const e=l(),n=c({data:{}}),t=c({data:{ok:!0}});e.sendCommand.mockResolvedValueOnce(n).mockResolvedValueOnce(n).mockResolvedValueOnce(t);const o=d(),a=await m(e,{payload:r(600,85),p1:1,makeCommand:o});expect(o).toHaveBeenCalledTimes(3);const[s,p]=o.mock.calls[0],[i,u]=o.mock.calls[1],[k,x]=o.mock.calls[2];expect([p,u,x]).toEqual([0,128,128]),expect([s.length,i.length,k.length]).toEqual([255,255,92]),expect(s[0]).toBe(2),expect(s[1]).toBe(88),expect(i[0]).toBe(85),expect(a).toBe(t)}),it("short-circuits on intermediate-chunk error without dispatching remaining chunks",async()=>{const e=l(),n=c({error:new y("kaboom")});e.sendCommand.mockResolvedValueOnce(n);const t=d(),o=await m(e,{payload:r(600),p1:1,makeCommand:t});expect(e.sendCommand).toHaveBeenCalledTimes(1),expect(t).toHaveBeenCalledTimes(1),expect(o).toBe(n)})});
|
|
2
|
-
//# sourceMappingURL=sendFramedContactsPayload.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/services/sendFramedContactsPayload.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type Command,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { sendFramedContactsPayload } from \"./sendFramedContactsPayload\";\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return {\n sendCommand: vi.fn(),\n } as unknown as InternalApi & { sendCommand: ReturnType<typeof vi.fn> };\n}\n\nfunction makePayload(byteCount: number, fillByte = 0x42): Uint8Array {\n return new Uint8Array(byteCount).fill(fillByte);\n}\n\nconst makeCommandFactory = () =>\n vi.fn(\n (chunk: Uint8Array, p2: number) =>\n ({\n name: \"test\",\n args: { chunk, p2 },\n getApdu: vi.fn(),\n parseResponse: vi.fn(),\n }) as unknown as Command<unknown, unknown, unknown>,\n );\n\ndescribe(\"sendFramedContactsPayload\", () => {\n it(\"single-chunk: prepends BE length, uses P2=0x00, returns command result\", async () => {\n const api = makeApiMock();\n const finalResult = CommandResultFactory({ data: { ok: true } });\n api.sendCommand.mockResolvedValueOnce(finalResult);\n const makeCommand = makeCommandFactory();\n\n const result = await sendFramedContactsPayload(api, {\n payload: makePayload(100),\n p1: 0x01,\n makeCommand,\n });\n\n expect(makeCommand).toHaveBeenCalledTimes(1);\n const [chunk, p2] = makeCommand.mock.calls[0]!;\n expect(p2).toBe(0x00);\n // 2-byte BE length prefix = 100 \u2192 0x00, 0x64.\n expect(chunk[0]).toBe(0x00);\n expect(chunk[1]).toBe(0x64);\n expect(chunk.length).toBe(102);\n expect(result).toBe(finalResult);\n });\n\n it(\"multi-chunk: splits into <=255B pieces, P2 0x00 then 0x80, prefix on first only\", async () => {\n const api = makeApiMock();\n const intermediateOk = CommandResultFactory({ data: {} });\n const finalResult = CommandResultFactory({ data: { ok: true } });\n api.sendCommand\n .mockResolvedValueOnce(intermediateOk)\n .mockResolvedValueOnce(intermediateOk)\n .mockResolvedValueOnce(finalResult);\n const makeCommand = makeCommandFactory();\n\n // 600 bytes payload \u2192 602 with frame prefix \u2192 3 chunks (255 + 255 + 92).\n const result = await sendFramedContactsPayload(api, {\n payload: makePayload(600, 0x55),\n p1: 0x01,\n makeCommand,\n });\n\n expect(makeCommand).toHaveBeenCalledTimes(3);\n const [chunk0, p20] = makeCommand.mock.calls[0]!;\n const [chunk1, p21] = makeCommand.mock.calls[1]!;\n const [chunk2, p22] = makeCommand.mock.calls[2]!;\n expect([p20, p21, p22]).toEqual([0x00, 0x80, 0x80]);\n expect([chunk0.length, chunk1.length, chunk2.length]).toEqual([\n 255, 255, 92,\n ]);\n // Frame prefix (600 = 0x0258) only on the first chunk.\n expect(chunk0[0]).toBe(0x02);\n expect(chunk0[1]).toBe(0x58);\n // Continuation chunks begin with raw payload bytes.\n expect(chunk1[0]).toBe(0x55);\n expect(result).toBe(finalResult);\n });\n\n it(\"short-circuits on intermediate-chunk error without dispatching remaining chunks\", async () => {\n const api = makeApiMock();\n const errorResult: CommandResult<unknown> = CommandResultFactory({\n error: new InvalidStatusWordError(\"kaboom\"),\n });\n api.sendCommand.mockResolvedValueOnce(errorResult);\n const makeCommand = makeCommandFactory();\n\n const result = await sendFramedContactsPayload(api, {\n payload: makePayload(600),\n p1: 0x01,\n makeCommand,\n });\n\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n expect(makeCommand).toHaveBeenCalledTimes(1);\n expect(result).toBe(errorResult);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "InvalidStatusWordError", "sendFramedContactsPayload", "makeApiMock", "makePayload", "byteCount", "fillByte", "makeCommandFactory", "chunk", "p2", "api", "finalResult", "makeCommand", "result", "intermediateOk", "chunk0", "p20", "chunk1", "p21", "chunk2", "p22", "errorResult"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as a,InvalidStatusWordError as s}from"@ledgerhq/device-management-kit";import{EditExternalAddressIdentifierCommand as m}from"../../app-binder/command/EditExternalAddressIdentifierCommand";import{SendEditExternalAddressIdentifierTask as o}from"./SendEditExternalAddressIdentifierTask";function r(e){const n=new Uint8Array(e.length/2);for(let t=0;t<e.length;t+=2)n[t/2]=parseInt(e.slice(t,t+2),16);return n}const l=r("00d501013102010181f005416c69636581f108457468206d61696e81f214555555555555555555555555555555555555555581f41400000000000000000000000000000000deadbeef81f640"+"cc".repeat(64)+"2301012920"+"dd".repeat(32)+"81f720"+"aa".repeat(32)+"510101"),i={hmacRest:r("88".repeat(32))},d={contactName:"Alice",scope:"Eth main",newIdentifier:r("55".repeat(20)),previousIdentifier:r("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n,groupHandle:r("cc".repeat(64)),hmacProof:r("dd".repeat(32)),hmacRest:r("aa".repeat(32))};function c(){return{sendCommand:vi.fn()}}describe("SendEditExternalAddressIdentifierTask",()=>{it("assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressIdentifierCommand",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce(a({data:i}));const n=await new o(e,d).run();expect(e.sendCommand.mock.calls).toHaveLength(1),expect(e.sendCommand.mock.calls[0][0]).toStrictEqual(new m({data:l,p2:0})),expect(n).toStrictEqual(a({data:i}))}),it("omits the CHAIN_ID TLV when chainId is not provided",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce(a({data:i})),await new o(e,{...d,chainId:void 0}).run();const n=e.sendCommand.mock.calls[0][0],t=Buffer.from(n.args.data).toString("hex");expect(t).not.toContain("230101"),expect(t.endsWith("510101")).toBe(!0)}),it("propagates command-level errors",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce(a({error:new s("user cancelled")}));const n=await new o(e,d).run();expect(n).toStrictEqual(a({error:new s("user cancelled")}))}),it("errors when the final-chunk response does not carry hmac_rest",async()=>{const e=c();e.sendCommand.mockResolvedValueOnce(a({data:{}}));const n=await new o(e,d).run();expect(n).toStrictEqual(a({error:new s("EditIdentifier final-chunk response did not carry hmac_rest")}))}),it("throws on an unsupported blockchain family",async()=>{const e=c();await expect(new o(e,{...d,blockchainFamily:"dogecoin"}).run()).rejects.toThrow(/Unsupported blockchain family/),expect(e.sendCommand).not.toHaveBeenCalled()})});
|
|
2
|
-
//# sourceMappingURL=SendEditExternalAddressIdentifierTask.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/task/SendEditExternalAddressIdentifierTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["// Asserts the op-3 (Edit Identifier) framed chunk (2-byte BE length + TLV) is\n// byte-for-byte parity with the signer-eth `edit_external_address` fixture.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { EditExternalAddressIdentifierCommand } from \"@internal/app-binder/command/EditExternalAddressIdentifierCommand\";\n\nimport { SendEditExternalAddressIdentifierTask } from \"./SendEditExternalAddressIdentifierTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\n// Framed chunk = \"00 d5\" (2-byte BE total TLV length = 213) + TLV. No\n// DERIVATION_PATH TLV (external-address ops carry no path).\nconst FRAMED_CHUNK = hexToBytes(\n \"00d5\" +\n \"010131\" +\n \"020101\" +\n \"81f005416c696365\" +\n \"81f108457468206d61696e\" +\n \"81f2145555555555555555555555555555555555555555\" +\n \"81f41400000000000000000000000000000000deadbeef\" +\n \"81f640\" +\n \"cc\".repeat(64) +\n \"230101\" +\n \"2920\" +\n \"dd\".repeat(32) +\n \"81f720\" +\n \"aa\".repeat(32) +\n \"510101\",\n);\n\nconst OK_PROOF = { hmacRest: hexToBytes(\"88\".repeat(32)) };\n\nconst BASE_ARGS = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n newIdentifier: hexToBytes(\"55\".repeat(20)),\n previousIdentifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: hexToBytes(\"cc\".repeat(64)),\n hmacProof: hexToBytes(\"dd\".repeat(32)),\n hmacRest: hexToBytes(\"aa\".repeat(32)),\n};\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendEditExternalAddressIdentifierTask\", () => {\n it(\"assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressIdentifierCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n const result = await new SendEditExternalAddressIdentifierTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new EditExternalAddressIdentifierCommand({\n data: FRAMED_CHUNK,\n p2: 0x00,\n }),\n );\n expect(result).toStrictEqual(CommandResultFactory({ data: OK_PROOF }));\n });\n\n it(\"omits the CHAIN_ID TLV when chainId is not provided\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n await new SendEditExternalAddressIdentifierTask(api, {\n ...BASE_ARGS,\n chainId: undefined,\n }).run();\n\n const command = api.sendCommand.mock\n .calls[0]![0] as EditExternalAddressIdentifierCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n // No `23 01 ..` CHAIN_ID TLV; HMAC_PROOF (29 20 ..) follows the path directly.\n expect(framedHex).not.toContain(\"230101\");\n expect(framedHex.endsWith(\"510101\")).toBe(true);\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendEditExternalAddressIdentifierTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"errors when the final-chunk response does not carry hmac_rest\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendEditExternalAddressIdentifierTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\n \"EditIdentifier final-chunk response did not carry hmac_rest\",\n ),\n }),\n );\n });\n\n it(\"throws on an unsupported blockchain family\", async () => {\n const api = makeApiMock();\n\n await expect(\n new SendEditExternalAddressIdentifierTask(api, {\n ...BASE_ARGS,\n blockchainFamily: \"dogecoin\",\n }).run(),\n ).rejects.toThrow(/Unsupported blockchain family/);\n expect(api.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "InvalidStatusWordError", "EditExternalAddressIdentifierCommand", "SendEditExternalAddressIdentifierTask", "hexToBytes", "hex", "out", "i", "FRAMED_CHUNK", "OK_PROOF", "BASE_ARGS", "makeApiMock", "api", "result", "command", "framedHex"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as a,InvalidStatusWordError as d}from"@ledgerhq/device-management-kit";import{EditExternalAddressScopeCommand as m}from"../../app-binder/command/EditExternalAddressScopeCommand";import{SendEditExternalAddressScopeTask as r}from"./SendEditExternalAddressScopeTask";function o(e){const n=new Uint8Array(e.length/2);for(let t=0;t<e.length;t+=2)n[t/2]=parseInt(e.slice(t,t+2),16);return n}const l=o("00c901013202010181f005416c69636581f10845746820636f6c6481f214"+"55".repeat(20)+"81f508457468206d61696e81f640"+"cc".repeat(64)+"2301012920"+"dd".repeat(32)+"81f720"+"aa".repeat(32)+"510101"),i={hmacRest:o("88".repeat(32))},c={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:o("55".repeat(20)),blockchainFamily:"ethereum",chainId:1n,groupHandle:o("cc".repeat(64)),hmacProof:o("dd".repeat(32)),hmacRest:o("aa".repeat(32))};function s(){return{sendCommand:vi.fn()}}describe("SendEditExternalAddressScopeTask",()=>{it("assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressScopeCommand",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce(a({data:i}));const n=await new r(e,c).run();expect(e.sendCommand.mock.calls).toHaveLength(1),expect(e.sendCommand.mock.calls[0][0]).toStrictEqual(new m({data:l,p2:0})),expect(n).toStrictEqual(a({data:i}))}),it("omits the CHAIN_ID TLV when chainId is not provided",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce(a({data:i})),await new r(e,{...c,chainId:void 0}).run();const n=e.sendCommand.mock.calls[0][0],t=Buffer.from(n.args.data).toString("hex");expect(t).not.toContain("230101"),expect(t.endsWith("510101")).toBe(!0)}),it("propagates command-level errors",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce(a({error:new d("user cancelled")}));const n=await new r(e,c).run();expect(n).toStrictEqual(a({error:new d("user cancelled")}))}),it("errors when the final-chunk response does not carry hmac_rest",async()=>{const e=s();e.sendCommand.mockResolvedValueOnce(a({data:{}}));const n=await new r(e,c).run();expect(n).toStrictEqual(a({error:new d("EditScope final-chunk response did not carry hmac_rest")}))}),it("throws on an unsupported blockchain family",async()=>{const e=s();await expect(new r(e,{...c,blockchainFamily:"dogecoin"}).run()).rejects.toThrow(/Unsupported blockchain family/),expect(e.sendCommand).not.toHaveBeenCalled()})});
|
|
2
|
-
//# sourceMappingURL=SendEditExternalAddressScopeTask.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/task/SendEditExternalAddressScopeTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["// Asserts the op-4 (Edit Scope) framed chunk (2-byte BE length + TLV) is\n// byte-for-byte parity with the expected wire layout.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { EditExternalAddressScopeCommand } from \"@internal/app-binder/command/EditExternalAddressScopeCommand\";\n\nimport { SendEditExternalAddressScopeTask } from \"./SendEditExternalAddressScopeTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\n// Framed chunk = \"00 c9\" (2-byte BE total TLV length = 201) + TLV.\n// Tag order: STRUCT_TYPE(0x32), STRUCT_VERSION, CONTACT_NAME, SCOPE(new),\n// ACCOUNT_IDENTIFIER, PREVIOUS_SCOPE, GROUP_HANDLE, CHAIN_ID, HMAC_PROOF,\n// HMAC_REST(old), BLOCKCHAIN_FAMILY. No DERIVATION_PATH TLV.\nconst FRAMED_CHUNK = hexToBytes(\n \"00c9\" +\n \"010132\" +\n \"020101\" +\n \"81f005416c696365\" + // CONTACT_NAME \"Alice\"\n \"81f10845746820636f6c64\" + // SCOPE (new) \"Eth cold\"\n \"81f214\" +\n \"55\".repeat(20) + // ACCOUNT_IDENTIFIER (unchanged)\n \"81f508457468206d61696e\" + // PREVIOUS_SCOPE \"Eth main\"\n \"81f640\" +\n \"cc\".repeat(64) +\n \"230101\" +\n \"2920\" +\n \"dd\".repeat(32) +\n \"81f720\" +\n \"aa\".repeat(32) +\n \"510101\",\n);\n\nconst OK_PROOF = { hmacRest: hexToBytes(\"88\".repeat(32)) };\n\nconst BASE_ARGS = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: hexToBytes(\"55\".repeat(20)),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: hexToBytes(\"cc\".repeat(64)),\n hmacProof: hexToBytes(\"dd\".repeat(32)),\n hmacRest: hexToBytes(\"aa\".repeat(32)),\n};\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendEditExternalAddressScopeTask\", () => {\n it(\"assembles the framed chunk byte-equal to the fixture and dispatches EditExternalAddressScopeCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n const result = await new SendEditExternalAddressScopeTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new EditExternalAddressScopeCommand({\n data: FRAMED_CHUNK,\n p2: 0x00,\n }),\n );\n expect(result).toStrictEqual(CommandResultFactory({ data: OK_PROOF }));\n });\n\n it(\"omits the CHAIN_ID TLV when chainId is not provided\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOF }),\n );\n\n await new SendEditExternalAddressScopeTask(api, {\n ...BASE_ARGS,\n chainId: undefined,\n }).run();\n\n const command = api.sendCommand.mock\n .calls[0]![0] as EditExternalAddressScopeCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n // No `23 01 ..` CHAIN_ID TLV; HMAC_PROOF (29 20 ..) follows the path directly.\n expect(framedHex).not.toContain(\"230101\");\n expect(framedHex.endsWith(\"510101\")).toBe(true);\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendEditExternalAddressScopeTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"errors when the final-chunk response does not carry hmac_rest\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendEditExternalAddressScopeTask(\n api,\n BASE_ARGS,\n ).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\n \"EditScope final-chunk response did not carry hmac_rest\",\n ),\n }),\n );\n });\n\n it(\"throws on an unsupported blockchain family\", async () => {\n const api = makeApiMock();\n\n await expect(\n new SendEditExternalAddressScopeTask(api, {\n ...BASE_ARGS,\n blockchainFamily: \"dogecoin\",\n }).run(),\n ).rejects.toThrow(/Unsupported blockchain family/);\n expect(api.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "InvalidStatusWordError", "EditExternalAddressScopeCommand", "SendEditExternalAddressScopeTask", "hexToBytes", "hex", "out", "i", "FRAMED_CHUNK", "OK_PROOF", "BASE_ARGS", "makeApiMock", "api", "result", "command", "framedHex"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as t,InvalidStatusWordError as r}from"@ledgerhq/device-management-kit";import{RegisterIdentityCommand as s}from"../../app-binder/command/RegisterIdentityCommand";import{SendRegisterIdentityTask as a}from"./SendRegisterIdentityTask";function e(c){const n=new Uint8Array(c.length/2);for(let d=0;d<c.length;d+=2)n[d/2]=parseInt(c.slice(d,d+2),16);return n}const m=e("003601012d02010181f005416c69636581f108457468206d61696e81f21400000000000000000000000000000000deadbeef230101510101"),l=e("009c01012d02010181f005416c69636581f108417262206d61696e81f21444444444444444444444444444444444444444442302a4b151010181f640cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc2920dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"),i={groupHandle:e("cc".repeat(64)),hmacProof:e("dd".repeat(32)),hmacRest:e("aa".repeat(32))};function o(){return{sendCommand:vi.fn()}}describe("SendRegisterIdentityTask",()=>{it("assembles a fresh-register framed chunk and dispatches RegisterIdentityCommand",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce(t({data:i}));const n=await new a(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n}).run();expect(c.sendCommand.mock.calls).toHaveLength(1),expect(c.sendCommand.mock.calls[0][0]).toStrictEqual(new s({data:m,p2:0})),expect(n).toStrictEqual(t({data:i}))}),it("appends GROUP_HANDLE + HMAC_PROOF on extension and frames the extension payload",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce(t({data:i})),await new a(c,{contactName:"Alice",scope:"Arb main",identifier:e("44".repeat(20)),blockchainFamily:"ethereum",chainId:42161n,existingContactGroup:{groupHandle:e("cc".repeat(64)),hmacProof:e("dd".repeat(32))}}).run(),expect(c.sendCommand.mock.calls).toHaveLength(1),expect(c.sendCommand.mock.calls[0][0]).toStrictEqual(new s({data:l,p2:0}))}),it("omits the CHAIN_ID TLV when chainId is not provided",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce(t({data:i})),await new a(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum"}).run();const n=c.sendCommand.mock.calls[0][0],d=Buffer.from(n.args.data).toString("hex");expect(d).not.toContain("230101"),expect(d.endsWith("510101")).toBe(!0)}),it("propagates command-level errors",async()=>{const c=o();c.sendCommand.mockResolvedValueOnce(t({error:new r("user cancelled")}));const n=await new a(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"ethereum",chainId:1n}).run();expect(n).toStrictEqual(t({error:new r("user cancelled")}))}),it("throws on an unsupported blockchain family",async()=>{const c=o();await expect(new a(c,{contactName:"Alice",scope:"Eth main",identifier:e("00000000000000000000000000000000deadbeef"),blockchainFamily:"dogecoin",chainId:1n}).run()).rejects.toThrow(/Unsupported blockchain family/),expect(c.sendCommand).not.toHaveBeenCalled()})});
|
|
2
|
-
//# sourceMappingURL=SendRegisterIdentityTask.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/task/SendRegisterIdentityTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["// Validates that the TLV serializer + tag ordering + chunk framing produce the\n// expected wire bytes for op 1 (Register Identity): tags >= 0x80 use the 2-byte\n// DER form [0x81, tag], and no DERIVATION_PATH is sent (the SDK removed tag\n// 0x69 from REGISTER_IDENTITY_TAGS on 2026-08-10 and rejects payloads carrying\n// it). The framed chunk = 2-byte BE total length + TLV.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { RegisterIdentityCommand } from \"@internal/app-binder/command/RegisterIdentityCommand\";\n\nimport { SendRegisterIdentityTask } from \"./SendRegisterIdentityTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\n// Framed chunk = \"00 <Lc>\" (2-byte BE total TLV length) + TLV. Tag order:\n// STRUCT_TYPE, STRUCT_VERSION, CONTACT_NAME, SCOPE, ACCOUNT_IDENTIFIER,\n// CHAIN_ID, BLOCKCHAIN_FAMILY, then optional GROUP_HANDLE + HMAC_PROOF. Tags\n// >= 0x80 are encoded as [0x81, tag].\nconst FRESH_FRAMED_CHUNK = hexToBytes(\n \"003601012d020101\" +\n \"81f005416c696365\" +\n \"81f108457468206d61696e\" +\n \"81f21400000000000000000000000000000000deadbeef\" +\n \"230101510101\",\n);\n\nconst EXTENSION_FRAMED_CHUNK = hexToBytes(\n \"009c01012d020101\" +\n \"81f005416c696365\" +\n \"81f108417262206d61696e\" +\n \"81f2144444444444444444444444444444444444444444\" +\n \"2302a4b1510101\" +\n \"81f640cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\" +\n \"2920dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd\",\n);\n\nconst OK_PROOFS = {\n groupHandle: hexToBytes(\"cc\".repeat(64)),\n hmacProof: hexToBytes(\"dd\".repeat(32)),\n hmacRest: hexToBytes(\"aa\".repeat(32)),\n};\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendRegisterIdentityTask\", () => {\n it(\"assembles a fresh-register framed chunk and dispatches RegisterIdentityCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOFS }),\n );\n\n const result = await new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RegisterIdentityCommand({ data: FRESH_FRAMED_CHUNK, p2: 0x00 }),\n );\n expect(result).toStrictEqual(CommandResultFactory({ data: OK_PROOFS }));\n });\n\n it(\"appends GROUP_HANDLE + HMAC_PROOF on extension and frames the extension payload\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOFS }),\n );\n\n await new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Arb main\",\n identifier: hexToBytes(\"44\".repeat(20)),\n blockchainFamily: \"ethereum\",\n chainId: 42161n,\n existingContactGroup: {\n groupHandle: hexToBytes(\"cc\".repeat(64)),\n hmacProof: hexToBytes(\"dd\".repeat(32)),\n },\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RegisterIdentityCommand({ data: EXTENSION_FRAMED_CHUNK, p2: 0x00 }),\n );\n });\n\n it(\"omits the CHAIN_ID TLV when chainId is not provided\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: OK_PROOFS }),\n );\n\n await new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n }).run();\n\n const command = api.sendCommand.mock\n .calls[0]![0] as RegisterIdentityCommand;\n // No `23 01 ..` CHAIN_ID TLV; BLOCKCHAIN_FAMILY 51 01 01 follows the path.\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n expect(framedHex).not.toContain(\"230101\");\n expect(framedHex.endsWith(\"510101\")).toBe(true);\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n }).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"throws on an unsupported blockchain family\", async () => {\n const api = makeApiMock();\n\n await expect(\n new SendRegisterIdentityTask(api, {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: hexToBytes(\"00000000000000000000000000000000deadbeef\"),\n blockchainFamily: \"dogecoin\",\n chainId: 1n,\n }).run(),\n ).rejects.toThrow(/Unsupported blockchain family/);\n expect(api.sendCommand).not.toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "InvalidStatusWordError", "RegisterIdentityCommand", "SendRegisterIdentityTask", "hexToBytes", "hex", "out", "i", "FRESH_FRAMED_CHUNK", "EXTENSION_FRAMED_CHUNK", "OK_PROOFS", "makeApiMock", "api", "result", "command", "framedHex"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{CommandResultFactory as n,InvalidStatusWordError as i}from"@ledgerhq/device-management-kit";import{RenameContactCommand as l}from"../../app-binder/command/RenameContactCommand";import{SendRenameContactTask as o}from"./SendRenameContactTask";function s(e){const a=new Uint8Array(e.length/2);for(let t=0;t<e.length;t+=2)a[t/2]=parseInt(e.slice(t,t+2),16);return a}const c=s("cc".repeat(64)),r=s("dd".repeat(32)),d=s("ee".repeat(32)),u=s("007901012e02010181f003426f6281f305416c69636581f640"+"cc".repeat(64)+"2920"+"dd".repeat(32));function m(){return{sendCommand:vi.fn()}}describe("SendRenameContactTask",()=>{it("assembles the rename framed chunk and dispatches RenameContactCommand",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce(n({data:{hmacProof:d}}));const a=await new o(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:c,hmacProof:r}).run();expect(e.sendCommand.mock.calls).toHaveLength(1),expect(e.sendCommand.mock.calls[0][0]).toStrictEqual(new l({data:u,p2:0})),expect(a).toStrictEqual(n({data:{hmacProof:d}}))}),it("does not emit a DERIVATION_PATH tag by default",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce(n({data:{hmacProof:d}})),await new o(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:c,hmacProof:r}).run();const a=e.sendCommand.mock.calls[0][0],t=Buffer.from(a.args.data).toString("hex");expect(t).not.toContain("6915"),expect(t.endsWith("81f640"+"cc".repeat(64)+"2920"+"dd".repeat(32))).toBe(!0)}),it("emits the DERIVATION_PATH tag when includeDerivationPath is set",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce(n({data:{hmacProof:d}})),await new o(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:c,hmacProof:r,includeDerivationPath:!0}).run();const t=s("009001012e02010181f003426f6281f305416c69636581f640"+"cc".repeat(64)+"6915058000002c8000003c800000000000000000000000"+"2920"+"dd".repeat(32)),p=e.sendCommand.mock.calls[0][0];expect(p).toStrictEqual(new l({data:t,p2:0}))}),it("propagates command-level errors",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce(n({error:new i("user cancelled")}));const a=await new o(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:c,hmacProof:r}).run();expect(a).toStrictEqual(n({error:new i("user cancelled")}))}),it("returns InvalidStatusWordError when the final response carries no hmac_name",async()=>{const e=m();e.sendCommand.mockResolvedValueOnce(n({data:{}}));const a=await new o(e,{previousContactName:"Alice",newContactName:"Bob",groupHandle:c,hmacProof:r}).run();expect(a.status).not.toBe(void 0),"error"in a&&expect(a.error).toBeInstanceOf(i)})});
|
|
2
|
-
//# sourceMappingURL=SendRenameContactTask.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/internal/app-binder/task/SendRenameContactTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["// Validates that the TLV serializer + tag ordering + chunk framing produce the\n// expected wire bytes for the Rename Contact (EDIT CONTACT NAME) op. The framed\n// chunk = 2-byte BE total length + TLV. Tag order: STRUCT_TYPE, STRUCT_VERSION,\n// CONTACT_NAME (new), PREVIOUS_CONTACT_NAME (old), GROUP_HANDLE, HMAC_PROOF \u2014\n// with tags >= 0x80 (0xf0/0xf3/0xf6) encoded as the 2-byte DER form [0x81, tag].\n// DERIVATION_PATH (tag 0x69) is CONDITIONAL (DSDK-1481): omitted by default (the\n// GA payload), and inserted between GROUP_HANDLE and HMAC_PROOF only when the\n// caller passes includeDerivationPath \u2014 the shape older OS builds still require.\nimport {\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { RenameContactCommand } from \"@internal/app-binder/command/RenameContactCommand\";\n\nimport { SendRenameContactTask } from \"./SendRenameContactTask\";\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n out[i / 2] = parseInt(hex.slice(i, i + 2), 16);\n }\n return out;\n}\n\nconst GROUP_HANDLE = hexToBytes(\"cc\".repeat(64));\nconst HMAC_PROOF_IN = hexToBytes(\"dd\".repeat(32));\nconst HMAC_PROOF_OUT = hexToBytes(\"ee\".repeat(32));\n\n// Framed chunk = \"00 79\" (2-byte BE total TLV length = 121) + TLV:\n// 01 01 2e STRUCT_TYPE = EDIT_CONTACT_NAME (0x2e)\n// 02 01 01 STRUCT_VERSION = 1\n// 81 f0 03 \"Bob\" CONTACT_NAME (new), tag 0xf0 -> [81 f0]\n// 81 f3 05 \"Alice\" PREVIOUS_CONTACT_NAME (old), tag 0xf3 -> [81 f3]\n// 81 f6 40 <64x cc> GROUP_HANDLE, tag 0xf6 -> [81 f6]\n// 29 20 <32x dd> HMAC_PROOF\nconst FRAMED_CHUNK = hexToBytes(\n \"0079\" +\n \"01012e\" +\n \"020101\" +\n \"81f003426f62\" +\n \"81f305416c696365\" +\n \"81f640\" +\n \"cc\".repeat(64) +\n \"2920\" +\n \"dd\".repeat(32),\n);\n\nfunction makeApiMock(): InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n} {\n return { sendCommand: vi.fn() } as unknown as InternalApi & {\n sendCommand: ReturnType<typeof vi.fn>;\n };\n}\n\ndescribe(\"SendRenameContactTask\", () => {\n it(\"assembles the rename framed chunk and dispatches RenameContactCommand\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(api.sendCommand.mock.calls).toHaveLength(1);\n expect(api.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new RenameContactCommand({ data: FRAMED_CHUNK, p2: 0x00 }),\n );\n expect(result).toStrictEqual(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n });\n\n it(\"does not emit a DERIVATION_PATH tag by default\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n // GA payload (includeDerivationPath omitted): newer OS builds reject tag\n // 0x69, so HMAC_PROOF (0x29) follows GROUP_HANDLE directly.\n const command = api.sendCommand.mock.calls[0]![0] as RenameContactCommand;\n const framedHex = Buffer.from(command.args.data).toString(\"hex\");\n expect(framedHex).not.toContain(\"6915\");\n expect(\n framedHex.endsWith(\"81f640\" + \"cc\".repeat(64) + \"2920\" + \"dd\".repeat(32)),\n ).toBe(true);\n });\n\n it(\"emits the DERIVATION_PATH tag when includeDerivationPath is set\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({ data: { hmacProof: HMAC_PROOF_OUT } }),\n );\n\n await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n includeDerivationPath: true,\n }).run();\n\n // Older OS builds (below the model cutoff) mandate tag 0x69. The path TLV\n // (fixed m/44'/60'/0'/0/0) sits between GROUP_HANDLE and HMAC_PROOF, and the\n // framed total length grows by its 23 bytes: 0x0079 -> 0x0090.\n // 69 15 05 8000002c 8000003c 80000000 00000000 00000000\n const pathTlv =\n \"6915\" +\n \"05\" +\n \"8000002c\" +\n \"8000003c\" +\n \"80000000\" +\n \"00000000\" +\n \"00000000\";\n const expectedFramed = hexToBytes(\n \"0090\" +\n \"01012e\" +\n \"020101\" +\n \"81f003426f62\" +\n \"81f305416c696365\" +\n \"81f640\" +\n \"cc\".repeat(64) +\n pathTlv +\n \"2920\" +\n \"dd\".repeat(32),\n );\n const command = api.sendCommand.mock.calls[0]![0] as RenameContactCommand;\n expect(command).toStrictEqual(\n new RenameContactCommand({ data: expectedFramed, p2: 0x00 }),\n );\n });\n\n it(\"propagates command-level errors\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result).toStrictEqual(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"user cancelled\"),\n }),\n );\n });\n\n it(\"returns InvalidStatusWordError when the final response carries no hmac_name\", async () => {\n const api = makeApiMock();\n api.sendCommand.mockResolvedValueOnce(CommandResultFactory({ data: {} }));\n\n const result = await new SendRenameContactTask(api, {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: GROUP_HANDLE,\n hmacProof: HMAC_PROOF_IN,\n }).run();\n\n expect(result.status).not.toBe(undefined);\n if (\"error\" in result) {\n expect(result.error).toBeInstanceOf(InvalidStatusWordError);\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "InvalidStatusWordError", "RenameContactCommand", "SendRenameContactTask", "hexToBytes", "hex", "out", "i", "GROUP_HANDLE", "HMAC_PROOF_IN", "HMAC_PROOF_OUT", "FRAMED_CHUNK", "makeApiMock", "api", "result", "command", "framedHex", "expectedFramed"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{ContactsAppBinder as i}from"./app-binder/ContactsAppBinder";import{appBinderTypes as r}from"./app-binder/di/appBinderTypes";import{makeContainer as p}from"./di";import{externalTypes as t}from"./externalTypes";import{useCaseTypes as o}from"./use-cases/di/useCaseTypes";import{RegisterExternalAddressUseCase as m}from"./use-cases/RegisterExternalAddressUseCase";import{RenameContactUseCase as c}from"./use-cases/RenameContactUseCase";describe("makeContainer",()=>{const s={},n="session-id",a="Ethereum",e=p({dmk:s,sessionId:n,appName:a});it("binds dmk, sessionId and appName as external values",()=>{expect(e.get(t.Dmk)).toBe(s),expect(e.get(t.SessionId)).toBe(n),expect(e.get(t.AppName)).toBe(a)}),it("binds the ContactsAppBinder",()=>{expect(e.get(r.AppBinder)).toBeInstanceOf(i)}),it("binds the RegisterExternalAddressUseCase",()=>{expect(e.get(o.RegisterExternalAddressUseCase)).toBeInstanceOf(m)}),it("binds the RenameContactUseCase",()=>{expect(e.get(o.RenameContactUseCase)).toBeInstanceOf(c)})});
|
|
2
|
-
//# sourceMappingURL=di.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/internal/di.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type DeviceManagementKit } from \"@ledgerhq/device-management-kit\";\n\nimport { ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { makeContainer } from \"@internal/di\";\nimport { externalTypes } from \"@internal/externalTypes\";\nimport { useCaseTypes } from \"@internal/use-cases/di/useCaseTypes\";\nimport { RegisterExternalAddressUseCase } from \"@internal/use-cases/RegisterExternalAddressUseCase\";\nimport { RenameContactUseCase } from \"@internal/use-cases/RenameContactUseCase\";\n\ndescribe(\"makeContainer\", () => {\n const dmk = {} as DeviceManagementKit;\n const sessionId = \"session-id\";\n const appName = \"Ethereum\";\n\n const container = makeContainer({ dmk, sessionId, appName });\n\n it(\"binds dmk, sessionId and appName as external values\", () => {\n expect(container.get(externalTypes.Dmk)).toBe(dmk);\n expect(container.get(externalTypes.SessionId)).toBe(sessionId);\n expect(container.get(externalTypes.AppName)).toBe(appName);\n });\n\n it(\"binds the ContactsAppBinder\", () => {\n expect(container.get(appBinderTypes.AppBinder)).toBeInstanceOf(\n ContactsAppBinder,\n );\n });\n\n it(\"binds the RegisterExternalAddressUseCase\", () => {\n expect(\n container.get(useCaseTypes.RegisterExternalAddressUseCase),\n ).toBeInstanceOf(RegisterExternalAddressUseCase);\n });\n\n it(\"binds the RenameContactUseCase\", () => {\n expect(container.get(useCaseTypes.RenameContactUseCase)).toBeInstanceOf(\n RenameContactUseCase,\n );\n });\n});\n"],
|
|
5
|
-
"mappings": "AAEA,OAAS,qBAAAA,MAAyB,yCAClC,OAAS,kBAAAC,MAAsB,yCAC/B,OAAS,iBAAAC,MAAqB,eAC9B,OAAS,iBAAAC,MAAqB,0BAC9B,OAAS,gBAAAC,MAAoB,sCAC7B,OAAS,kCAAAC,MAAsC,qDAC/C,OAAS,wBAAAC,MAA4B,2CAErC,SAAS,gBAAiB,IAAM,CAC9B,MAAMC,EAAM,CAAC,EACPC,EAAY,aACZC,EAAU,WAEVC,EAAYR,EAAc,CAAE,IAAAK,EAAK,UAAAC,EAAW,QAAAC,CAAQ,CAAC,EAE3D,GAAG,sDAAuD,IAAM,CAC9D,OAAOC,EAAU,IAAIP,EAAc,GAAG,CAAC,EAAE,KAAKI,CAAG,EACjD,OAAOG,EAAU,IAAIP,EAAc,SAAS,CAAC,EAAE,KAAKK,CAAS,EAC7D,OAAOE,EAAU,IAAIP,EAAc,OAAO,CAAC,EAAE,KAAKM,CAAO,CAC3D,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,OAAOC,EAAU,IAAIT,EAAe,SAAS,CAAC,EAAE,eAC9CD,CACF,CACF,CAAC,EAED,GAAG,2CAA4C,IAAM,CACnD,OACEU,EAAU,IAAIN,EAAa,8BAA8B,CAC3D,EAAE,eAAeC,CAA8B,CACjD,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,OAAOK,EAAU,IAAIN,EAAa,oBAAoB,CAAC,EAAE,eACvDE,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["ContactsAppBinder", "appBinderTypes", "makeContainer", "externalTypes", "useCaseTypes", "RegisterExternalAddressUseCase", "RenameContactUseCase", "dmk", "sessionId", "appName", "container"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{EditExternalAddressIdentifierUseCase as a}from"./EditExternalAddressIdentifierUseCase";function r(){const e=vi.fn().mockReturnValue("DA_RETURN"),t={editExternalAddressIdentifier:e};return{useCase:new a(t),editExternalAddressIdentifier:e}}const i={contactName:"Alice",scope:"Eth main",previousIdentifier:new Uint8Array(20).fill(17),newIdentifier:new Uint8Array(20).fill(34),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("EditExternalAddressIdentifierUseCase",()=>{it("delegates to the app binder",()=>{const{useCase:e,editExternalAddressIdentifier:t}=r(),n=e.execute(i);expect(t).toHaveBeenCalledWith(i),expect(n).toBe("DA_RETURN")}),it("does not validate \u2014 invalid input is forwarded, not thrown",()=>{const{useCase:e,editExternalAddressIdentifier:t}=r(),n={...i,contactName:""};expect(()=>e.execute(n)).not.toThrow(),expect(t).toHaveBeenCalledWith(n)})});
|
|
2
|
-
//# sourceMappingURL=EditExternalAddressIdentifierUseCase.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/internal/use-cases/EditExternalAddressIdentifierUseCase.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type EditExternalAddressIdentifierInput } from \"@api/model/EditExternalAddressIdentifier\";\nimport { type ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\n\nimport { EditExternalAddressIdentifierUseCase } from \"./EditExternalAddressIdentifierUseCase\";\n\nfunction makeUseCase() {\n const editExternalAddressIdentifier = vi.fn().mockReturnValue(\"DA_RETURN\");\n const appBinder = {\n editExternalAddressIdentifier,\n } as unknown as ContactsAppBinder;\n return {\n useCase: new EditExternalAddressIdentifierUseCase(appBinder),\n editExternalAddressIdentifier,\n };\n}\n\nconst VALID_INPUT: EditExternalAddressIdentifierInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n previousIdentifier: new Uint8Array(20).fill(0x11),\n newIdentifier: new Uint8Array(20).fill(0x22),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"EditExternalAddressIdentifierUseCase\", () => {\n it(\"delegates to the app binder\", () => {\n const { useCase, editExternalAddressIdentifier } = makeUseCase();\n\n const result = useCase.execute(VALID_INPUT);\n\n expect(editExternalAddressIdentifier).toHaveBeenCalledWith(VALID_INPUT);\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"does not validate \u2014 invalid input is forwarded, not thrown\", () => {\n // Validation now lives in the device action and surfaces as a typed DA\n // error state; the use case must never throw for bad input.\n const { useCase, editExternalAddressIdentifier } = makeUseCase();\n\n const invalidInput = { ...VALID_INPUT, contactName: \"\" };\n expect(() => useCase.execute(invalidInput)).not.toThrow();\n expect(editExternalAddressIdentifier).toHaveBeenCalledWith(invalidInput);\n });\n});\n"],
|
|
5
|
-
"mappings": "AAGA,OAAS,wCAAAA,MAA4C,yCAErD,SAASC,GAAc,CACrB,MAAMC,EAAgC,GAAG,GAAG,EAAE,gBAAgB,WAAW,EACnEC,EAAY,CAChB,8BAAAD,CACF,EACA,MAAO,CACL,QAAS,IAAIF,EAAqCG,CAAS,EAC3D,8BAAAD,CACF,CACF,CAEA,MAAME,EAAkD,CACtD,YAAa,QACb,MAAO,WACP,mBAAoB,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EAChD,cAAe,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EAC3C,iBAAkB,WAClB,QAAS,GACT,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACvC,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,EAEA,SAAS,uCAAwC,IAAM,CACrD,GAAG,8BAA+B,IAAM,CACtC,KAAM,CAAE,QAAAC,EAAS,8BAAAH,CAA8B,EAAID,EAAY,EAEzDK,EAASD,EAAQ,QAAQD,CAAW,EAE1C,OAAOF,CAA6B,EAAE,qBAAqBE,CAAW,EACtE,OAAOE,CAAM,EAAE,KAAK,WAAW,CACjC,CAAC,EAED,GAAG,kEAA8D,IAAM,CAGrE,KAAM,CAAE,QAAAD,EAAS,8BAAAH,CAA8B,EAAID,EAAY,EAEzDM,EAAe,CAAE,GAAGH,EAAa,YAAa,EAAG,EACvD,OAAO,IAAMC,EAAQ,QAAQE,CAAY,CAAC,EAAE,IAAI,QAAQ,EACxD,OAAOL,CAA6B,EAAE,qBAAqBK,CAAY,CACzE,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["EditExternalAddressIdentifierUseCase", "makeUseCase", "editExternalAddressIdentifier", "appBinder", "VALID_INPUT", "useCase", "result", "invalidInput"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{EditExternalAddressScopeUseCase as r}from"./EditExternalAddressScopeUseCase";function o(){const e=vi.fn().mockReturnValue("DA_RETURN"),t={editExternalAddressScope:e};return{useCase:new r(t),editExternalAddressScope:e}}const a={contactName:"Alice",previousScope:"Eth main",newScope:"Eth cold",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n,groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221),hmacRest:new Uint8Array(32).fill(170)};describe("EditExternalAddressScopeUseCase",()=>{it("delegates to the app binder",()=>{const{useCase:e,editExternalAddressScope:t}=o(),n=e.execute(a);expect(t).toHaveBeenCalledWith(a),expect(n).toBe("DA_RETURN")}),it("does not validate \u2014 invalid input is forwarded, not thrown",()=>{const{useCase:e,editExternalAddressScope:t}=o(),n={...a,contactName:""};expect(()=>e.execute(n)).not.toThrow(),expect(t).toHaveBeenCalledWith(n)})});
|
|
2
|
-
//# sourceMappingURL=EditExternalAddressScopeUseCase.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/internal/use-cases/EditExternalAddressScopeUseCase.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type EditExternalAddressScopeInput } from \"@api/model/EditExternalAddressScope\";\nimport { type ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\n\nimport { EditExternalAddressScopeUseCase } from \"./EditExternalAddressScopeUseCase\";\n\nfunction makeUseCase() {\n const editExternalAddressScope = vi.fn().mockReturnValue(\"DA_RETURN\");\n const appBinder = {\n editExternalAddressScope,\n } as unknown as ContactsAppBinder;\n return {\n useCase: new EditExternalAddressScopeUseCase(appBinder),\n editExternalAddressScope,\n };\n}\n\nconst VALID_INPUT: EditExternalAddressScopeInput = {\n contactName: \"Alice\",\n previousScope: \"Eth main\",\n newScope: \"Eth cold\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n hmacRest: new Uint8Array(32).fill(0xaa),\n};\n\ndescribe(\"EditExternalAddressScopeUseCase\", () => {\n it(\"delegates to the app binder\", () => {\n const { useCase, editExternalAddressScope } = makeUseCase();\n\n const result = useCase.execute(VALID_INPUT);\n\n expect(editExternalAddressScope).toHaveBeenCalledWith(VALID_INPUT);\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"does not validate \u2014 invalid input is forwarded, not thrown\", () => {\n // Validation now lives in the device action and surfaces as a typed DA\n // error state; the use case must never throw for bad input.\n const { useCase, editExternalAddressScope } = makeUseCase();\n\n const invalidInput = { ...VALID_INPUT, contactName: \"\" };\n expect(() => useCase.execute(invalidInput)).not.toThrow();\n expect(editExternalAddressScope).toHaveBeenCalledWith(invalidInput);\n });\n});\n"],
|
|
5
|
-
"mappings": "AAGA,OAAS,mCAAAA,MAAuC,oCAEhD,SAASC,GAAc,CACrB,MAAMC,EAA2B,GAAG,GAAG,EAAE,gBAAgB,WAAW,EAC9DC,EAAY,CAChB,yBAAAD,CACF,EACA,MAAO,CACL,QAAS,IAAIF,EAAgCG,CAAS,EACtD,yBAAAD,CACF,CACF,CAEA,MAAME,EAA6C,CACjD,YAAa,QACb,cAAe,WACf,SAAU,WACV,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,WAClB,QAAS,GACT,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACvC,SAAU,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACxC,EAEA,SAAS,kCAAmC,IAAM,CAChD,GAAG,8BAA+B,IAAM,CACtC,KAAM,CAAE,QAAAC,EAAS,yBAAAH,CAAyB,EAAID,EAAY,EAEpDK,EAASD,EAAQ,QAAQD,CAAW,EAE1C,OAAOF,CAAwB,EAAE,qBAAqBE,CAAW,EACjE,OAAOE,CAAM,EAAE,KAAK,WAAW,CACjC,CAAC,EAED,GAAG,kEAA8D,IAAM,CAGrE,KAAM,CAAE,QAAAD,EAAS,yBAAAH,CAAyB,EAAID,EAAY,EAEpDM,EAAe,CAAE,GAAGH,EAAa,YAAa,EAAG,EACvD,OAAO,IAAMC,EAAQ,QAAQE,CAAY,CAAC,EAAE,IAAI,QAAQ,EACxD,OAAOL,CAAwB,EAAE,qBAAqBK,CAAY,CACpE,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["EditExternalAddressScopeUseCase", "makeUseCase", "editExternalAddressScope", "appBinder", "VALID_INPUT", "useCase", "result", "invalidInput"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{RegisterExternalAddressUseCase as a}from"./RegisterExternalAddressUseCase";function r(){const e=vi.fn().mockReturnValue("DA_RETURN"),t={registerExternalAddress:e};return{useCase:new a(t),registerExternalAddress:e}}const s={contactName:"Alice",scope:"Eth main",identifier:new Uint8Array(20).fill(17),blockchainFamily:"ethereum",chainId:1n};describe("RegisterExternalAddressUseCase",()=>{it("delegates to the app binder",()=>{const{useCase:e,registerExternalAddress:t}=r(),n=e.execute(s);expect(t).toHaveBeenCalledWith(s),expect(n).toBe("DA_RETURN")}),it("does not validate \u2014 invalid input is forwarded, not thrown",()=>{const{useCase:e,registerExternalAddress:t}=r(),n={...s,contactName:""};expect(()=>e.execute(n)).not.toThrow(),expect(t).toHaveBeenCalledWith(n)})});
|
|
2
|
-
//# sourceMappingURL=RegisterExternalAddressUseCase.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/internal/use-cases/RegisterExternalAddressUseCase.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type RegisterExternalAddressInput } from \"@api/model/RegisterExternalAddress\";\nimport { type ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\n\nimport { RegisterExternalAddressUseCase } from \"./RegisterExternalAddressUseCase\";\n\nfunction makeUseCase() {\n const registerExternalAddress = vi.fn().mockReturnValue(\"DA_RETURN\");\n const appBinder = { registerExternalAddress } as unknown as ContactsAppBinder;\n return {\n useCase: new RegisterExternalAddressUseCase(appBinder),\n registerExternalAddress,\n };\n}\n\nconst VALID_INPUT: RegisterExternalAddressInput = {\n contactName: \"Alice\",\n scope: \"Eth main\",\n identifier: new Uint8Array(20).fill(0x11),\n blockchainFamily: \"ethereum\",\n chainId: 1n,\n};\n\ndescribe(\"RegisterExternalAddressUseCase\", () => {\n it(\"delegates to the app binder\", () => {\n const { useCase, registerExternalAddress } = makeUseCase();\n\n const result = useCase.execute(VALID_INPUT);\n\n expect(registerExternalAddress).toHaveBeenCalledWith(VALID_INPUT);\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"does not validate \u2014 invalid input is forwarded, not thrown\", () => {\n // Validation now lives in the device action and surfaces as a typed DA\n // error state; the use case must never throw for bad input.\n const { useCase, registerExternalAddress } = makeUseCase();\n\n const invalidInput = { ...VALID_INPUT, contactName: \"\" };\n expect(() => useCase.execute(invalidInput)).not.toThrow();\n expect(registerExternalAddress).toHaveBeenCalledWith(invalidInput);\n });\n});\n"],
|
|
5
|
-
"mappings": "AAGA,OAAS,kCAAAA,MAAsC,mCAE/C,SAASC,GAAc,CACrB,MAAMC,EAA0B,GAAG,GAAG,EAAE,gBAAgB,WAAW,EAC7DC,EAAY,CAAE,wBAAAD,CAAwB,EAC5C,MAAO,CACL,QAAS,IAAIF,EAA+BG,CAAS,EACrD,wBAAAD,CACF,CACF,CAEA,MAAME,EAA4C,CAChD,YAAa,QACb,MAAO,WACP,WAAY,IAAI,WAAW,EAAE,EAAE,KAAK,EAAI,EACxC,iBAAkB,WAClB,QAAS,EACX,EAEA,SAAS,iCAAkC,IAAM,CAC/C,GAAG,8BAA+B,IAAM,CACtC,KAAM,CAAE,QAAAC,EAAS,wBAAAH,CAAwB,EAAID,EAAY,EAEnDK,EAASD,EAAQ,QAAQD,CAAW,EAE1C,OAAOF,CAAuB,EAAE,qBAAqBE,CAAW,EAChE,OAAOE,CAAM,EAAE,KAAK,WAAW,CACjC,CAAC,EAED,GAAG,kEAA8D,IAAM,CAGrE,KAAM,CAAE,QAAAD,EAAS,wBAAAH,CAAwB,EAAID,EAAY,EAEnDM,EAAe,CAAE,GAAGH,EAAa,YAAa,EAAG,EACvD,OAAO,IAAMC,EAAQ,QAAQE,CAAY,CAAC,EAAE,IAAI,QAAQ,EACxD,OAAOL,CAAuB,EAAE,qBAAqBK,CAAY,CACnE,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["RegisterExternalAddressUseCase", "makeUseCase", "registerExternalAddress", "appBinder", "VALID_INPUT", "useCase", "result", "invalidInput"]
|
|
7
|
-
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{RenameContactUseCase as c}from"./RenameContactUseCase";function o(){const e=vi.fn().mockReturnValue("DA_RETURN"),t={renameContact:e};return{useCase:new c(t),renameContact:e}}const a={previousContactName:"Alice",newContactName:"Bob",groupHandle:new Uint8Array(64).fill(204),hmacProof:new Uint8Array(32).fill(221)};describe("RenameContactUseCase",()=>{it("delegates to the app binder",()=>{const{useCase:e,renameContact:t}=o(),n=e.execute(a);expect(t).toHaveBeenCalledWith(a),expect(n).toBe("DA_RETURN")}),it("does not validate \u2014 invalid input is forwarded, not thrown",()=>{const{useCase:e,renameContact:t}=o(),n={...a,newContactName:""};expect(()=>e.execute(n)).not.toThrow(),expect(t).toHaveBeenCalledWith(n)})});
|
|
2
|
-
//# sourceMappingURL=RenameContactUseCase.test.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/internal/use-cases/RenameContactUseCase.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type RenameContactInput } from \"@api/model/RenameContact\";\nimport { type ContactsAppBinder } from \"@internal/app-binder/ContactsAppBinder\";\n\nimport { RenameContactUseCase } from \"./RenameContactUseCase\";\n\nfunction makeUseCase() {\n const renameContact = vi.fn().mockReturnValue(\"DA_RETURN\");\n const appBinder = { renameContact } as unknown as ContactsAppBinder;\n return {\n useCase: new RenameContactUseCase(appBinder),\n renameContact,\n };\n}\n\nconst VALID_INPUT: RenameContactInput = {\n previousContactName: \"Alice\",\n newContactName: \"Bob\",\n groupHandle: new Uint8Array(64).fill(0xcc),\n hmacProof: new Uint8Array(32).fill(0xdd),\n};\n\ndescribe(\"RenameContactUseCase\", () => {\n it(\"delegates to the app binder\", () => {\n const { useCase, renameContact } = makeUseCase();\n\n const result = useCase.execute(VALID_INPUT);\n\n expect(renameContact).toHaveBeenCalledWith(VALID_INPUT);\n expect(result).toBe(\"DA_RETURN\");\n });\n\n it(\"does not validate \u2014 invalid input is forwarded, not thrown\", () => {\n // Validation lives in the device action and surfaces as a typed DA error\n // state; the use case must never throw for bad input.\n const { useCase, renameContact } = makeUseCase();\n\n const invalidInput = { ...VALID_INPUT, newContactName: \"\" };\n expect(() => useCase.execute(invalidInput)).not.toThrow();\n expect(renameContact).toHaveBeenCalledWith(invalidInput);\n });\n});\n"],
|
|
5
|
-
"mappings": "AAGA,OAAS,wBAAAA,MAA4B,yBAErC,SAASC,GAAc,CACrB,MAAMC,EAAgB,GAAG,GAAG,EAAE,gBAAgB,WAAW,EACnDC,EAAY,CAAE,cAAAD,CAAc,EAClC,MAAO,CACL,QAAS,IAAIF,EAAqBG,CAAS,EAC3C,cAAAD,CACF,CACF,CAEA,MAAME,EAAkC,CACtC,oBAAqB,QACrB,eAAgB,MAChB,YAAa,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,EACzC,UAAW,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CACzC,EAEA,SAAS,uBAAwB,IAAM,CACrC,GAAG,8BAA+B,IAAM,CACtC,KAAM,CAAE,QAAAC,EAAS,cAAAH,CAAc,EAAID,EAAY,EAEzCK,EAASD,EAAQ,QAAQD,CAAW,EAE1C,OAAOF,CAAa,EAAE,qBAAqBE,CAAW,EACtD,OAAOE,CAAM,EAAE,KAAK,WAAW,CACjC,CAAC,EAED,GAAG,kEAA8D,IAAM,CAGrE,KAAM,CAAE,QAAAD,EAAS,cAAAH,CAAc,EAAID,EAAY,EAEzCM,EAAe,CAAE,GAAGH,EAAa,eAAgB,EAAG,EAC1D,OAAO,IAAMC,EAAQ,QAAQE,CAAY,CAAC,EAAE,IAAI,QAAQ,EACxD,OAAOL,CAAa,EAAE,qBAAqBK,CAAY,CACzD,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["RenameContactUseCase", "makeUseCase", "renameContact", "appBinder", "VALID_INPUT", "useCase", "result", "invalidInput"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContactsManagerBuilder.test.d.ts","sourceRoot":"","sources":["../../../src/api/ContactsManagerBuilder.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContactsVersionRequirements.test.d.ts","sourceRoot":"","sources":["../../../../src/api/model/ContactsVersionRequirements.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultContactsManager.test.d.ts","sourceRoot":"","sources":["../../../src/internal/DefaultContactsManager.test.ts"],"names":[],"mappings":""}
|
package/lib/types/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditExternalAddressIdentifierCommand.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/EditExternalAddressIdentifierCommand.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditExternalAddressScopeCommand.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/EditExternalAddressScopeCommand.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProvideContactCommand.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/ProvideContactCommand.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterIdentityCommand.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/RegisterIdentityCommand.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RenameContactCommand.test.d.ts","sourceRoot":"","sources":["../../../../../src/internal/app-binder/command/RenameContactCommand.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"contactsVersionGuards.test.d.ts","sourceRoot":"","sources":["../../../../src/internal/app-binder/contactsVersionGuards.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditExternalAddressIdentifierDeviceAction.test.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/EditExternalAddressIdentifierDeviceAction.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateEditExternalAddressIdentifierInput.test.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressIdentifier/validateEditExternalAddressIdentifierInput.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EditExternalAddressScopeDeviceAction.test.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/EditExternalAddressScopeDeviceAction.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateEditExternalAddressScopeInput.test.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/EditExternalAddressScope/validateEditExternalAddressScopeInput.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RegisterExternalAddressDeviceAction.test.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/app-binder/device-action/RegisterExternalAddress/RegisterExternalAddressDeviceAction.test.ts"],"names":[],"mappings":""}
|