@ledgerhq/device-signer-kit-solana 1.6.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -4
- package/lib/cjs/api/SignerSolana.js.map +1 -1
- package/lib/cjs/api/index.js +1 -1
- package/lib/cjs/api/index.js.map +3 -3
- package/lib/cjs/api/model/MessageOptions.js +1 -1
- package/lib/cjs/api/model/MessageOptions.js.map +3 -3
- package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
- package/lib/cjs/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/cjs/internal/DefaultSignerSolana.test.js +1 -1
- package/lib/cjs/internal/DefaultSignerSolana.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.js +2 -0
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.js.map +7 -0
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.test.js +2 -0
- package/lib/cjs/internal/app-binder/SolanaApplicationResolver.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideInstructionDescriptorCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideInstructionDescriptorCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideInstructionDescriptorCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideInstructionDescriptorCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/utils/SolanaApplicationErrors.js +1 -1
- package/lib/cjs/internal/app-binder/command/utils/SolanaApplicationErrors.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/Errors.js +2 -0
- package/lib/cjs/internal/app-binder/services/Errors.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/OffchainMessageBuilder.js +2 -0
- package/lib/cjs/internal/app-binder/services/OffchainMessageBuilder.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/OffchainMessageBuilder.test.js +6 -0
- package/lib/cjs/internal/app-binder/services/OffchainMessageBuilder.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/classifyAndExtract.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/classifyAndExtract.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/utils/AddressLookupTableResolver.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/AddressLookupTableResolver.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/utils/AddressLookupTableResolver.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/AddressLookupTableResolver.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +1 -1
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +1 -1
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/utils/TransactionParser.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/TransactionParser.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/utils/TransactionParser.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/TransactionParser.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js +1 -3
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- package/lib/cjs/internal/use-cases/di/useCasesModule.js +1 -1
- package/lib/cjs/internal/use-cases/di/useCasesModule.js.map +3 -3
- package/lib/cjs/internal/use-cases/di/useCasesModule.test.js +1 -1
- package/lib/cjs/internal/use-cases/di/useCasesModule.test.js.map +2 -2
- package/lib/cjs/internal/use-cases/di/useCasesTypes.js +1 -1
- package/lib/cjs/internal/use-cases/di/useCasesTypes.js.map +2 -2
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js.map +2 -2
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
- package/lib/cjs/package.json +2 -2
- package/lib/esm/api/index.js +1 -1
- package/lib/esm/api/index.js.map +3 -3
- package/lib/esm/api/model/MessageOptions.js +1 -0
- package/lib/esm/api/model/MessageOptions.js.map +4 -4
- package/lib/esm/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/esm/internal/DefaultSignerSolana.test.js +1 -1
- package/lib/esm/internal/DefaultSignerSolana.test.js.map +2 -2
- package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.js +2 -0
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.js.map +7 -0
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.test.js +2 -0
- package/lib/esm/internal/app-binder/SolanaApplicationResolver.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideInstructionDescriptorCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideInstructionDescriptorCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideInstructionDescriptorCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideInstructionDescriptorCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/utils/SolanaApplicationErrors.js +1 -1
- package/lib/esm/internal/app-binder/command/utils/SolanaApplicationErrors.js.map +2 -2
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
- package/lib/esm/internal/app-binder/services/Errors.js +2 -0
- package/lib/esm/internal/app-binder/services/Errors.js.map +7 -0
- package/lib/esm/internal/app-binder/services/OffchainMessageBuilder.js +2 -0
- package/lib/esm/internal/app-binder/services/OffchainMessageBuilder.js.map +7 -0
- package/lib/esm/internal/app-binder/services/OffchainMessageBuilder.test.js +6 -0
- package/lib/esm/internal/app-binder/services/OffchainMessageBuilder.test.js.map +7 -0
- package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
- package/lib/esm/internal/app-binder/services/classifyAndExtract.test.js +2 -0
- package/lib/esm/internal/app-binder/services/classifyAndExtract.test.js.map +7 -0
- package/lib/esm/internal/app-binder/services/utils/AddressLookupTableResolver.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/AddressLookupTableResolver.js.map +7 -0
- package/lib/esm/internal/app-binder/services/utils/AddressLookupTableResolver.test.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/AddressLookupTableResolver.test.js.map +7 -0
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +1 -1
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +3 -3
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +1 -1
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +2 -2
- package/lib/esm/internal/app-binder/services/utils/TransactionParser.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/TransactionParser.js.map +7 -0
- package/lib/esm/internal/app-binder/services/utils/TransactionParser.test.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/TransactionParser.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js +1 -3
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- package/lib/esm/internal/use-cases/di/useCasesModule.js +1 -1
- package/lib/esm/internal/use-cases/di/useCasesModule.js.map +3 -3
- package/lib/esm/internal/use-cases/di/useCasesModule.test.js +1 -1
- package/lib/esm/internal/use-cases/di/useCasesModule.test.js.map +2 -2
- package/lib/esm/internal/use-cases/di/useCasesTypes.js +1 -1
- package/lib/esm/internal/use-cases/di/useCasesTypes.js.map +2 -2
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.js +1 -1
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.js.map +2 -2
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
- package/lib/esm/package.json +2 -2
- package/lib/types/api/SignerSolana.d.ts +1 -1
- package/lib/types/api/SignerSolana.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +4 -3
- package/lib/types/api/index.d.ts.map +1 -1
- package/lib/types/api/model/MessageOptions.d.ts +38 -3
- package/lib/types/api/model/MessageOptions.d.ts.map +1 -1
- package/lib/types/internal/DefaultSignerSolana.d.ts +26 -8
- package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +3 -6
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/SolanaApplicationResolver.d.ts +5 -0
- package/lib/types/internal/app-binder/SolanaApplicationResolver.d.ts.map +1 -0
- package/lib/types/internal/app-binder/SolanaApplicationResolver.test.d.ts +2 -0
- package/lib/types/internal/app-binder/SolanaApplicationResolver.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideInstructionDescriptorCommand.d.ts +22 -0
- package/lib/types/internal/app-binder/command/ProvideInstructionDescriptorCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideInstructionDescriptorCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/ProvideInstructionDescriptorCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +0 -14
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/Errors.d.ts +7 -0
- package/lib/types/internal/app-binder/services/Errors.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/OffchainMessageBuilder.d.ts +53 -0
- package/lib/types/internal/app-binder/services/OffchainMessageBuilder.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/OffchainMessageBuilder.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/OffchainMessageBuilder.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +16 -14
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/classifyAndExtract.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/classifyAndExtract.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/utils/AddressLookupTableResolver.d.ts +21 -0
- package/lib/types/internal/app-binder/services/utils/AddressLookupTableResolver.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/utils/AddressLookupTableResolver.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/utils/AddressLookupTableResolver.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts +6 -3
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/utils/TransactionParser.d.ts +32 -0
- package/lib/types/internal/app-binder/services/utils/TransactionParser.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/utils/TransactionParser.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/utils/TransactionParser.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +2 -2
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +14 -3
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +18 -18
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
- package/lib/types/internal/use-cases/di/useCasesModule.d.ts.map +1 -1
- package/lib/types/internal/use-cases/di/useCasesTypes.d.ts +0 -1
- package/lib/types/internal/use-cases/di/useCasesTypes.d.ts.map +1 -1
- package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts +1 -1
- package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/lib/cjs/api/SolanaTools.js +0 -2
- package/lib/cjs/api/SolanaTools.js.map +0 -7
- package/lib/cjs/api/SolanaToolsBuilder.js +0 -2
- package/lib/cjs/api/SolanaToolsBuilder.js.map +0 -7
- package/lib/cjs/api/app-binder/GenerateTransactionDeviceActionTypes.js +0 -2
- package/lib/cjs/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +0 -7
- package/lib/cjs/internal/DefaultSolanaTools.js +0 -2
- package/lib/cjs/internal/DefaultSolanaTools.js.map +0 -7
- package/lib/cjs/internal/DefaultSolanaTools.test.js +0 -2
- package/lib/cjs/internal/DefaultSolanaTools.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +0 -2
- package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.js +0 -2
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js +0 -2
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js +0 -2
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +0 -7
- package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +0 -2
- package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +0 -7
- package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +0 -2
- package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +0 -7
- package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +0 -2
- package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +0 -7
- package/lib/esm/api/SolanaTools.js +0 -1
- package/lib/esm/api/SolanaTools.js.map +0 -7
- package/lib/esm/api/SolanaToolsBuilder.js +0 -2
- package/lib/esm/api/SolanaToolsBuilder.js.map +0 -7
- package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js +0 -1
- package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +0 -7
- package/lib/esm/internal/DefaultSolanaTools.js +0 -2
- package/lib/esm/internal/DefaultSolanaTools.js.map +0 -7
- package/lib/esm/internal/DefaultSolanaTools.test.js +0 -2
- package/lib/esm/internal/DefaultSolanaTools.test.js.map +0 -7
- package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +0 -2
- package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +0 -7
- package/lib/esm/internal/app-binder/services/ApplicationChecker.js +0 -2
- package/lib/esm/internal/app-binder/services/ApplicationChecker.js.map +0 -7
- package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js +0 -2
- package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js +0 -2
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js.map +0 -7
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js +0 -2
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +0 -7
- package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +0 -2
- package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +0 -7
- package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +0 -2
- package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +0 -7
- package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +0 -2
- package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +0 -7
- package/lib/types/api/SolanaTools.d.ts +0 -10
- package/lib/types/api/SolanaTools.d.ts.map +0 -1
- package/lib/types/api/SolanaToolsBuilder.d.ts +0 -39
- package/lib/types/api/SolanaToolsBuilder.d.ts.map +0 -1
- package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts +0 -24
- package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts.map +0 -1
- package/lib/types/internal/DefaultSolanaTools.d.ts +0 -20
- package/lib/types/internal/DefaultSolanaTools.d.ts.map +0 -1
- package/lib/types/internal/DefaultSolanaTools.test.d.ts +0 -2
- package/lib/types/internal/DefaultSolanaTools.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts +0 -23
- package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts +0 -13
- package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts +0 -14
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts +0 -2
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts.map +0 -1
- package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +0 -14
- package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +0 -1
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts +0 -10
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts.map +0 -1
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts +0 -2
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -234,12 +234,13 @@ const subscription = observable.subscribe({
|
|
|
234
234
|
|
|
235
235
|
### Use Case 3: Sign Message
|
|
236
236
|
|
|
237
|
-
This method allows users to sign
|
|
237
|
+
This method allows users to sign an off-chain message displayed on Ledger devices, following the [Solana off-chain message signing specification](https://docs.anza.xyz/proposals/off-chain-message-signing).
|
|
238
238
|
|
|
239
239
|
```typescript
|
|
240
240
|
const { observable, cancel } = signerSolana.signMessage(
|
|
241
241
|
derivationPath,
|
|
242
242
|
message,
|
|
243
|
+
options,
|
|
243
244
|
);
|
|
244
245
|
```
|
|
245
246
|
|
|
@@ -254,15 +255,47 @@ const { observable, cancel } = signerSolana.signMessage(
|
|
|
254
255
|
- `message`
|
|
255
256
|
|
|
256
257
|
- **Required**
|
|
257
|
-
- **Type:** `string`
|
|
258
|
-
- The message to
|
|
258
|
+
- **Type:** `string | Uint8Array`
|
|
259
|
+
- The message to sign. Pass a `string` for V0/V1/Legacy (UTF-8 encoded automatically). Pass a `Uint8Array` for Raw mode when you have an already-formatted binary payload.
|
|
260
|
+
|
|
261
|
+
- `options`
|
|
262
|
+
|
|
263
|
+
- Optional
|
|
264
|
+
- Type: `MessageOptions`
|
|
265
|
+
|
|
266
|
+
```typescript
|
|
267
|
+
import { SignMessageVersion } from "@ledgerhq/device-signer-kit-solana";
|
|
268
|
+
|
|
269
|
+
enum SignMessageVersion {
|
|
270
|
+
Raw = "raw",
|
|
271
|
+
Legacy = "legacy",
|
|
272
|
+
V0 = "v0",
|
|
273
|
+
V1 = "v1",
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
type MessageOptions = {
|
|
277
|
+
skipOpenApp?: boolean;
|
|
278
|
+
version?: SignMessageVersion; // defaults to V0
|
|
279
|
+
appDomain?: string; // V0 only
|
|
280
|
+
};
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
- `skipOpenApp`: Skip the automatic open-app step.
|
|
284
|
+
- `version`: The off-chain message signing mode. Defaults to `SignMessageVersion.V0`.
|
|
285
|
+
- **V0** (default) — original off-chain message header with `appDomain`, format detection, and up to 65 515 bytes. Falls back to Legacy on `6a81`.
|
|
286
|
+
- **V1** — simplified header: no `appDomain`, no format byte. Up to 65 535 bytes. Falls back to V0 -> Legacy on `6a81`. Not yet supported by released firmware.
|
|
287
|
+
- **Legacy** — compact header for backward compatibility with old Solana app firmware. Current firmware will reject it with `6a81`.
|
|
288
|
+
- **Raw** — pass-through mode: sends the caller-provided `Uint8Array` payload directly with no header wrapping. Use when you have already built a valid off-chain message. Returns a plain base58 signature (no envelope).
|
|
289
|
+
- `appDomain`: Application domain string for V0 headers. Encoded as UTF-8 and padded/truncated to 32 bytes. Ignored for V1, Legacy, and Raw.
|
|
259
290
|
|
|
260
291
|
#### **Returns**
|
|
261
292
|
|
|
262
293
|
- `observable` Emits DeviceActionState updates, including the following details:
|
|
263
294
|
|
|
264
295
|
```typescript
|
|
265
|
-
type
|
|
296
|
+
type SignMessageOutput = {
|
|
297
|
+
signature: string; // base58 envelope (V1/V0/Legacy) or raw base58 signature (Raw)
|
|
298
|
+
};
|
|
266
299
|
```
|
|
267
300
|
|
|
268
301
|
- `cancel` A function to cancel the action on the Ledger device.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/SignerSolana.ts"],
|
|
4
|
-
"sourcesContent": ["import { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type Transaction } from \"@api/model/Transaction\";\n\nimport { type SolanaTransactionOptionalConfig } from \"./model/SolanaTransactionOptionalConfig\";\n\nexport interface SignerSolana {\n signTransaction: (\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ) => SignTransactionDAReturnType;\n\n signMessage: (\n derivationPath: string,\n message: string,\n options?: MessageOptions,\n ) => SignMessageDAReturnType;\n\n getAddress: (\n derivationPath: string,\n options?: AddressOptions,\n ) => GetAddressDAReturnType;\n\n getAppConfiguration: () => GetAppConfigurationDAReturnType;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type Transaction } from \"@api/model/Transaction\";\n\nimport { type SolanaTransactionOptionalConfig } from \"./model/SolanaTransactionOptionalConfig\";\n\nexport interface SignerSolana {\n signTransaction: (\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ) => SignTransactionDAReturnType;\n\n signMessage: (\n derivationPath: string,\n message: string | Uint8Array,\n options?: MessageOptions,\n ) => SignMessageDAReturnType;\n\n getAddress: (\n derivationPath: string,\n options?: AddressOptions,\n ) => GetAddressDAReturnType;\n\n getAppConfiguration: () => GetAppConfigurationDAReturnType;\n}\n"],
|
|
5
5
|
"mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
6
|
"names": ["SignerSolana_exports", "__toCommonJS"]
|
|
7
7
|
}
|
package/lib/cjs/api/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var r=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var g=(t,e)=>{for(var n in e)r(t,n,{get:e[n],enumerable:!0})},u=(t,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of d(e))!A.call(t,o)&&o!==n&&r(t,o,{get:()=>e[o],enumerable:!(a=m(e,o))||a.enumerable});return t};var l=t=>u(r({},"__esModule",{value:!0}),t);var y={};g(y,{GetPubKeyCommand:()=>s.GetPubKeyCommand,SignMessageVersion:()=>p.SignMessageVersion,SignerSolanaBuilder:()=>i.SignerSolanaBuilder});module.exports=l(y);var p=require("./model/MessageOptions"),i=require("./SignerSolanaBuilder"),s=require("../internal/app-binder/command/GetPubKeyCommand");0&&(module.exports={GetPubKeyCommand,SignMessageVersion,SignerSolanaBuilder});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/cjs/api/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/index.ts"],
|
|
4
|
-
"sourcesContent": ["export type {\n
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,
|
|
6
|
-
"names": ["api_exports", "__export", "__toCommonJS", "import_SignerSolanaBuilder", "
|
|
4
|
+
"sourcesContent": ["export type {\n GetAddressDAError,\n GetAddressDAIntermediateValue,\n GetAddressDAOutput,\n GetAddressDAReturnType,\n} from \"@api/app-binder/GetAddressDeviceActionTypes\";\nexport type {\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue,\n GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nexport type {\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAOutput,\n} from \"@api/app-binder/SignMessageDeviceActionTypes\";\nexport type {\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAOutput,\n SignTransactionDAReturnType,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nexport type { MessageOptions } from \"@api/model/MessageOptions\";\nexport { SignMessageVersion } from \"@api/model/MessageOptions\";\nexport type { Signature } from \"@api/model/Signature\";\nexport type { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nexport type { Transaction } from \"@api/model/Transaction\";\nexport type {\n TransactionResolutionContext,\n UserInputType,\n} from \"@api/model/TransactionResolutionContext\";\nexport type { SignerSolana } from \"@api/SignerSolana\";\nexport { SignerSolanaBuilder } from \"@api/SignerSolanaBuilder\";\nexport {\n GetPubKeyCommand,\n type GetPubKeyCommandArgs,\n type GetPubKeyCommandResponse,\n} from \"@internal/app-binder/command/GetPubKeyCommand\";\nexport type { SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oJAAAE,EAAAF,GAuBA,IAAAG,EAAmC,qCASnCC,EAAoC,oCACpCC,EAIO",
|
|
6
|
+
"names": ["api_exports", "__export", "__toCommonJS", "import_MessageOptions", "import_SignerSolanaBuilder", "import_GetPubKeyCommand"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var v=Object.defineProperty;var e=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var r=(t,a)=>{for(var o in a)v(t,o,{get:a[o],enumerable:!0})},w=(t,a,o,y)=>{if(a&&typeof a=="object"||typeof a=="function")for(let p of l(a))!m.call(t,p)&&p!==o&&v(t,p,{get:()=>a[p],enumerable:!(y=e(a,p))||y.enumerable});return t};var x=t=>w(v({},"__esModule",{value:!0}),t);var O={};r(O,{SignMessageVersion:()=>c});module.exports=x(O);var c=(p=>(p.Raw="raw",p.Legacy="legacy",p.V0="v0",p.V1="v1",p))(c||{});0&&(module.exports={SignMessageVersion});
|
|
2
2
|
//# sourceMappingURL=MessageOptions.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/api/model/MessageOptions.ts"],
|
|
4
|
-
"sourcesContent": ["export type MessageOptions = {\n skipOpenApp?: boolean;\n /**\n *
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["MessageOptions_exports", "__toCommonJS"]
|
|
4
|
+
"sourcesContent": ["export enum SignMessageVersion {\n /**\n * Pass-through mode: sends `sendingData` directly to the device with no\n * header wrapping. Use this when the caller has already built a valid\n * off-chain message payload (e.g. a correctly formatted V0 or V1 OCM).\n * Returns a plain base58 signature (no envelope).\n */\n Raw = \"raw\",\n /**\n * Compact V0 header without `appDomain` or signer fields.\n * Only recognised by older Solana app firmware versions.\n * Current firmware (>= 1.x) requires the full V0 header and will\n * reject this format with `6a81`.\n */\n Legacy = \"legacy\",\n V0 = \"v0\",\n V1 = \"v1\",\n}\n\nexport type MessageOptions = {\n skipOpenApp?: boolean;\n /**\n * Off-chain message signing mode. Defaults to `V0`.\n *\n * - `V0` (default) \u2014 supported on all firmware with off-chain signing.\n * Falls back to Legacy on `6a81`.\n * - `V1` \u2014 supported on firmware with V1 off-chain signing (not yet\n * released). Falls back to V0 on `6a81`.\n * - `Legacy` \u2014 for backward compatibility with very old Solana app\n * firmware. Current firmware will reject it.\n * - `Raw` \u2014 pass-through: the caller provides the fully formatted\n * payload (as `Uint8Array`) and the SDK sends it as-is.\n *\n * Fallback cascade on `6a81` (invalid header):\n * V1 -> V0 -> Legacy\n * V0 -> Legacy\n * Legacy / Raw -> no fallback\n */\n version?: SignMessageVersion;\n /**\n * V0 only: the application domain to include in the off-chain message header.\n * Encoded as UTF-8 and padded/truncated to 32 bytes.\n * If omitted, defaults to 32 zero bytes. Ignored for V1, Legacy, and Raw.\n *\n * @see https://docs.anza.xyz/proposals/off-chain-message-signing\n */\n appDomain?: string;\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAO,IAAKE,OAOVA,EAAA,IAAM,MAONA,EAAA,OAAS,SACTA,EAAA,GAAK,KACLA,EAAA,GAAK,KAhBKA,OAAA",
|
|
6
|
+
"names": ["MessageOptions_exports", "__export", "SignMessageVersion", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var i=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var u=(n,e)=>{for(var t in e)i(n,t,{get:e[t],enumerable:!0})},c=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of g(e))!m.call(n,s)&&s!==t&&i(n,s,{get:()=>e[s],enumerable:!(r=p(e,s))||r.enumerable});return n};var f=n=>c(i({},"__esModule",{value:!0}),n);var
|
|
1
|
+
"use strict";var i=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var u=(n,e)=>{for(var t in e)i(n,t,{get:e[t],enumerable:!0})},c=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of g(e))!m.call(n,s)&&s!==t&&i(n,s,{get:()=>e[s],enumerable:!(r=p(e,s))||r.enumerable});return n};var f=n=>c(i({},"__esModule",{value:!0}),n);var C={};u(C,{DefaultSignerSolana:()=>y});module.exports=f(C);var o=require("./use-cases/di/useCasesTypes"),a=require("./di");class y{_container;constructor({dmk:e,sessionId:t,contextModule:r}){this._container=(0,a.makeContainer)({dmk:e,sessionId:t,contextModule:r})}signTransaction(e,t,r){return this._container.get(o.useCasesTypes.SignTransactionUseCase).execute(e,t,r)}signMessage(e,t,r){return this._container.get(o.useCasesTypes.SignMessageUseCase).execute(e,t,r)}getAddress(e,t){return this._container.get(o.useCasesTypes.GetAddressUseCase).execute(e,t)}getAppConfiguration(){return this._container.get(o.useCasesTypes.GetAppConfigurationUseCase).execute()}}0&&(module.exports={DefaultSignerSolana});
|
|
2
2
|
//# sourceMappingURL=DefaultSignerSolana.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/DefaultSignerSolana.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n /**\n * ## signTransaction\n * #### Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction.\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **options** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **tokenInternalId** `string`\n * Ledger internal token ID\n *\n * - **solanaRPCURL** `string`\n * RPC endpoint to use if `transactionResolutionContext` is not provided\n * and parsing requires network lookups.\n * In browser environments, use a CORS-enabled RPC URL.\n * Defaults to: `\"https://api.mainnet-beta.solana.com/\"`.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed transaction bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignTransactionDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signTransaction(\"m/44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: resolution,\n * });\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * ## signMessage\n * #### Securely sign an arbitrary message on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing.\n *\n * - **message** `string (hex-encoded)`\n * The message to sign, provided as a hex string.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignMessageDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed message bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignMessageDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signMessage(\n * \"m/44'/501'/0'/0'\",\n * \"48656c6c6f20576f726c64\" // hex string\n * );\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * ## getAddress\n * #### Retrieve a Solana address from Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from.\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<string, GetAddressDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the base58-encoded address string, decoded to `Uint8Array`.\n * - **Error** \u2192 The device or signing operation failed (`GetAddressDAError`).\n *\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * ## getAppConfiguration\n * #### Retrieve the current Solana app configuration from a Ledger device.\n * ---\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<GetAppConfigurationResult, Error, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the app configuration object.\n * - **Error** \u2192 The device or signing operation failed.\n *\n * ---\n * ### Example\n *\n * ```ts\n * const config = await signerSolana.getAppConfiguration();\n * console.log(config.version, config.flags);\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAmBA,IAAAI,EAA8B,wCAG9BC,EAA8B,gBAQvB,MAAMH,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAI,EACA,UAAAC,EACA,cAAAC,CACF,EAAuC,CACrC,KAAK,cAAa,iBAAc,CAAE,IAAAF,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,CAsGA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4B,gBAAc,sBAAsB,EAChE,QAAQF,EAAgBC,EAAaC,CAA+B,CACzE,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n /**\n * ## signTransaction\n * #### Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction.\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **options** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **tokenInternalId** `string`\n * Ledger internal token ID\n *\n * - **solanaRPCURL** `string`\n * RPC endpoint to use if `transactionResolutionContext` is not provided\n * and parsing requires network lookups.\n * In browser environments, use a CORS-enabled RPC URL.\n * Defaults to: `\"https://api.mainnet-beta.solana.com/\"`.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed transaction bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignTransactionDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signTransaction(\"m/44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: resolution,\n * });\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * ## signMessage\n * #### Sign a Solana off-chain message on Ledger devices.\n *\n * Supports multiple signing modes via `SignMessageVersion`:\n * - **V0** (default) \u2014 original header with `appDomain`, up to 65 515 bytes. Falls back to Legacy on `6a81`.\n * - **V1** \u2014 simplified header, up to 65 535 bytes. Falls back to V0 -> Legacy on `6a81`. Not yet supported by released firmware.\n * - **Legacy** \u2014 compact header for backward compatibility with old Solana app firmware.\n * - **Raw** \u2014 pass-through: sends a caller-formatted `Uint8Array` payload as-is, no header wrapping.\n *\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing.\n *\n * - **message** `string | Uint8Array`\n * The message to sign. Pass a `string` for V0/V1/Legacy (UTF-8 encoded\n * automatically). Pass a `Uint8Array` for Raw mode when you have an\n * already-formatted binary payload.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n * - **version** `SignMessageVersion`\n * Off-chain message signing mode. Defaults to `SignMessageVersion.V0`.\n * - **appDomain** `string`\n * V0 only: application domain included in the header (padded/truncated to 32 bytes).\n * Ignored for V1, Legacy, and Raw.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<{ signature: string }, SignMessageDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides `{ signature: string }` \u2014 a base58 envelope\n * (V1/V0/Legacy) or a raw base58 signature (Raw).\n * - **Error** \u2192 The device or signing operation failed (`SignMessageDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * import { SignMessageVersion } from \"@ledgerhq/device-signer-kit-solana\";\n *\n * const { observable } = signerSolana.signMessage(\n * \"m/44'/501'/0'/0'\",\n * \"Hello World\",\n * { version: SignMessageVersion.V0 },\n * );\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output.signature);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string | Uint8Array,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * ## getAddress\n * #### Retrieve a Solana address from Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from.\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<string, GetAddressDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the base58-encoded address string, decoded to `Uint8Array`.\n * - **Error** \u2192 The device or signing operation failed (`GetAddressDAError`).\n *\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * ## getAppConfiguration\n * #### Retrieve the current Solana app configuration from a Ledger device.\n * ---\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<GetAppConfigurationResult, Error, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the app configuration object.\n * - **Error** \u2192 The device or signing operation failed.\n *\n * ---\n * ### Example\n *\n * ```ts\n * const config = await signerSolana.getAppConfiguration();\n * console.log(config.version, config.flags);\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yBAAAE,IAAA,eAAAC,EAAAH,GAmBA,IAAAI,EAA8B,wCAG9BC,EAA8B,gBAQvB,MAAMH,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAI,EACA,UAAAC,EACA,cAAAC,CACF,EAAuC,CACrC,KAAK,cAAa,iBAAc,CAAE,IAAAF,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,CAsGA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4B,gBAAc,sBAAsB,EAChE,QAAQF,EAAgBC,EAAaC,CAA+B,CACzE,CAkGA,YACEF,EACAG,EACAC,EACyB,CACzB,OAAO,KAAK,WACT,IAAwB,gBAAc,kBAAkB,EACxD,QAAQJ,EAAgBG,EAASC,CAAO,CAC7C,CA4DA,WACEJ,EACAI,EACwB,CACxB,OAAO,KAAK,WACT,IAAuB,gBAAc,iBAAiB,EACtD,QAAQJ,EAAgBI,CAAO,CACpC,CAyDA,qBAAuD,CACrD,OAAO,KAAK,WACT,IAAgC,gBAAc,0BAA0B,EACxE,QAAQ,CACb,CACF",
|
|
6
6
|
"names": ["DefaultSignerSolana_exports", "__export", "DefaultSignerSolana", "__toCommonJS", "import_useCasesTypes", "import_di", "dmk", "sessionId", "contextModule", "derivationPath", "transaction", "solanaTransactionOptionalConfig", "message", "options"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var n=require("vitest"),o=require("./DefaultSignerSolana");const i=()=>({debug:n.vi.fn(),info:n.vi.fn(),warn:n.vi.fn(),error:n.vi.fn(),subscribers:[]});describe("DefaultSignerSolana",()=>{const s={};it("should be defined",()=>{const e=new o.DefaultSignerSolana({dmk:{},sessionId:{},contextModule:s});expect(e).toBeDefined()}),it("should call getAddress",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).getAddress("derivationPath",{}),expect(e.executeDeviceAction).toHaveBeenCalled()}),it("should call signTransaction",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).signTransaction("derivationPath",new Uint8Array),expect(e.executeDeviceAction).toHaveBeenCalled()}),it("should call signMessage",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).signMessage("44'/501'/0'/0'","Hello world"),expect(e.executeDeviceAction).toHaveBeenCalled()}),it("should call getAppConfiguration",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).getAppConfiguration(),expect(e.executeDeviceAction).toHaveBeenCalled()})});
|
|
1
|
+
"use strict";var n=require("vitest"),o=require("./DefaultSignerSolana");const i=()=>({debug:n.vi.fn(),info:n.vi.fn(),warn:n.vi.fn(),error:n.vi.fn(),subscribers:[]});describe("DefaultSignerSolana",()=>{const s={};it("should be defined",()=>{const e=new o.DefaultSignerSolana({dmk:{},sessionId:{},contextModule:s});expect(e).toBeDefined()}),it("should call getAddress",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).getAddress("derivationPath",{}),expect(e.executeDeviceAction).toHaveBeenCalled()}),it("should call signTransaction",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).signTransaction("derivationPath",new Uint8Array),expect(e.executeDeviceAction).toHaveBeenCalled()}),it("should call signMessage with a string",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).signMessage("44'/501'/0'/0'","Hello world"),expect(e.executeDeviceAction).toHaveBeenCalled()}),it("should call signMessage with a Uint8Array for Raw pass-through",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).signMessage("44'/501'/0'/0'",new Uint8Array([255,1,2])),expect(e.executeDeviceAction).toHaveBeenCalled()}),it("should call getAppConfiguration",()=>{const e={executeDeviceAction:n.vi.fn(),getLoggerFactory:n.vi.fn().mockReturnValue(i)},t={};new o.DefaultSignerSolana({dmk:e,sessionId:t,contextModule:s}).getAppConfiguration(),expect(e.executeDeviceAction).toHaveBeenCalled()})});
|
|
2
2
|
//# sourceMappingURL=DefaultSignerSolana.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/DefaultSignerSolana.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { vi } from \"vitest\";\n\nimport { DefaultSignerSolana } from \"./DefaultSignerSolana\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"DefaultSignerSolana\", () => {\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n it(\"should be defined\", () => {\n const signer = new DefaultSignerSolana({\n dmk: {} as DeviceManagementKit,\n sessionId: {} as DeviceSessionId,\n contextModule: contextModuleStub,\n });\n expect(signer).toBeDefined();\n });\n\n it(\"should call getAddress\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.getAddress(\"derivationPath\", {});\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n\n it(\"should call signTransaction\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.signTransaction(\"derivationPath\", new Uint8Array());\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n\n it(\"should call signMessage\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.signMessage(\"44'/501'/0'/0'\", \"Hello world\");\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n\n it(\"should call getAppConfiguration\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.getAppConfiguration();\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
-
"mappings": "aAKA,IAAAA,EAAmB,kBAEnBC,EAAoC,iCAEpC,MAAMC,EAAoB,KAAO,CAC/B,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEA,SAAS,sBAAuB,IAAM,CACpC,MAAMC,EAAmC,CAAC,EAE1C,GAAG,oBAAqB,IAAM,CAC5B,MAAMC,EAAS,IAAI,sBAAoB,CACrC,IAAK,CAAC,EACN,UAAW,CAAC,EACZ,cAAeD,CACjB,CAAC,EACD,OAAOC,CAAM,EAAE,YAAY,CAC7B,CAAC,EAED,GAAG,yBAA0B,IAAM,CACjC,MAAMC,EAAM,CACV,oBAAqB,KAAG,GAAG,EAC3B,iBAAkB,KAAG,GAAG,EAAE,gBAAgBH,CAAiB,CAC7D,EACMI,EAAY,CAAC,EACJ,IAAI,sBAAoB,CACrC,IAAAD,EACA,UAAAC,EACA,cAAeH,CACjB,CAAC,EACM,WAAW,iBAAkB,CAAC,CAAC,EACtC,OAAOE,EAAI,mBAAmB,EAAE,iBAAiB,CACnD,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,MAAMA,EAAM,CACV,oBAAqB,KAAG,GAAG,EAC3B,iBAAkB,KAAG,GAAG,EAAE,gBAAgBH,CAAiB,CAC7D,EACMI,EAAY,CAAC,EACJ,IAAI,sBAAoB,CACrC,IAAAD,EACA,UAAAC,EACA,cAAeH,CACjB,CAAC,EACM,gBAAgB,iBAAkB,IAAI,UAAY,EACzD,OAAOE,EAAI,mBAAmB,EAAE,iBAAiB,CACnD,CAAC,EAED,GAAG,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { vi } from \"vitest\";\n\nimport { DefaultSignerSolana } from \"./DefaultSignerSolana\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"DefaultSignerSolana\", () => {\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n it(\"should be defined\", () => {\n const signer = new DefaultSignerSolana({\n dmk: {} as DeviceManagementKit,\n sessionId: {} as DeviceSessionId,\n contextModule: contextModuleStub,\n });\n expect(signer).toBeDefined();\n });\n\n it(\"should call getAddress\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.getAddress(\"derivationPath\", {});\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n\n it(\"should call signTransaction\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.signTransaction(\"derivationPath\", new Uint8Array());\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n\n it(\"should call signMessage with a string\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.signMessage(\"44'/501'/0'/0'\", \"Hello world\");\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n\n it(\"should call signMessage with a Uint8Array for Raw pass-through\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.signMessage(\"44'/501'/0'/0'\", new Uint8Array([0xff, 0x01, 0x02]));\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n\n it(\"should call getAppConfiguration\", () => {\n const dmk = {\n executeDeviceAction: vi.fn(),\n getLoggerFactory: vi.fn().mockReturnValue(mockLoggerFactory),\n } as unknown as DeviceManagementKit;\n const sessionId = {} as DeviceSessionId;\n const signer = new DefaultSignerSolana({\n dmk,\n sessionId,\n contextModule: contextModuleStub,\n });\n signer.getAppConfiguration();\n expect(dmk.executeDeviceAction).toHaveBeenCalled();\n });\n});\n"],
|
|
5
|
+
"mappings": "aAKA,IAAAA,EAAmB,kBAEnBC,EAAoC,iCAEpC,MAAMC,EAAoB,KAAO,CAC/B,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEA,SAAS,sBAAuB,IAAM,CACpC,MAAMC,EAAmC,CAAC,EAE1C,GAAG,oBAAqB,IAAM,CAC5B,MAAMC,EAAS,IAAI,sBAAoB,CACrC,IAAK,CAAC,EACN,UAAW,CAAC,EACZ,cAAeD,CACjB,CAAC,EACD,OAAOC,CAAM,EAAE,YAAY,CAC7B,CAAC,EAED,GAAG,yBAA0B,IAAM,CACjC,MAAMC,EAAM,CACV,oBAAqB,KAAG,GAAG,EAC3B,iBAAkB,KAAG,GAAG,EAAE,gBAAgBH,CAAiB,CAC7D,EACMI,EAAY,CAAC,EACJ,IAAI,sBAAoB,CACrC,IAAAD,EACA,UAAAC,EACA,cAAeH,CACjB,CAAC,EACM,WAAW,iBAAkB,CAAC,CAAC,EACtC,OAAOE,EAAI,mBAAmB,EAAE,iBAAiB,CACnD,CAAC,EAED,GAAG,8BAA+B,IAAM,CACtC,MAAMA,EAAM,CACV,oBAAqB,KAAG,GAAG,EAC3B,iBAAkB,KAAG,GAAG,EAAE,gBAAgBH,CAAiB,CAC7D,EACMI,EAAY,CAAC,EACJ,IAAI,sBAAoB,CACrC,IAAAD,EACA,UAAAC,EACA,cAAeH,CACjB,CAAC,EACM,gBAAgB,iBAAkB,IAAI,UAAY,EACzD,OAAOE,EAAI,mBAAmB,EAAE,iBAAiB,CACnD,CAAC,EAED,GAAG,wCAAyC,IAAM,CAChD,MAAMA,EAAM,CACV,oBAAqB,KAAG,GAAG,EAC3B,iBAAkB,KAAG,GAAG,EAAE,gBAAgBH,CAAiB,CAC7D,EACMI,EAAY,CAAC,EACJ,IAAI,sBAAoB,CACrC,IAAAD,EACA,UAAAC,EACA,cAAeH,CACjB,CAAC,EACM,YAAY,iBAAkB,aAAa,EAClD,OAAOE,EAAI,mBAAmB,EAAE,iBAAiB,CACnD,CAAC,EAED,GAAG,iEAAkE,IAAM,CACzE,MAAMA,EAAM,CACV,oBAAqB,KAAG,GAAG,EAC3B,iBAAkB,KAAG,GAAG,EAAE,gBAAgBH,CAAiB,CAC7D,EACMI,EAAY,CAAC,EACJ,IAAI,sBAAoB,CACrC,IAAAD,EACA,UAAAC,EACA,cAAeH,CACjB,CAAC,EACM,YAAY,iBAAkB,IAAI,WAAW,CAAC,IAAM,EAAM,CAAI,CAAC,CAAC,EACvE,OAAOE,EAAI,mBAAmB,EAAE,iBAAiB,CACnD,CAAC,EAED,GAAG,kCAAmC,IAAM,CAC1C,MAAMA,EAAM,CACV,oBAAqB,KAAG,GAAG,EAC3B,iBAAkB,KAAG,GAAG,EAAE,gBAAgBH,CAAiB,CAC7D,EACMI,EAAY,CAAC,EACJ,IAAI,sBAAoB,CACrC,IAAAD,EACA,UAAAC,EACA,cAAeH,CACjB,CAAC,EACM,oBAAoB,EAC3B,OAAOE,EAAI,mBAAmB,EAAE,iBAAiB,CACnD,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["import_vitest", "import_DefaultSignerSolana", "mockLoggerFactory", "contextModuleStub", "signer", "dmk", "sessionId"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var y=(i,e)=>{for(var t in e)m(i,t,{get:e[t],enumerable:!0})},T=(i,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of k(e))!h.call(i,n)&&n!==t&&m(i,n,{get:()=>e[n],enumerable:!(o=u(e,n))||o.enumerable});return i};var S=i=>T(m({},"__esModule",{value:!0}),i),A=(i,e,t,o)=>{for(var n=o>1?void 0:o?u(e,t):e,d=i.length-1,g;d>=0;d--)(g=i[d])&&(n=(o?g(e,t,n):g(n))||n);return o&&n&&m(e,t,n),n},a=(i,e)=>(t,o)=>e(t,o,i);var C={};y(C,{SolanaAppBinder:()=>c});module.exports=S(C);var r=require("@ledgerhq/device-management-kit"),s=require("inversify"),v=require("../app-binder/task/SendSignMessageTask"),p=require("../externalTypes"),l=require("./command/GetAppConfigurationCommand"),D=require("./command/GetPubKeyCommand"),f=require("./device-action/SignTransactionDeviceAction");let c=class{constructor(e,t,o,n){this.dmk=e;this.sessionId=t;this.contextModule=o;this.dmkLoggerFactory=n}getAddress(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.SendCommandInAppDeviceAction({input:{command:new D.GetPubKeyCommand(e),appName:"Solana",requiredUserInteraction:e.checkOnDevice?r.UserInteractionRequired.VerifyAddress:r.UserInteractionRequired.None,skipOpenApp:e.skipOpenApp},logger:this.dmkLoggerFactory("GetPubKeyCommand")})})}signTransaction(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new f.SignTransactionDeviceAction({input:{derivationPath:e.derivationPath,transaction:e.transaction,transactionOptions:e.solanaTransactionOptionalConfig,contextModule:this.contextModule},loggerFactory:this.dmkLoggerFactory})})}signMessage(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.CallTaskInAppDeviceAction({input:{task:async t=>new v.SendSignMessageTask(t,{derivationPath:e.derivationPath,sendingData:e.message,version:e.version,appDomain:e.appDomain}).run(),appName:"Solana",requiredUserInteraction:r.UserInteractionRequired.SignPersonalMessage,skipOpenApp:e.skipOpenApp},logger:this.dmkLoggerFactory("SendSignMessageTask")})})}getAppConfiguration(){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new r.SendCommandInAppDeviceAction({input:{command:new l.GetAppConfigurationCommand,appName:"Solana",requiredUserInteraction:r.UserInteractionRequired.None,skipOpenApp:!1},logger:this.dmkLoggerFactory("GetAppConfigurationCommand")})})}};c=A([(0,s.injectable)(),a(0,(0,s.inject)(p.externalTypes.Dmk)),a(1,(0,s.inject)(p.externalTypes.SessionId)),a(2,(0,s.inject)(p.externalTypes.ContextModule)),a(3,(0,s.inject)(p.externalTypes.DmkLoggerFactory))],c);0&&(module.exports={SolanaAppBinder});
|
|
2
2
|
//# sourceMappingURL=SolanaAppBinder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaAppBinder.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CallTaskInAppDeviceAction,\n DeviceManagementKit,\n type DeviceSessionId,\n LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport {
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAOO,2CACPC,EAAmC,qBASnCC,EAAoC,yDACpCC,EAA8B,mCAE9BC,EAA2C,gDAC3CC,EAAiC,sCACjCC,
|
|
6
|
-
"names": ["SolanaAppBinder_exports", "__export", "SolanaAppBinder", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_SendSignMessageTask", "import_externalTypes", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CallTaskInAppDeviceAction,\n DeviceManagementKit,\n type DeviceSessionId,\n LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type SignMessageVersion } from \"@api/model/MessageOptions\";\nimport { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { Transaction } from \"@api/model/Transaction\";\nimport { SendSignMessageTask } from \"@internal/app-binder/task/SendSignMessageTask\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { SignTransactionDeviceAction } from \"./device-action/SignTransactionDeviceAction\";\n\n@injectable()\nexport class SolanaAppBinder {\n constructor(\n @inject(externalTypes.Dmk) private dmk: DeviceManagementKit,\n @inject(externalTypes.SessionId) private sessionId: DeviceSessionId,\n @inject(externalTypes.ContextModule) private contextModule: ContextModule,\n @inject(externalTypes.DmkLoggerFactory)\n private dmkLoggerFactory: (tag: string) => LoggerPublisherService,\n ) {}\n\n getAddress(args: {\n derivationPath: string;\n checkOnDevice: boolean;\n skipOpenApp: boolean;\n }): GetAddressDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(args),\n appName: \"Solana\",\n requiredUserInteraction: args.checkOnDevice\n ? UserInteractionRequired.VerifyAddress\n : UserInteractionRequired.None,\n skipOpenApp: args.skipOpenApp,\n },\n logger: this.dmkLoggerFactory(\"GetPubKeyCommand\"),\n }),\n });\n }\n\n signTransaction(args: {\n derivationPath: string;\n transaction: Transaction;\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig;\n }): SignTransactionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SignTransactionDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n transaction: args.transaction,\n transactionOptions: args.solanaTransactionOptionalConfig,\n contextModule: this.contextModule,\n },\n loggerFactory: this.dmkLoggerFactory,\n }),\n });\n }\n\n signMessage(args: {\n derivationPath: string;\n message: string | Uint8Array;\n skipOpenApp: boolean;\n version?: SignMessageVersion;\n appDomain?: string;\n }): SignMessageDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new CallTaskInAppDeviceAction({\n input: {\n task: async (internalApi) =>\n new SendSignMessageTask(internalApi, {\n derivationPath: args.derivationPath,\n sendingData: args.message,\n version: args.version,\n appDomain: args.appDomain,\n }).run(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.SignPersonalMessage,\n skipOpenApp: args.skipOpenApp,\n },\n logger: this.dmkLoggerFactory(\"SendSignMessageTask\"),\n }),\n });\n }\n\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n logger: this.dmkLoggerFactory(\"GetAppConfigurationCommand\"),\n }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAOO,2CACPC,EAAmC,qBASnCC,EAAoC,yDACpCC,EAA8B,mCAE9BC,EAA2C,gDAC3CC,EAAiC,sCACjCC,EAA4C,uDAGrC,IAAMC,EAAN,KAAsB,CAC3B,YACqCC,EACMC,EACIC,EAErCC,EACR,CALmC,SAAAH,EACM,eAAAC,EACI,mBAAAC,EAErC,sBAAAC,CACP,CAEH,WAAWC,EAIgB,CACzB,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,+BAA6B,CAC7C,MAAO,CACL,QAAS,IAAI,mBAAiBA,CAAI,EAClC,QAAS,SACT,wBAAyBA,EAAK,cAC1B,0BAAwB,cACxB,0BAAwB,KAC5B,YAAaA,EAAK,WACpB,EACA,OAAQ,KAAK,iBAAiB,kBAAkB,CAClD,CAAC,CACH,CAAC,CACH,CAEA,gBAAgBA,EAIgB,CAC9B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,8BAA4B,CAC5C,MAAO,CACL,eAAgBA,EAAK,eACrB,YAAaA,EAAK,YAClB,mBAAoBA,EAAK,gCACzB,cAAe,KAAK,aACtB,EACA,cAAe,KAAK,gBACtB,CAAC,CACH,CAAC,CACH,CAEA,YAAYA,EAMgB,CAC1B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,4BAA0B,CAC1C,MAAO,CACL,KAAM,MAAOC,GACX,IAAI,sBAAoBA,EAAa,CACnC,eAAgBD,EAAK,eACrB,YAAaA,EAAK,QAClB,QAASA,EAAK,QACd,UAAWA,EAAK,SAClB,CAAC,EAAE,IAAI,EACT,QAAS,SACT,wBAAyB,0BAAwB,oBACjD,YAAaA,EAAK,WACpB,EACA,OAAQ,KAAK,iBAAiB,qBAAqB,CACrD,CAAC,CACH,CAAC,CACH,CAEA,qBAAuD,CACrD,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAI,+BAA6B,CAC7C,MAAO,CACL,QAAS,IAAI,6BACb,QAAS,SACT,wBAAyB,0BAAwB,KACjD,YAAa,EACf,EACA,OAAQ,KAAK,iBAAiB,4BAA4B,CAC5D,CAAC,CACH,CAAC,CACH,CACF,EA1FaL,EAANO,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,gBAAc,GAAG,GACxBA,EAAA,eAAO,gBAAc,SAAS,GAC9BA,EAAA,eAAO,gBAAc,aAAa,GAClCA,EAAA,eAAO,gBAAc,gBAAgB,IAL7BR",
|
|
6
|
+
"names": ["SolanaAppBinder_exports", "__export", "SolanaAppBinder", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_SendSignMessageTask", "import_externalTypes", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "import_SignTransactionDeviceAction", "SolanaAppBinder", "dmk", "sessionId", "contextModule", "dmkLoggerFactory", "args", "internalApi", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var o=require("@ledgerhq/device-management-kit"),A=require("rxjs"),v=require("./command/GetAppConfigurationCommand"),m=require("./command/GetPubKeyCommand"),u=require("./SolanaAppBinder");const d=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]});describe("SolanaAppBinder",()=>{const c={},i={sendCommand:vi.fn(),executeDeviceAction:vi.fn()};beforeEach(()=>{vi.clearAllMocks()}),it("should be defined",()=>{const s=new u.SolanaAppBinder({},{},c,d);expect(s).toBeDefined()}),describe("getAddress",()=>{it("should return the address",()=>new Promise((s,n)=>{const t="D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5";vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const a=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:l}=a.getAddress({derivationPath:"44'/501'",checkOnDevice:!1,skipOpenApp:!1}),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(e){n(e)}}})})),describe("calls of executeDeviceAction with the correct params",()=>{const s={derivationPath:"44'/60'/3'/2/1",returnChainCode:!1,skipOpenApp:!1};it("when checkOnDevice is true: UserInteractionRequired.VerifyAddress",()=>{const t={...s,checkOnDevice:!0};new u.SolanaAppBinder(i,"sessionId",c,d).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new m.GetPubKeyCommand(t),appName:"Solana",requiredUserInteraction:o.UserInteractionRequired.VerifyAddress,skipOpenApp:!1}})}))}),it("when checkOnDevice is false: UserInteractionRequired.None",()=>{const t={...s,checkOnDevice:!1};new u.SolanaAppBinder(i,"sessionId",c,d).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new m.GetPubKeyCommand(t),appName:"Solana",requiredUserInteraction:o.UserInteractionRequired.None,skipOpenApp:!1}})}))})})}),describe("signTransaction",()=>{it("should return the signature",()=>new Promise((s,n)=>{const t=new Uint8Array([1,2,3]);vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const a=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:l}=a.signTransaction({derivationPath:"44'/501'",transaction:new Uint8Array([1,2,3,4]),solanaTransactionOptionalConfig:{skipOpenApp:!1}}),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(e){n(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{const s="44'/60'/3'/2/1",n=new Uint8Array([1,2,3,4]),t=!1;new u.SolanaAppBinder(i,"sessionId",c,d).signTransaction({derivationPath:s,transaction:n,solanaTransactionOptionalConfig:{skipOpenApp:!1}}),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{derivationPath:s,transaction:n,transactionOptions:{skipOpenApp:t},contextModule:c}})}))})}),describe("signMessage",()=>{it("should return the signed message",()=>new Promise((s,n)=>{const t={signature:"signature"},a={derivationPath:"44'/501'/0'/0'",message:"Hello world",skipOpenApp:!1};vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const l=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:r}=l.signMessage(a),e=[];r.subscribe({next:p=>{e.push(p)},error:p=>{n(p)},complete:()=>{try{expect(e).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(p){n(p)}}})})),it("should accept a Uint8Array message for Raw pass-through",()=>new Promise((s,n)=>{const t={signature:"rawSig"},a=new Uint8Array([255,1,2]);vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const l=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:r}=l.signMessage({derivationPath:"44'/501'/0'/0'",message:a,skipOpenApp:!1}),e=[];r.subscribe({next:p=>e.push(p),error:p=>n(p),complete:()=>{try{expect(e).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(p){n(p)}}})}))}),describe("getAppConfiguration",()=>{it("should return the app configuration",()=>new Promise((s,n)=>{const t={blindSigningEnabled:!0,pubKeyDisplayMode:"LONG",version:"2.5.10"};vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:(0,A.from)([{status:o.DeviceActionStatus.Completed,output:t}]),cancel:vi.fn()});const a=new u.SolanaAppBinder(i,"sessionId",c,d),{observable:l}=a.getAppConfiguration(),r=[];l.subscribe({next:e=>{r.push(e)},error:e=>{n(e)},complete:()=>{try{expect(r).toEqual([{status:o.DeviceActionStatus.Completed,output:t}]),s()}catch(e){n(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{new u.SolanaAppBinder(i,"sessionId",c,d).getAppConfiguration(),expect(i.executeDeviceAction).toHaveBeenCalledWith(expect.objectContaining({sessionId:"sessionId",deviceAction:expect.objectContaining({input:{command:new v.GetAppConfigurationCommand,appName:"Solana",requiredUserInteraction:o.UserInteractionRequired.None,skipOpenApp:!1}})}))})})});
|
|
2
2
|
//# sourceMappingURL=SolanaAppBinder.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaAppBinder.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type DmkError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GenerateTransactionDAError,\n type GenerateTransactionDAIntermediateValue,\n type GenerateTransactionDAOutput,\n} from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n type SignMessageDAOutput,\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n} from \"@api/index\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { GenerateTransactionDeviceAction } from \"./device-action/GenerateTransactionDeviceAction\";\nimport { SolanaAppBinder } from \"./SolanaAppBinder\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"SolanaAppBinder\", () => {\n // stub ContextModule for tests\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new SolanaAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n contextModuleStub,\n mockLoggerFactory,\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const address = \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.getAddress({\n derivationPath: \"44'/501'\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls of executeDeviceAction with the correct params\", () => {\n const baseParams = {\n derivationPath: \"44'/60'/3'/2/1\",\n returnChainCode: false,\n skipOpenApp: false,\n };\n\n it(\"when checkOnDevice is true: UserInteractionRequired.VerifyAddress\", () => {\n // GIVEN\n const checkOnDevice = true;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n\n it(\"when checkOnDevice is false: UserInteractionRequired.None\", () => {\n // GIVEN\n const checkOnDevice = false;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signature = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.signTransaction({\n derivationPath: \"44'/501'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/60'/3'/2/1\";\n const transaction = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n const skipOpenApp = false;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n appBinder.signTransaction({\n derivationPath,\n transaction,\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n derivationPath,\n transaction,\n transactionOptions: { skipOpenApp },\n contextModule: contextModuleStub,\n },\n }),\n }),\n );\n });\n });\n\n describe(\"signMessage\", () => {\n it(\"should return the signed message\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = {\n signature: \"signature\",\n };\n const signMessageArgs = {\n derivationPath: \"44'/501'/0'/0'\",\n message: \"Hello world\",\n skipOpenApp: false,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.signMessage(signMessageArgs);\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const appConfiguration = {\n blindSigningEnabled: true,\n pubKeyDisplayMode: \"LONG\",\n version: \"2.5.10\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n\n // WHEN\n appBinder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n\n describe(\"generateTransaction\", () => {\n it(\"should return the serialized transaction\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const serializedTx = \"BASE64_OR_HEX_TX\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: serializedTx,\n } as DeviceActionState<\n GenerateTransactionDAOutput,\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.generateTransaction({\n derivationPath: \"44'/501'/0'/0'\",\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GenerateTransactionDAOutput,\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: (err) => reject(err),\n complete: () => {\n try {\n expect(states).toEqual([\n { status: DeviceActionStatus.Completed, output: serializedTx },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/501'/0'/0'\";\n const skipOpenApp = true;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n appBinder.generateTransaction({ derivationPath, skipOpenApp });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith({\n sessionId: \"sessionId\",\n deviceAction: new GenerateTransactionDeviceAction({\n input: {\n derivationPath,\n skipOpenApp,\n contextModule: contextModuleStub,\n },\n loggerFactory: mockLoggerFactory,\n }),\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "aACA,IAAAA,EAQO,2CACPC,EAAqB,
|
|
6
|
-
"names": ["import_device_management_kit", "import_rxjs", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceActionIntermediateValue,\n type DeviceActionState,\n DeviceActionStatus,\n type DeviceManagementKit,\n type DeviceSessionId,\n type DmkError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { from } from \"rxjs\";\n\nimport {\n type GetAppConfigurationDAError,\n type GetAppConfigurationDAIntermediateValue,\n type GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport {\n type GetAddressDAError,\n type GetAddressDAIntermediateValue,\n type GetAddressDAOutput,\n type SignMessageDAOutput,\n type SignTransactionDAError,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAOutput,\n} from \"@api/index\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { SolanaAppBinder } from \"./SolanaAppBinder\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"SolanaAppBinder\", () => {\n // stub ContextModule for tests\n const contextModuleStub: ContextModule = {} as ContextModule;\n\n const mockedDmk: DeviceManagementKit = {\n sendCommand: vi.fn(),\n executeDeviceAction: vi.fn(),\n } as unknown as DeviceManagementKit;\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"should be defined\", () => {\n const binder = new SolanaAppBinder(\n {} as DeviceManagementKit,\n {} as DeviceSessionId,\n contextModuleStub,\n mockLoggerFactory,\n );\n expect(binder).toBeDefined();\n });\n\n describe(\"getAddress\", () => {\n it(\"should return the address\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const address = \"D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5\";\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n } as DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.getAddress({\n derivationPath: \"44'/501'\",\n checkOnDevice: false,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n GetAddressDAOutput,\n GetAddressDAError,\n GetAddressDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: address,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n describe(\"calls of executeDeviceAction with the correct params\", () => {\n const baseParams = {\n derivationPath: \"44'/60'/3'/2/1\",\n returnChainCode: false,\n skipOpenApp: false,\n };\n\n it(\"when checkOnDevice is true: UserInteractionRequired.VerifyAddress\", () => {\n // GIVEN\n const checkOnDevice = true;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.VerifyAddress,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n\n it(\"when checkOnDevice is false: UserInteractionRequired.None\", () => {\n // GIVEN\n const checkOnDevice = false;\n const params = {\n ...baseParams,\n checkOnDevice,\n };\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n appBinder.getAddress(params);\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetPubKeyCommand(params),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n });\n\n describe(\"signTransaction\", () => {\n it(\"should return the signature\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signature = new Uint8Array([0x01, 0x02, 0x03]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n } as DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.signTransaction({\n derivationPath: \"44'/501'\",\n transaction: new Uint8Array([0x01, 0x02, 0x03, 0x04]),\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n const states: DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signature,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const derivationPath = \"44'/60'/3'/2/1\";\n const transaction = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n const skipOpenApp = false;\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n appBinder.signTransaction({\n derivationPath,\n transaction,\n solanaTransactionOptionalConfig: { skipOpenApp: false },\n });\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n derivationPath,\n transaction,\n transactionOptions: { skipOpenApp },\n contextModule: contextModuleStub,\n },\n }),\n }),\n );\n });\n });\n\n describe(\"signMessage\", () => {\n it(\"should return the signed message\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = {\n signature: \"signature\",\n };\n const signMessageArgs = {\n derivationPath: \"44'/501'/0'/0'\",\n message: \"Hello world\",\n skipOpenApp: false,\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.signMessage(signMessageArgs);\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should accept a Uint8Array message for Raw pass-through\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const signedMessage = { signature: \"rawSig\" };\n const binaryPayload = new Uint8Array([0xff, 0x01, 0x02]);\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n } as DeviceActionState<\n SignMessageDAOutput,\n DmkError,\n DeviceActionIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.signMessage({\n derivationPath: \"44'/501'/0'/0'\",\n message: binaryPayload,\n skipOpenApp: false,\n });\n\n // THEN\n const states: DeviceActionState<\n SignMessageDAOutput,\n unknown,\n unknown\n >[] = [];\n observable.subscribe({\n next: (state) => states.push(state),\n error: (err) => reject(err),\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: signedMessage,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n });\n\n describe(\"getAppConfiguration\", () => {\n it(\"should return the app configuration\", () =>\n new Promise<void>((resolve, reject) => {\n // GIVEN\n const appConfiguration = {\n blindSigningEnabled: true,\n pubKeyDisplayMode: \"LONG\",\n version: \"2.5.10\",\n };\n\n vi.spyOn(mockedDmk, \"executeDeviceAction\").mockReturnValue({\n observable: from([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n } as DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >,\n ]),\n cancel: vi.fn(),\n });\n\n // WHEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n const { observable } = appBinder.getAppConfiguration();\n\n // THEN\n const states: DeviceActionState<\n GetAppConfigurationDAOutput,\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue\n >[] = [];\n\n observable.subscribe({\n next: (state) => {\n states.push(state);\n },\n error: (err) => {\n reject(err);\n },\n complete: () => {\n try {\n expect(states).toEqual([\n {\n status: DeviceActionStatus.Completed,\n output: appConfiguration,\n },\n ]);\n resolve();\n } catch (err) {\n reject(err as Error);\n }\n },\n });\n }));\n\n it(\"should call executeDeviceAction with the correct params\", () => {\n // GIVEN\n const appBinder = new SolanaAppBinder(\n mockedDmk,\n \"sessionId\",\n contextModuleStub,\n mockLoggerFactory,\n );\n\n // WHEN\n appBinder.getAppConfiguration();\n\n // THEN\n expect(mockedDmk.executeDeviceAction).toHaveBeenCalledWith(\n expect.objectContaining({\n sessionId: \"sessionId\",\n deviceAction: expect.objectContaining({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n }),\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aACA,IAAAA,EAQO,2CACPC,EAAqB,gBAiBrBC,EAA2C,gDAC3CC,EAAiC,sCACjCC,EAAgC,6BAEhC,MAAMC,EAAoB,KAAO,CAC/B,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEA,SAAS,kBAAmB,IAAM,CAEhC,MAAMC,EAAmC,CAAC,EAEpCC,EAAiC,CACrC,YAAa,GAAG,GAAG,EACnB,oBAAqB,GAAG,GAAG,CAC7B,EACA,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,GAAG,oBAAqB,IAAM,CAC5B,MAAMC,EAAS,IAAI,kBACjB,CAAC,EACD,CAAC,EACDF,EACAD,CACF,EACA,OAAOG,CAAM,EAAE,YAAY,CAC7B,CAAC,EAED,SAAS,aAAc,IAAM,CAC3B,GAAG,4BAA6B,IAC9B,IAAI,QAAc,CAACC,EAASC,IAAW,CAErC,MAAMC,EAAU,+CAEhB,GAAG,MAAMJ,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQI,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMC,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,WAAW,CAC1C,eAAgB,WAChB,cAAe,GACf,YAAa,EACf,CAAC,EAGKE,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQH,CACV,CACF,CAAC,EACDF,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,SAAS,uDAAwD,IAAM,CACrE,MAAMC,EAAa,CACjB,eAAgB,iBAChB,gBAAiB,GACjB,YAAa,EACf,EAEA,GAAG,oEAAqE,IAAM,CAG5E,MAAMC,EAAS,CACb,GAAGD,EACH,gBACF,EAGkB,IAAI,kBACpBV,EACA,YACAD,EACAD,CACF,EACU,WAAWa,CAAM,EAG3B,OAAOX,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,QAAS,IAAI,mBAAiBW,CAAM,EACpC,QAAS,SACT,wBAAyB,0BAAwB,cACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,EAED,GAAG,4DAA6D,IAAM,CAGpE,MAAMA,EAAS,CACb,GAAGD,EACH,gBACF,EAGkB,IAAI,kBACpBV,EACA,YACAD,EACAD,CACF,EACU,WAAWa,CAAM,EAG3B,OAAOX,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,QAAS,IAAI,mBAAiBW,CAAM,EACpC,QAAS,SACT,wBAAyB,0BAAwB,KACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,CACH,CAAC,EAED,SAAS,kBAAmB,IAAM,CAChC,GAAG,8BAA+B,IAChC,IAAI,QAAc,CAACT,EAASC,IAAW,CAErC,MAAMS,EAAY,IAAI,WAAW,CAAC,EAAM,EAAM,CAAI,CAAC,EAEnD,GAAG,MAAMZ,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQY,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMP,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,gBAAgB,CAC/C,eAAgB,WAChB,YAAa,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACpD,gCAAiC,CAAE,YAAa,EAAM,CACxD,CAAC,EAGKE,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQK,CACV,CACF,CAAC,EACDV,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAAM,CAElE,MAAMI,EAAiB,iBACjBC,EAAc,IAAI,WAAW,CAAC,EAAM,EAAM,EAAM,CAAI,CAAC,EACrDC,EAAc,GAGF,IAAI,kBACpBf,EACA,YACAD,EACAD,CACF,EACU,gBAAgB,CACxB,eAAAe,EACA,YAAAC,EACA,gCAAiC,CAAE,YAAa,EAAM,CACxD,CAAC,EAGD,OAAOd,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,eAAAa,EACA,YAAAC,EACA,mBAAoB,CAAE,YAAAC,CAAY,EAClC,cAAehB,CACjB,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,mCAAoC,IACrC,IAAI,QAAc,CAACG,EAASC,IAAW,CAErC,MAAMa,EAAgB,CACpB,UAAW,WACb,EACMC,EAAkB,CACtB,eAAgB,iBAChB,QAAS,cACT,YAAa,EACf,EAEA,GAAG,MAAMjB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQgB,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMX,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,YAAYY,CAAe,EAGtDV,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQS,CACV,CACF,CAAC,EACDd,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAC5D,IAAI,QAAc,CAACP,EAASC,IAAW,CAErC,MAAMa,EAAgB,CAAE,UAAW,QAAS,EACtCE,EAAgB,IAAI,WAAW,CAAC,IAAM,EAAM,CAAI,CAAC,EAEvD,GAAG,MAAMlB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQgB,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMX,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,YAAY,CAC3C,eAAgB,iBAChB,QAASa,EACT,YAAa,EACf,CAAC,EAGKX,EAIA,CAAC,EACPD,EAAW,UAAU,CACnB,KAAOE,GAAUD,EAAO,KAAKC,CAAK,EAClC,MAAQC,GAAQN,EAAOM,CAAG,EAC1B,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQS,CACV,CACF,CAAC,EACDd,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,CACN,CAAC,EAED,SAAS,sBAAuB,IAAM,CACpC,GAAG,sCAAuC,IACxC,IAAI,QAAc,CAACP,EAASC,IAAW,CAErC,MAAMgB,EAAmB,CACvB,oBAAqB,GACrB,kBAAmB,OACnB,QAAS,QACX,EAEA,GAAG,MAAMnB,EAAW,qBAAqB,EAAE,gBAAgB,CACzD,cAAY,QAAK,CACf,CACE,OAAQ,qBAAmB,UAC3B,OAAQmB,CACV,CAKF,CAAC,EACD,OAAQ,GAAG,GAAG,CAChB,CAAC,EAGD,MAAMd,EAAY,IAAI,kBACpBL,EACA,YACAD,EACAD,CACF,EACM,CAAE,WAAAQ,CAAW,EAAID,EAAU,oBAAoB,EAG/CE,EAIA,CAAC,EAEPD,EAAW,UAAU,CACnB,KAAOE,GAAU,CACfD,EAAO,KAAKC,CAAK,CACnB,EACA,MAAQC,GAAQ,CACdN,EAAOM,CAAG,CACZ,EACA,SAAU,IAAM,CACd,GAAI,CACF,OAAOF,CAAM,EAAE,QAAQ,CACrB,CACE,OAAQ,qBAAmB,UAC3B,OAAQY,CACV,CACF,CAAC,EACDjB,EAAQ,CACV,OAASO,EAAK,CACZN,EAAOM,CAAY,CACrB,CACF,CACF,CAAC,CACH,CAAC,CAAC,EAEJ,GAAG,0DAA2D,IAAM,CAEhD,IAAI,kBACpBT,EACA,YACAD,EACAD,CACF,EAGU,oBAAoB,EAG9B,OAAOE,EAAU,mBAAmB,EAAE,qBACpC,OAAO,iBAAiB,CACtB,UAAW,YACX,aAAc,OAAO,iBAAiB,CACpC,MAAO,CACL,QAAS,IAAI,6BACb,QAAS,SACT,wBAAyB,0BAAwB,KACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_rxjs", "import_GetAppConfigurationCommand", "import_GetPubKeyCommand", "import_SolanaAppBinder", "mockLoggerFactory", "contextModuleStub", "mockedDmk", "binder", "resolve", "reject", "address", "appBinder", "observable", "states", "state", "err", "baseParams", "params", "signature", "derivationPath", "transaction", "skipOpenApp", "signedMessage", "signMessageArgs", "binaryPayload", "appConfiguration"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=Object.defineProperty;var a=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var v=(p,e)=>{for(var s in e)t(p,s,{get:e[s],enumerable:!0})},A=(p,e,s,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of l(e))!c.call(p,o)&&o!==s&&t(p,o,{get:()=>e[o],enumerable:!(i=a(e,o))||i.enumerable});return p};var m=p=>A(t({},"__esModule",{value:!0}),p);var f={};v(f,{SolanaApplicationResolver:()=>S});module.exports=m(f);var r=require("@ledgerhq/device-management-kit");const n="0.0.1";class S{resolve(e,s){if(e.sessionStateType===r.DeviceSessionStateType.Connected)return{isCompatible:!1,version:n};const i=e.currentApp,o=i?.name;return!o||o!=="Solana"?{isCompatible:!1,version:n}:{isCompatible:!0,version:i.version}}}0&&(module.exports={SolanaApplicationResolver});
|
|
2
|
+
//# sourceMappingURL=SolanaApplicationResolver.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/internal/app-binder/SolanaApplicationResolver.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type AppConfig,\n type ApplicationResolver,\n type DeviceSessionState,\n DeviceSessionStateType,\n type ResolvedApp,\n} from \"@ledgerhq/device-management-kit\";\n\nconst DEFAULT_VERSION = \"0.0.1\";\n\nexport class SolanaApplicationResolver implements ApplicationResolver {\n resolve(deviceState: DeviceSessionState, _appConfig: AppConfig): ResolvedApp {\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n return { isCompatible: false, version: DEFAULT_VERSION };\n }\n\n const currentApp = deviceState.currentApp;\n const appName = currentApp?.name;\n\n if (!appName || appName !== \"Solana\") {\n return { isCompatible: false, version: DEFAULT_VERSION };\n }\n\n return { isCompatible: true, version: currentApp.version };\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,+BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAMO,2CAEP,MAAMC,EAAkB,QAEjB,MAAMH,CAAyD,CACpE,QAAQI,EAAiCC,EAAoC,CAC3E,GAAID,EAAY,mBAAqB,yBAAuB,UAC1D,MAAO,CAAE,aAAc,GAAO,QAASD,CAAgB,EAGzD,MAAMG,EAAaF,EAAY,WACzBG,EAAUD,GAAY,KAE5B,MAAI,CAACC,GAAWA,IAAY,SACnB,CAAE,aAAc,GAAO,QAASJ,CAAgB,EAGlD,CAAE,aAAc,GAAM,QAASG,EAAW,OAAQ,CAC3D,CACF",
|
|
6
|
+
"names": ["SolanaApplicationResolver_exports", "__export", "SolanaApplicationResolver", "__toCommonJS", "import_device_management_kit", "DEFAULT_VERSION", "deviceState", "_appConfig", "currentApp", "appName"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("@ledgerhq/device-management-kit"),l=require("./SolanaApplicationResolver");describe("SolanaApplicationResolver",()=>{const s=new l.SolanaApplicationResolver;function i(e){return{version:e,blindSigningEnabled:!1}}function a(e,n,o=t.DeviceModelId.FLEX){return{sessionStateType:t.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:e,version:n},deviceModelId:o,isSecureConnectionAllowed:!1}}function c(){return{sessionStateType:t.DeviceSessionStateType.Connected,deviceStatus:t.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.0.0"},deviceModelId:t.DeviceModelId.FLEX,isSecureConnectionAllowed:!1}}it("should resolve as incompatible when device is Connected",()=>{const e=c(),n=i("1.0.0"),o=s.resolve(e,n);expect(o).toStrictEqual({isCompatible:!1,version:"0.0.1"})}),it("should resolve as compatible with currentApp.version when app is Solana",()=>{const e=a("Solana","1.4.0"),n=i("1.0.0"),o=s.resolve(e,n);expect(o).toStrictEqual({isCompatible:!0,version:"1.4.0"})}),it("should resolve as incompatible when app is not Solana",()=>{const e=a("Ethereum","1.0.0"),n=i("1.0.0"),o=s.resolve(e,n);expect(o).toStrictEqual({isCompatible:!1,version:"0.0.1"})})});
|
|
2
|
+
//# sourceMappingURL=SolanaApplicationResolver.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/internal/app-binder/SolanaApplicationResolver.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type AppConfig,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { SolanaApplicationResolver } from \"./SolanaApplicationResolver\";\n\ndescribe(\"SolanaApplicationResolver\", () => {\n const resolver = new SolanaApplicationResolver();\n\n function createAppConfig(version: string): AppConfig {\n return {\n version,\n blindSigningEnabled: false,\n };\n }\n\n function createReadyState(\n appName: string,\n appVersion: string,\n modelId: DeviceModelId = DeviceModelId.FLEX,\n ) {\n return {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: appName, version: appVersion },\n deviceModelId: modelId,\n isSecureConnectionAllowed: false,\n };\n }\n\n function createConnectedState() {\n return {\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n }\n\n it(\"should resolve as incompatible when device is Connected\", () => {\n const state = createConnectedState();\n const config = createAppConfig(\"1.0.0\");\n const result = resolver.resolve(state, config);\n expect(result).toStrictEqual({\n isCompatible: false,\n version: \"0.0.1\",\n });\n });\n\n it(\"should resolve as compatible with currentApp.version when app is Solana\", () => {\n const state = createReadyState(\"Solana\", \"1.4.0\");\n const config = createAppConfig(\"1.0.0\");\n const result = resolver.resolve(state, config);\n expect(result).toStrictEqual({\n isCompatible: true,\n version: \"1.4.0\",\n });\n });\n\n it(\"should resolve as incompatible when app is not Solana\", () => {\n const state = createReadyState(\"Ethereum\", \"1.0.0\");\n const config = createAppConfig(\"1.0.0\");\n const result = resolver.resolve(state, config);\n expect(result).toStrictEqual({\n isCompatible: false,\n version: \"0.0.1\",\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAKO,2CAEPC,EAA0C,uCAE1C,SAAS,4BAA6B,IAAM,CAC1C,MAAMC,EAAW,IAAI,4BAErB,SAASC,EAAgBC,EAA4B,CACnD,MAAO,CACL,QAAAA,EACA,oBAAqB,EACvB,CACF,CAEA,SAASC,EACPC,EACAC,EACAC,EAAyB,gBAAc,KACvC,CACA,MAAO,CACL,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAMF,EAAS,QAASC,CAAW,EACjD,cAAeC,EACf,0BAA2B,EAC7B,CACF,CAEA,SAASC,GAAuB,CAC9B,MAAO,CACL,iBAAkB,yBAAuB,UACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,KAC7B,0BAA2B,EAC7B,CACF,CAEA,GAAG,0DAA2D,IAAM,CAClE,MAAMC,EAAQD,EAAqB,EAC7BE,EAASR,EAAgB,OAAO,EAChCS,EAASV,EAAS,QAAQQ,EAAOC,CAAM,EAC7C,OAAOC,CAAM,EAAE,cAAc,CAC3B,aAAc,GACd,QAAS,OACX,CAAC,CACH,CAAC,EAED,GAAG,0EAA2E,IAAM,CAClF,MAAMF,EAAQL,EAAiB,SAAU,OAAO,EAC1CM,EAASR,EAAgB,OAAO,EAChCS,EAASV,EAAS,QAAQQ,EAAOC,CAAM,EAC7C,OAAOC,CAAM,EAAE,cAAc,CAC3B,aAAc,GACd,QAAS,OACX,CAAC,CACH,CAAC,EAED,GAAG,wDAAyD,IAAM,CAChE,MAAMF,EAAQL,EAAiB,WAAY,OAAO,EAC5CM,EAASR,EAAgB,OAAO,EAChCS,EAASV,EAAS,QAAQQ,EAAOC,CAAM,EAC7C,OAAOC,CAAM,EAAE,cAAc,CAC3B,aAAc,GACd,QAAS,OACX,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_SolanaApplicationResolver", "resolver", "createAppConfig", "version", "createReadyState", "appName", "appVersion", "modelId", "createConnectedState", "state", "config", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var d=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var y=(e,r)=>{for(var o in r)d(e,o,{get:r[o],enumerable:!0})},I=(e,r,o,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of E(r))!S.call(e,t)&&t!==o&&d(e,t,{get:()=>r[t],enumerable:!(a=C(r,t))||a.enumerable});return e};var D=e=>I(d({},"__esModule",{value:!0}),e);var v={};y(v,{CLA:()=>l,DER_SIG_MAX_BYTES:()=>x,DER_SIG_MIN_BYTES:()=>g,INS:()=>c,P1:()=>m,P2:()=>u,ProvideInstructionDescriptorCommand:()=>R,SIGNATURE_TAG:()=>A});module.exports=D(v);var n=require("@ledgerhq/device-management-kit"),i=require("@ledgerhq/signer-utils"),s=require("./utils/SolanaApplicationErrors");const l=224,c=22,m=0,u=0,A=21,g=70,x=72;class R{constructor(r){this.args=r}errorHelper=new i.CommandErrorHelper(s.SOLANA_APP_ERRORS,s.SolanaAppCommandErrorFactory);name="ProvideInstructionDescriptor";getApdu(){const{dataHex:r,signatureHex:o}=this.args,a=new n.ApduBuilder({cla:l,ins:c,p1:m,p2:u}),t=o.length/2;if(t<g||t>x||o.length%2!==0)throw new Error(`Invalid signature length: ${t} bytes`);const p=r.length/2+1+1+t;if(p>255)throw new Error(`Descriptor payload too large for short APDU: ${p} > 255`);return a.addHexaStringToData(r).add8BitUIntToData(A).add8BitUIntToData(t).addHexaStringToData(o),a.build()}parseResponse(r){const o=this.errorHelper.getError(r);return o||(r.data.length!==0?(0,n.CommandResultFactory)({error:new n.InvalidStatusWordError("Unexpected data in response")}):(0,n.CommandResultFactory)({data:void 0}))}}0&&(module.exports={CLA,DER_SIG_MAX_BYTES,DER_SIG_MIN_BYTES,INS,P1,P2,ProvideInstructionDescriptorCommand,SIGNATURE_TAG});
|
|
2
|
+
//# sourceMappingURL=ProvideInstructionDescriptorCommand.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/command/ProvideInstructionDescriptorCommand.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type Apdu,\n ApduBuilder,\n type ApduBuilderArgs,\n type ApduResponse,\n type Command,\n type CommandResult,\n CommandResultFactory,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { CommandErrorHelper } from \"@ledgerhq/signer-utils\";\n\nimport {\n SOLANA_APP_ERRORS,\n SolanaAppCommandErrorFactory,\n type SolanaAppErrorCodes,\n} from \"./utils/SolanaApplicationErrors\";\n\nexport const CLA = 0xe0;\nexport const INS = 0x16;\nexport const P1 = 0x00;\nexport const P2 = 0x00;\nexport const SIGNATURE_TAG = 0x15;\nexport const DER_SIG_MIN_BYTES = 70;\nexport const DER_SIG_MAX_BYTES = 72;\n\nexport type ProvideInstructionDescriptorCommandArgs = {\n dataHex: string;\n signatureHex: string;\n};\n\nexport class ProvideInstructionDescriptorCommand\n implements\n Command<void, ProvideInstructionDescriptorCommandArgs, SolanaAppErrorCodes>\n{\n private readonly errorHelper = new CommandErrorHelper<\n void,\n SolanaAppErrorCodes\n >(SOLANA_APP_ERRORS, SolanaAppCommandErrorFactory);\n\n constructor(readonly args: ProvideInstructionDescriptorCommandArgs) {}\n readonly name = \"ProvideInstructionDescriptor\";\n\n getApdu(): Apdu {\n const { dataHex, signatureHex } = this.args;\n\n const builder = new ApduBuilder({\n cla: CLA,\n ins: INS,\n p1: P1,\n p2: P2,\n } as ApduBuilderArgs);\n\n const sigLen = signatureHex.length / 2;\n if (\n sigLen < DER_SIG_MIN_BYTES ||\n sigLen > DER_SIG_MAX_BYTES ||\n signatureHex.length % 2 !== 0\n ) {\n throw new Error(`Invalid signature length: ${sigLen} bytes`);\n }\n\n const dataLen = dataHex.length / 2;\n const total = dataLen + 1 + 1 + sigLen;\n if (total > 255) {\n throw new Error(\n `Descriptor payload too large for short APDU: ${total} > 255`,\n );\n }\n\n builder\n .addHexaStringToData(dataHex)\n .add8BitUIntToData(SIGNATURE_TAG)\n .add8BitUIntToData(sigLen)\n .addHexaStringToData(signatureHex);\n\n return builder.build();\n }\n\n parseResponse(\n response: ApduResponse,\n ): CommandResult<void, SolanaAppErrorCodes> {\n const error = this.errorHelper.getError(response);\n if (error) return error;\n\n if (response.data.length !== 0) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Unexpected data in response\"),\n });\n }\n return CommandResultFactory({ data: undefined });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,SAAAE,EAAA,sBAAAC,EAAA,sBAAAC,EAAA,QAAAC,EAAA,OAAAC,EAAA,OAAAC,EAAA,wCAAAC,EAAA,kBAAAC,IAAA,eAAAC,EAAAV,GAAA,IAAAW,EASO,2CACPC,EAAmC,kCAEnCC,EAIO,2CAEA,MAAMX,EAAM,IACNG,EAAM,GACNC,EAAK,EACLC,EAAK,EACLE,EAAgB,GAChBL,EAAoB,GACpBD,EAAoB,GAO1B,MAAMK,CAGb,CAME,YAAqBM,EAA+C,CAA/C,UAAAA,CAAgD,CALpD,YAAc,IAAI,qBAGjC,oBAAmB,8BAA4B,EAGxC,KAAO,+BAEhB,SAAgB,CACd,KAAM,CAAE,QAAAC,EAAS,aAAAC,CAAa,EAAI,KAAK,KAEjCC,EAAU,IAAI,cAAY,CAC9B,IAAKf,EACL,IAAKG,EACL,GAAIC,EACJ,GAAIC,CACN,CAAoB,EAEdW,EAASF,EAAa,OAAS,EACrC,GACEE,EAASd,GACTc,EAASf,GACTa,EAAa,OAAS,IAAM,EAE5B,MAAM,IAAI,MAAM,6BAA6BE,CAAM,QAAQ,EAI7D,MAAMC,EADUJ,EAAQ,OAAS,EACT,EAAI,EAAIG,EAChC,GAAIC,EAAQ,IACV,MAAM,IAAI,MACR,gDAAgDA,CAAK,QACvD,EAGF,OAAAF,EACG,oBAAoBF,CAAO,EAC3B,kBAAkBN,CAAa,EAC/B,kBAAkBS,CAAM,EACxB,oBAAoBF,CAAY,EAE5BC,EAAQ,MAAM,CACvB,CAEA,cACEG,EAC0C,CAC1C,MAAMC,EAAQ,KAAK,YAAY,SAASD,CAAQ,EAChD,OAAIC,IAEAD,EAAS,KAAK,SAAW,KACpB,wBAAqB,CAC1B,MAAO,IAAI,yBAAuB,6BAA6B,CACjE,CAAC,KAEI,wBAAqB,CAAE,KAAM,MAAU,CAAC,EACjD,CACF",
|
|
6
|
+
"names": ["ProvideInstructionDescriptorCommand_exports", "__export", "CLA", "DER_SIG_MAX_BYTES", "DER_SIG_MIN_BYTES", "INS", "P1", "P2", "ProvideInstructionDescriptorCommand", "SIGNATURE_TAG", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_SolanaApplicationErrors", "args", "dataHex", "signatureHex", "builder", "sigLen", "total", "response", "error"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=require("@ledgerhq/device-management-kit"),t=require("vitest"),e=require("./ProvideInstructionDescriptorCommand");const s="f0cacc1a",c=Uint8Array.from([240,202,204,26]),n="01".repeat(70),i=70,p=c.length+1+1+i;(0,t.describe)("ProvideInstructionDescriptorCommand",()=>{(0,t.describe)("getApdu",()=>{(0,t.it)("builds the correct APDU with INS=0x16, P1=0x00, P2=0x00",()=>{const a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:n}).getApdu().getRawApdu(),d=[e.CLA,e.INS,e.P1,e.P2,p],u=[...c,e.SIGNATURE_TAG,i,...Uint8Array.from(Buffer.from(n,"hex"))],x=Uint8Array.from([...d,...u]);(0,t.expect)(a).toStrictEqual(x)}),(0,t.it)("always uses signature tag 0x15",()=>{const a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:n}).getApdu().getRawApdu(),d=5+c.length;(0,t.expect)(a[d]).toBe(e.SIGNATURE_TAG)}),(0,t.it)("throws if signature is too short (<70 bytes)",()=>{const o="ab".repeat(68),a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:o});(0,t.expect)(()=>a.getApdu()).toThrow(/Invalid signature length/i)}),(0,t.it)("throws if signature is too long (>72 bytes)",()=>{const o="ab".repeat(73),a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:o});(0,t.expect)(()=>a.getApdu()).toThrow(/Invalid signature length/i)}),(0,t.it)("throws if signature hex has odd length",()=>{const o="a".repeat(141),a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:o});(0,t.expect)(()=>a.getApdu()).toThrow(/Invalid signature length/i)}),(0,t.it)("throws if the total short-APDU payload would exceed 255 bytes",()=>{const o="f0".repeat(200),a=new e.ProvideInstructionDescriptorCommand({dataHex:o,signatureHex:n});(0,t.expect)(()=>a.getApdu()).toThrow(/payload too large/i)})}),(0,t.describe)("parseResponse",()=>{(0,t.it)("returns success when status is 0x9000 and no data",()=>{const a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:n}).parseResponse({statusCode:Uint8Array.from([144,0]),data:new Uint8Array});(0,t.expect)(a).toStrictEqual((0,r.CommandResultFactory)({data:void 0})),(0,t.expect)((0,r.isSuccessCommandResult)(a)).toBe(!0)}),(0,t.it)("returns an app error when status code is not 0x9000",()=>{const a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:n}).parseResponse({statusCode:Uint8Array.from([106,128]),data:new Uint8Array});(0,t.expect)((0,r.isSuccessCommandResult)(a)).toBe(!1)}),(0,t.it)("returns InvalidStatusWordError if response contains unexpected data",()=>{const a=new e.ProvideInstructionDescriptorCommand({dataHex:s,signatureHex:n}).parseResponse({statusCode:Uint8Array.from([144,0]),data:Uint8Array.from([1])});(0,t.expect)((0,r.isSuccessCommandResult)(a)).toBe(!1),(0,t.expect)(a.error).toBeInstanceOf(r.InvalidStatusWordError)})})});
|
|
2
|
+
//# sourceMappingURL=ProvideInstructionDescriptorCommand.test.js.map
|