@ledgerhq/device-signer-kit-solana 0.0.0-signer-eth-plugin-fix-20250331141239 → 0.0.0-test-attest-npmjs-1-20251120163531
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 +113 -23
- package/lib/cjs/api/SignerSolana.js +1 -1
- package/lib/cjs/api/SignerSolana.js.map +1 -1
- package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
- package/lib/cjs/api/SignerSolanaBuilder.js.map +3 -3
- package/lib/cjs/api/SolanaTools.js +2 -0
- package/lib/cjs/api/SolanaTools.js.map +7 -0
- package/lib/cjs/api/SolanaToolsBuilder.js +2 -0
- package/lib/cjs/api/SolanaToolsBuilder.js.map +7 -0
- package/lib/cjs/api/app-binder/GenerateTransactionDeviceActionTypes.js +2 -0
- package/lib/cjs/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +7 -0
- package/lib/cjs/api/app-binder/SignMessageDeviceActionTypes.js.map +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.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/AddressOption.js +1 -1
- package/lib/cjs/api/model/AddressOption.js.map +1 -1
- package/lib/cjs/api/model/MessageOptions.js +2 -0
- package/lib/cjs/api/model/MessageOptions.js.map +7 -0
- package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js +2 -0
- package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js.map +7 -0
- package/lib/cjs/api/model/TransactionResolutionContext.js +2 -0
- package/lib/cjs/api/model/TransactionResolutionContext.js.map +7 -0
- package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
- package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
- package/lib/cjs/internal/DefaultSignerSolana.test.js +1 -1
- package/lib/cjs/internal/DefaultSignerSolana.test.js.map +3 -3
- package/lib/cjs/internal/DefaultSolanaTools.js +2 -0
- package/lib/cjs/internal/DefaultSolanaTools.js.map +7 -0
- package/lib/cjs/internal/DefaultSolanaTools.test.js +2 -0
- package/lib/cjs/internal/DefaultSolanaTools.test.js.map +7 -0
- 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/command/GetAppConfigurationCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
- package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
- 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 +3 -3
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
- package/lib/cjs/internal/app-binder/di/appBinderModule.js +1 -1
- package/lib/cjs/internal/app-binder/di/appBinderModule.js.map +3 -3
- package/lib/cjs/internal/app-binder/di/appBinderModule.test.js +1 -1
- package/lib/cjs/internal/app-binder/di/appBinderModule.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.js +2 -0
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js +2 -0
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/bs58Encoder.js +2 -0
- package/lib/cjs/internal/app-binder/services/bs58Encoder.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
- 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 +3 -1
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- package/lib/cjs/internal/di.js +1 -1
- package/lib/cjs/internal/di.js.map +3 -3
- package/lib/cjs/internal/externalTypes.js +1 -1
- package/lib/cjs/internal/externalTypes.js.map +2 -2
- package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
- package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
- package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
- 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/generateTransaction/GenerateTransactionUseCase.js +2 -0
- package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
- package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
- package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
- 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/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
- package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
- package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
- package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
- package/lib/cjs/package.json +17 -12
- package/lib/esm/api/SignerSolanaBuilder.js +1 -1
- package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
- package/lib/esm/api/SolanaTools.js +1 -0
- package/lib/esm/api/SolanaToolsBuilder.js +2 -0
- package/lib/esm/api/SolanaToolsBuilder.js.map +7 -0
- package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +7 -0
- 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 +7 -0
- package/lib/esm/api/model/SolanaTransactionOptionalConfig.js +1 -0
- package/lib/esm/api/model/SolanaTransactionOptionalConfig.js.map +7 -0
- package/lib/esm/api/model/TransactionResolutionContext.js +1 -0
- package/lib/esm/api/model/TransactionResolutionContext.js.map +7 -0
- package/lib/esm/internal/DefaultSignerSolana.js +1 -1
- package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
- package/lib/esm/internal/DefaultSignerSolana.test.js +1 -1
- package/lib/esm/internal/DefaultSignerSolana.test.js.map +3 -3
- package/lib/esm/internal/DefaultSolanaTools.js +2 -0
- package/lib/esm/internal/DefaultSolanaTools.js.map +7 -0
- package/lib/esm/internal/DefaultSolanaTools.test.js +2 -0
- package/lib/esm/internal/DefaultSolanaTools.test.js.map +7 -0
- 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/command/GetAppConfigurationCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
- package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
- 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 +3 -3
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
- package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
- package/lib/esm/internal/app-binder/di/appBinderModule.js +1 -1
- package/lib/esm/internal/app-binder/di/appBinderModule.js.map +3 -3
- package/lib/esm/internal/app-binder/di/appBinderModule.test.js +1 -1
- package/lib/esm/internal/app-binder/di/appBinderModule.test.js.map +2 -2
- package/lib/esm/internal/app-binder/services/ApplicationChecker.js +2 -0
- package/lib/esm/internal/app-binder/services/ApplicationChecker.js.map +7 -0
- package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js +2 -0
- package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
- package/lib/esm/internal/app-binder/services/TransactionInspector.js +2 -0
- package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +7 -0
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +2 -0
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
- package/lib/esm/internal/app-binder/services/bs58Encoder.js +2 -0
- package/lib/esm/internal/app-binder/services/bs58Encoder.js.map +7 -0
- package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
- 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 +3 -1
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- package/lib/esm/internal/di.js +1 -1
- package/lib/esm/internal/di.js.map +3 -3
- package/lib/esm/internal/externalTypes.js +1 -1
- package/lib/esm/internal/externalTypes.js.map +2 -2
- package/lib/esm/internal/use-cases/address/GetAddressUseCase.js +1 -1
- package/lib/esm/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
- package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
- package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
- 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/generateTransaction/GenerateTransactionUseCase.js +2 -0
- package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
- package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
- package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.js +1 -1
- package/lib/esm/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
- 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/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
- package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
- package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
- package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
- package/lib/esm/package.json +17 -12
- package/lib/types/api/SignerSolana.d.ts +4 -3
- package/lib/types/api/SignerSolana.d.ts.map +1 -1
- package/lib/types/api/SignerSolanaBuilder.d.ts +12 -1
- package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
- package/lib/types/api/SolanaTools.d.ts +10 -0
- package/lib/types/api/SolanaTools.d.ts.map +1 -0
- package/lib/types/api/SolanaToolsBuilder.d.ts +39 -0
- package/lib/types/api/SolanaToolsBuilder.d.ts.map +1 -0
- package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts +24 -0
- package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts.map +1 -0
- package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts +3 -2
- package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +11 -3
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +4 -1
- package/lib/types/api/index.d.ts.map +1 -1
- package/lib/types/api/model/AddressOption.d.ts +1 -0
- package/lib/types/api/model/AddressOption.d.ts.map +1 -1
- package/lib/types/api/model/MessageOptions.d.ts +4 -0
- package/lib/types/api/model/MessageOptions.d.ts.map +1 -0
- package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts +7 -0
- package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts.map +1 -0
- package/lib/types/api/model/TransactionResolutionContext.d.ts +8 -0
- package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -0
- package/lib/types/internal/DefaultSignerSolana.d.ts +295 -4
- package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
- package/lib/types/internal/DefaultSolanaTools.d.ts +20 -0
- package/lib/types/internal/DefaultSolanaTools.d.ts.map +1 -0
- package/lib/types/internal/DefaultSolanaTools.test.d.ts +2 -0
- package/lib/types/internal/DefaultSolanaTools.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +12 -3
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts +12 -0
- package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +6 -4
- package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts +14 -0
- package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +14 -0
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts +14 -9
- package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts +1 -0
- package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts +23 -0
- package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts.map +1 -0
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +18 -1
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -1
- package/lib/types/internal/app-binder/di/appBinderModule.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts +13 -0
- package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts +14 -0
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +46 -0
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/bs58Encoder.d.ts +9 -0
- package/lib/types/internal/app-binder/services/bs58Encoder.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +14 -0
- package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +24 -0
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +15 -0
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +26 -3
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
- package/lib/types/internal/di.d.ts +3 -1
- package/lib/types/internal/di.d.ts.map +1 -1
- package/lib/types/internal/externalTypes.d.ts +1 -0
- package/lib/types/internal/externalTypes.d.ts.map +1 -1
- package/lib/types/internal/use-cases/address/GetAddressUseCase.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 +1 -0
- package/lib/types/internal/use-cases/di/useCasesTypes.d.ts.map +1 -1
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts +10 -0
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts.map +1 -0
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts +2 -0
- package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts.map +1 -0
- package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts +2 -1
- package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts.map +1 -1
- package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +2 -2
- package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +19 -14
- package/lib/cjs/api/model/TransactionOptions.js +0 -2
- package/lib/cjs/api/model/TransactionOptions.js.map +0 -7
- package/lib/esm/api/model/TransactionOptions.js +0 -1
- package/lib/types/api/model/TransactionOptions.d.ts +0 -2
- package/lib/types/api/model/TransactionOptions.d.ts.map +0 -1
- /package/lib/esm/api/{model/TransactionOptions.js.map → SolanaTools.js.map} +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var n=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var f=Object.prototype.hasOwnProperty;var l=(o,p)=>{for(var e in p)n(o,e,{get:p[e],enumerable:!0})},c=(o,p,e,i)=>{if(p&&typeof p=="object"||typeof p=="function")for(let r of B(p))!f.call(o,r)&&r!==e&&n(o,r,{get:()=>p[r],enumerable:!(i=m(p,r))||i.enumerable});return o};var s=o=>c(n({},"__esModule",{value:!0}),o);var y={};l(y,{appBinderModuleFactory:()=>u});module.exports=s(y);var t=require("inversify"),a=require("../../app-binder/di/appBinderTypes"),d=require("../../app-binder/SolanaAppBinder");const u=()=>new t.ContainerModule(({bind:o})=>{o(a.appBinderTypes.AppBinder).to(d.SolanaAppBinder)});0&&(module.exports={appBinderModuleFactory});
|
|
2
2
|
//# sourceMappingURL=appBinderModule.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/di/appBinderModule.ts"],
|
|
4
|
-
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\nexport const appBinderModuleFactory = () =>\n new ContainerModule(
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAA+B,kDAC/BC,EAAgC,gDAEzB,MAAMJ,EAAyB,IACpC,IAAI,
|
|
6
|
-
"names": ["appBinderModule_exports", "__export", "appBinderModuleFactory", "__toCommonJS", "import_inversify", "import_appBinderTypes", "import_SolanaAppBinder", "bind"
|
|
4
|
+
"sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\nexport const appBinderModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(appBinderTypes.AppBinder).to(SolanaAppBinder);\n });\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,4BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAA+B,kDAC/BC,EAAgC,gDAEzB,MAAMJ,EAAyB,IACpC,IAAI,kBAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAK,iBAAe,SAAS,EAAE,GAAG,iBAAe,CACnD,CAAC",
|
|
6
|
+
"names": ["appBinderModule_exports", "__export", "appBinderModuleFactory", "__toCommonJS", "import_inversify", "import_appBinderTypes", "import_SolanaAppBinder", "bind"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var r=require("inversify"),t=require("./appBinderModule");describe("appBinderModule",()=>{describe("Default",()=>{let o,e;beforeEach(()=>{e=(0,t.appBinderModuleFactory)(),o=new r.Container,o.
|
|
1
|
+
"use strict";var r=require("inversify"),t=require("./appBinderModule");describe("appBinderModule",()=>{describe("Default",()=>{let o,e;beforeEach(()=>{e=(0,t.appBinderModuleFactory)(),o=new r.Container,o.loadSync(e)}),it("should return appBinder module",()=>{expect(e).toBeDefined()})})});
|
|
2
2
|
//# sourceMappingURL=appBinderModule.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/di/appBinderModule.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"./appBinderModule\";\n\ndescribe(\"appBinderModule\", () => {\n describe(\"Default\", () => {\n let container: Container;\n let mod: ReturnType<typeof appBinderModuleFactory>;\n beforeEach(() => {\n mod = appBinderModuleFactory();\n container = new Container();\n container.
|
|
5
|
-
"mappings": "aAAA,IAAAA,EAA0B,qBAE1BC,EAAuC,6BAEvC,SAAS,kBAAmB,IAAM,CAChC,SAAS,UAAW,IAAM,CACxB,IAAIC,EACAC,EACJ,WAAW,IAAM,CACfA,KAAM,0BAAuB,EAC7BD,EAAY,IAAI,YAChBA,EAAU,
|
|
4
|
+
"sourcesContent": ["import { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"./appBinderModule\";\n\ndescribe(\"appBinderModule\", () => {\n describe(\"Default\", () => {\n let container: Container;\n let mod: ReturnType<typeof appBinderModuleFactory>;\n beforeEach(() => {\n mod = appBinderModuleFactory();\n container = new Container();\n container.loadSync(mod);\n });\n\n it(\"should return appBinder module\", () => {\n expect(mod).toBeDefined();\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA0B,qBAE1BC,EAAuC,6BAEvC,SAAS,kBAAmB,IAAM,CAChC,SAAS,UAAW,IAAM,CACxB,IAAIC,EACAC,EACJ,WAAW,IAAM,CACfA,KAAM,0BAAuB,EAC7BD,EAAY,IAAI,YAChBA,EAAU,SAASC,CAAG,CACxB,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,OAAOA,CAAG,EAAE,YAAY,CAC1B,CAAC,CACH,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["import_inversify", "import_appBinderModule", "container", "mod"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var r=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var h=(i,e)=>{for(var t in e)r(i,t,{get:e[t],enumerable:!0})},m=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of a(e))!c.call(i,s)&&s!==t&&r(i,s,{get:()=>e[s],enumerable:!(n=l(e,s))||n.enumerable});return i};var f=i=>m(r({},"__esModule",{value:!0}),i);var v={};h(v,{ApplicationChecker:()=>u});module.exports=f(v);var p=require("@ledgerhq/device-management-kit"),o=require("semver");class u{isCompatible=!0;version="0.0.1";modelId;constructor(e,t){if(this.modelId=e.deviceModelId,e.sessionStateType===p.DeviceSessionStateType.Connected){this.isCompatible=!1;return}if(e.currentApp.name!=="Solana"){this.isCompatible=!1;return}e.currentApp.name==="Solana"?this.version=e.currentApp.version:this.version=t.version}withMinVersionInclusive(e){return(0,o.gte)(this.version,e)||(this.isCompatible=!1),this}withMinVersionExclusive(e){return(0,o.gt)(this.version,e)||(this.isCompatible=!1),this}excludeDeviceModel(e){return this.modelId===e&&(this.isCompatible=!1),this}check(){return this.isCompatible}}0&&(module.exports={ApplicationChecker});
|
|
2
|
+
//# sourceMappingURL=ApplicationChecker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/services/ApplicationChecker.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type DeviceModelId,\n type DeviceSessionState,\n DeviceSessionStateType,\n} from \"@ledgerhq/device-management-kit\";\nimport { gt, gte } from \"semver\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\n\nexport class ApplicationChecker {\n private isCompatible: boolean = true;\n private version: string = \"0.0.1\";\n private modelId: DeviceModelId;\n\n constructor(deviceState: DeviceSessionState, appConfig: AppConfiguration) {\n this.modelId = deviceState.deviceModelId;\n\n // If device is not ready or app is unexpected, checker cannot be successful\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n this.isCompatible = false;\n return;\n }\n if (deviceState.currentApp.name !== \"Solana\") {\n this.isCompatible = false;\n return;\n }\n if (deviceState.currentApp.name === \"Solana\") {\n this.version = deviceState.currentApp.version;\n } else {\n // Fallback on appConfig version if a plugin is running.\n // It won't contain release candidate suffix but it should be enough for that edge case.\n this.version = appConfig.version;\n }\n }\n\n withMinVersionInclusive(version: string): ApplicationChecker {\n if (!gte(this.version, version)) {\n this.isCompatible = false;\n }\n return this;\n }\n\n withMinVersionExclusive(version: string): ApplicationChecker {\n if (!gt(this.version, version)) {\n this.isCompatible = false;\n }\n return this;\n }\n\n excludeDeviceModel(modelId: DeviceModelId): ApplicationChecker {\n if (this.modelId === modelId) {\n this.isCompatible = false;\n }\n return this;\n }\n\n check(): boolean {\n return this.isCompatible;\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAIO,2CACPC,EAAwB,kBAIjB,MAAMH,CAAmB,CACtB,aAAwB,GACxB,QAAkB,QAClB,QAER,YAAYI,EAAiCC,EAA6B,CAIxE,GAHA,KAAK,QAAUD,EAAY,cAGvBA,EAAY,mBAAqB,yBAAuB,UAAW,CACrE,KAAK,aAAe,GACpB,MACF,CACA,GAAIA,EAAY,WAAW,OAAS,SAAU,CAC5C,KAAK,aAAe,GACpB,MACF,CACIA,EAAY,WAAW,OAAS,SAClC,KAAK,QAAUA,EAAY,WAAW,QAItC,KAAK,QAAUC,EAAU,OAE7B,CAEA,wBAAwBC,EAAqC,CAC3D,SAAK,OAAI,KAAK,QAASA,CAAO,IAC5B,KAAK,aAAe,IAEf,IACT,CAEA,wBAAwBA,EAAqC,CAC3D,SAAK,MAAG,KAAK,QAASA,CAAO,IAC3B,KAAK,aAAe,IAEf,IACT,CAEA,mBAAmBC,EAA4C,CAC7D,OAAI,KAAK,UAAYA,IACnB,KAAK,aAAe,IAEf,IACT,CAEA,OAAiB,CACf,OAAO,KAAK,YACd,CACF",
|
|
6
|
+
"names": ["ApplicationChecker_exports", "__export", "ApplicationChecker", "__toCommonJS", "import_device_management_kit", "import_semver", "deviceState", "appConfig", "version", "modelId"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("@ledgerhq/device-management-kit"),n=require("vitest"),l=require("../../../api/model/PublicKeyDisplayMode"),i=require("./ApplicationChecker");function c(t){return{version:t,blindSigningEnabled:!1,pubKeyDisplayMode:l.PublicKeyDisplayMode.SHORT}}(0,n.describe)("ApplicationChecker (Solana)",()=>{(0,n.it)("should pass check when on Solana app and in valid state",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.4.0"),o=new i.ApplicationChecker(t,s).check();(0,n.expect)(o).toBe(!0)}),(0,n.it)("should reject if session state is Connected",()=>{const t={sessionStateType:e.DeviceSessionStateType.Connected,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.4.0"),o=new i.ApplicationChecker(t,s).check();(0,n.expect)(o).toBe(!1)}),(0,n.it)("should reject if not Solana app",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.0.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.0.0"),o=new i.ApplicationChecker(t,s).check();(0,n.expect)(o).toBe(!1)}),(0,n.it)("should pass with min version inclusive",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.4.0"),o=new i.ApplicationChecker(t,s).withMinVersionInclusive("1.3.0").check();(0,n.expect)(o).toBe(!0)}),(0,n.it)("should reject with min version inclusive if version too low",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.3.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.3.0"),o=new i.ApplicationChecker(t,s).withMinVersionInclusive("1.4.0").check();(0,n.expect)(o).toBe(!1)}),(0,n.it)("should pass with min version exclusive",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.4.0"),o=new i.ApplicationChecker(t,s).withMinVersionExclusive("1.3.0").check();(0,n.expect)(o).toBe(!0)}),(0,n.it)("should reject with min version exclusive if equal",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.4.0"),o=new i.ApplicationChecker(t,s).withMinVersionExclusive("1.4.0").check();(0,n.expect)(o).toBe(!1)}),(0,n.it)("should reject excluded device model",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:e.DeviceModelId.NANO_S,isSecureConnectionAllowed:!1},s=c("1.4.0"),o=new i.ApplicationChecker(t,s).excludeDeviceModel(e.DeviceModelId.NANO_S).check();(0,n.expect)(o).toBe(!1)}),(0,n.it)("should allow allowed device model",()=>{const t={sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:e.DeviceModelId.FLEX,isSecureConnectionAllowed:!1},s=c("1.4.0"),o=new i.ApplicationChecker(t,s).excludeDeviceModel(e.DeviceModelId.NANO_S).check();(0,n.expect)(o).toBe(!0)})});
|
|
2
|
+
//# sourceMappingURL=ApplicationChecker.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/services/ApplicationChecker.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport { ApplicationChecker } from \"./ApplicationChecker\";\n\nfunction createAppConfig(version: string): AppConfiguration {\n return {\n version,\n blindSigningEnabled: false,\n pubKeyDisplayMode: PublicKeyDisplayMode.SHORT,\n };\n}\n\ndescribe(\"ApplicationChecker (Solana)\", () => {\n it(\"should pass check when on Solana app and in valid state\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject if session state is Connected\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should reject if not Solana app\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.0.0\");\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should pass with min version inclusive\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionInclusive(\"1.3.0\")\n .check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject with min version inclusive if version too low\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.3.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.3.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionInclusive(\"1.4.0\")\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should pass with min version exclusive\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionExclusive(\"1.3.0\")\n .check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject with min version exclusive if equal\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionExclusive(\"1.4.0\")\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should reject excluded device model\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.NANO_S,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should allow allowed device model\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n\n // then\n expect(result).toBe(true);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_vitest", "import_PublicKeyDisplayMode", "import_ApplicationChecker", "createAppConfig", "version", "state", "config", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var b=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var h=(i,e)=>{for(var n in e)b(i,n,{get:e[n],enumerable:!0})},P=(i,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of A(e))!w.call(i,a)&&a!==n&&b(i,a,{get:()=>e[a],enumerable:!(r=y(e,a))||r.enumerable});return i};var C=i=>P(b({},"__esModule",{value:!0}),i);var k={};h(k,{COIN_DATA:()=>f,GenerateSolanaTransaction:()=>D});module.exports=C(k);var s=require("@solana/spl-token"),t=require("@solana/web3.js");const f={USDC:{mint:new t.PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),decimals:6}};class D{generateUsdcTransaction(e,n,r,a=1){return this.generateSplTokenTransaction(e,n,f.USDC.mint.toBase58(),r,f.USDC.decimals,a)}generateSplTokenTransaction(e,n,r,a,c,g=1){const o=new t.PublicKey(e),u=new t.PublicKey(n),l=new t.PublicKey(r),d=(0,s.getAssociatedTokenAddressSync)(l,o,!1,s.TOKEN_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),p=(0,s.getAssociatedTokenAddressSync)(l,u,!1,s.TOKEN_PROGRAM_ID,s.ASSOCIATED_TOKEN_PROGRAM_ID),S=BigInt(Math.round(a*10**c)),m=new t.Transaction({recentBlockhash:"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg",feePayer:o});for(let T=0;T<g;T++)m.add((0,s.createTransferCheckedInstruction)(d,l,p,o,S,c,[]));return m.signatures=[{publicKey:o,signature:null}],this.toBase64(m.serializeMessage())}generatePlainSolanaTransaction(e,n,r,a=1){const c=new t.PublicKey(e),g=new t.PublicKey(n),o=new t.Transaction({recentBlockhash:"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg",feePayer:c});for(let u=0;u<a;u++)o.add(t.SystemProgram.transfer({fromPubkey:c,toPubkey:g,lamports:r}));return o.signatures=[{publicKey:c,signature:null}],this.toBase64(o.serializeMessage())}toBase64(e){let n="";for(const r of e){if(typeof r!="number")throw new Error("Invalid byte value");n+=String.fromCharCode(r)}try{return btoa(n)}catch{return Buffer.from(e).toString("base64")}}}0&&(module.exports={COIN_DATA,GenerateSolanaTransaction});
|
|
2
|
+
//# sourceMappingURL=GenerateSolanaTransaction.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/services/GenerateSolanaTransaction.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createTransferCheckedInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { PublicKey, SystemProgram, Transaction } from \"@solana/web3.js\";\n\nexport const COIN_DATA = {\n USDC: {\n mint: new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"),\n decimals: 6,\n },\n};\n\nexport class GenerateSolanaTransaction {\n public generateUsdcTransaction(\n feePayerKey: string,\n recipientKey: string,\n usdcAmount: number,\n numberOfTransfers: number = 1,\n ): string {\n return this.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n COIN_DATA.USDC.mint.toBase58(),\n usdcAmount,\n COIN_DATA.USDC.decimals,\n numberOfTransfers,\n );\n }\n\n public generateSplTokenTransaction(\n feePayerKey: string,\n recipientKey: string,\n mintAddress: string,\n amountInTokens: number,\n decimals: number,\n numberOfTransfers: number = 1,\n ): string {\n const feePayer = new PublicKey(feePayerKey);\n const recipient = new PublicKey(recipientKey);\n const mint = new PublicKey(mintAddress);\n\n const sourceATA = getAssociatedTokenAddressSync(\n mint,\n feePayer,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const destATA = getAssociatedTokenAddressSync(\n mint,\n recipient,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const amount = BigInt(Math.round(amountInTokens * 10 ** decimals));\n\n const tx = new Transaction({\n // hardcoded as transaction won't be broadcasted but only used for testing\n recentBlockhash: \"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg\",\n feePayer,\n });\n for (let i = 0; i < numberOfTransfers; i++) {\n tx.add(\n createTransferCheckedInstruction(\n sourceATA,\n mint,\n destATA,\n feePayer,\n amount,\n decimals,\n [],\n ),\n );\n }\n\n tx.signatures = [{ publicKey: feePayer, signature: null }];\n\n return this.toBase64(tx.serializeMessage());\n }\n\n public generatePlainSolanaTransaction(\n feePayerKey: string,\n recipientKey: string,\n lamports: number,\n numberOfTransactions: number = 1,\n ): string {\n const feePayer = new PublicKey(feePayerKey);\n const recipient = new PublicKey(recipientKey);\n\n const tx = new Transaction({\n // hardcoded as transaction won't be broadcasted but only used for testing\n recentBlockhash: \"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg\",\n feePayer,\n });\n for (let i = 0; i < numberOfTransactions; i++) {\n tx.add(\n SystemProgram.transfer({\n fromPubkey: feePayer,\n toPubkey: recipient,\n lamports,\n }),\n );\n }\n tx.signatures = [{ publicKey: feePayer, signature: null }];\n return this.toBase64(tx.serializeMessage());\n }\n\n private toBase64(bytes: Uint8Array): string {\n let bin = \"\";\n for (const b of bytes) {\n if (typeof b !== \"number\") throw new Error(\"Invalid byte value\");\n bin += String.fromCharCode(b);\n }\n try {\n return btoa(bin);\n } catch {\n return Buffer.from(bytes).toString(\"base64\");\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,EAAA,8BAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAKO,6BACPC,EAAsD,2BAE/C,MAAMJ,EAAY,CACvB,KAAM,CACJ,KAAM,IAAI,YAAU,8CAA8C,EAClE,SAAU,CACZ,CACF,EAEO,MAAMC,CAA0B,CAC9B,wBACLI,EACAC,EACAC,EACAC,EAA4B,EACpB,CACR,OAAO,KAAK,4BACVH,EACAC,EACAN,EAAU,KAAK,KAAK,SAAS,EAC7BO,EACAP,EAAU,KAAK,SACfQ,CACF,CACF,CAEO,4BACLH,EACAC,EACAG,EACAC,EACAC,EACAH,EAA4B,EACpB,CACR,MAAMI,EAAW,IAAI,YAAUP,CAAW,EACpCQ,EAAY,IAAI,YAAUP,CAAY,EACtCQ,EAAO,IAAI,YAAUL,CAAW,EAEhCM,KAAY,iCAChBD,EACAF,EACA,GACA,mBACA,6BACF,EACMI,KAAU,iCACdF,EACAD,EACA,GACA,mBACA,6BACF,EAEMI,EAAS,OAAO,KAAK,MAAMP,EAAiB,IAAMC,CAAQ,CAAC,EAE3DO,EAAK,IAAI,cAAY,CAEzB,gBAAiB,8CACjB,SAAAN,CACF,CAAC,EACD,QAASO,EAAI,EAAGA,EAAIX,EAAmBW,IACrCD,EAAG,OACD,oCACEH,EACAD,EACAE,EACAJ,EACAK,EACAN,EACA,CAAC,CACH,CACF,EAGF,OAAAO,EAAG,WAAa,CAAC,CAAE,UAAWN,EAAU,UAAW,IAAK,CAAC,EAElD,KAAK,SAASM,EAAG,iBAAiB,CAAC,CAC5C,CAEO,+BACLb,EACAC,EACAc,EACAC,EAA+B,EACvB,CACR,MAAMT,EAAW,IAAI,YAAUP,CAAW,EACpCQ,EAAY,IAAI,YAAUP,CAAY,EAEtCY,EAAK,IAAI,cAAY,CAEzB,gBAAiB,8CACjB,SAAAN,CACF,CAAC,EACD,QAASO,EAAI,EAAGA,EAAIE,EAAsBF,IACxCD,EAAG,IACD,gBAAc,SAAS,CACrB,WAAYN,EACZ,SAAUC,EACV,SAAAO,CACF,CAAC,CACH,EAEF,OAAAF,EAAG,WAAa,CAAC,CAAE,UAAWN,EAAU,UAAW,IAAK,CAAC,EAClD,KAAK,SAASM,EAAG,iBAAiB,CAAC,CAC5C,CAEQ,SAASI,EAA2B,CAC1C,IAAIC,EAAM,GACV,UAAWC,KAAKF,EAAO,CACrB,GAAI,OAAOE,GAAM,SAAU,MAAM,IAAI,MAAM,oBAAoB,EAC/DD,GAAO,OAAO,aAAaC,CAAC,CAC9B,CACA,GAAI,CACF,OAAO,KAAKD,CAAG,CACjB,MAAQ,CACN,OAAO,OAAO,KAAKD,CAAK,EAAE,SAAS,QAAQ,CAC7C,CACF,CACF",
|
|
6
|
+
"names": ["GenerateSolanaTransaction_exports", "__export", "COIN_DATA", "GenerateSolanaTransaction", "__toCommonJS", "import_spl_token", "import_web3", "feePayerKey", "recipientKey", "usdcAmount", "numberOfTransfers", "mintAddress", "amountInTokens", "decimals", "feePayer", "recipient", "mint", "sourceATA", "destATA", "amount", "tx", "i", "lamports", "numberOfTransactions", "bytes", "bin", "b"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("@solana/spl-token"),a=require("@solana/web3.js"),e=require("vitest"),o=require("./GenerateSolanaTransaction");(0,e.describe)("GenerateSolanaTransaction",()=>{const p=a.Keypair.generate(),g=a.Keypair.generate(),u=p.publicKey.toBase58(),l=g.publicKey.toBase58();(0,e.it)("generateUsdcTransaction should equal generateSplTokenTransaction with USDC constants",()=>{const r=new o.GenerateSolanaTransaction,s=r.generateUsdcTransaction(u,l,2.5,3),i=r.generateSplTokenTransaction(u,l,o.COIN_DATA.USDC.mint.toBase58(),2.5,o.COIN_DATA.USDC.decimals,3);(0,e.expect)(s).toBe(i)}),(0,e.it)("generateSplTokenTransaction emits correct SPL-Token TransferChecked instructions",()=>{const r=new o.GenerateSolanaTransaction,s=o.COIN_DATA.USDC.mint,i=o.COIN_DATA.USDC.decimals,K=1.25,f=2,c=r.generateSplTokenTransaction(u,l,s.toBase58(),K,i,f),m=Uint8Array.from(Buffer.from(c,"base64")),n=a.Message.from(m);(0,e.expect)(n.instructions).toHaveLength(f);const T=(0,t.getAssociatedTokenAddressSync)(s,p.publicKey,!1,t.TOKEN_PROGRAM_ID,t.ASSOCIATED_TOKEN_PROGRAM_ID),d=(0,t.getAssociatedTokenAddressSync)(s,g.publicKey,!1,t.TOKEN_PROGRAM_ID,t.ASSOCIATED_TOKEN_PROGRAM_ID);for(const y of n.instructions){const S=n.accountKeys[y.programIdIndex];(0,e.expect)(S.equals(t.TOKEN_PROGRAM_ID)).toBe(!0),(0,e.expect)(n.accountKeys[y.accounts[0]].equals(T)).toBe(!0),(0,e.expect)(n.accountKeys[y.accounts[1]].equals(s)).toBe(!0),(0,e.expect)(n.accountKeys[y.accounts[2]].equals(d)).toBe(!0),(0,e.expect)(n.accountKeys[y.accounts[3]].equals(p.publicKey)).toBe(!0)}}),(0,e.it)("generatePlainSolanaTransaction emits correct SystemProgram.transfer instructions",()=>{const r=new o.GenerateSolanaTransaction,s=1e3,i=3,K=r.generatePlainSolanaTransaction(u,l,s,i),f=Uint8Array.from(Buffer.from(K,"base64")),c=a.Message.from(f);(0,e.expect)(c.instructions).toHaveLength(i);for(const m of c.instructions){const n=c.accountKeys[m.programIdIndex];(0,e.expect)(n.equals(a.SystemProgram.programId)).toBe(!0),(0,e.expect)(c.accountKeys[m.accounts[0]].toBase58()).toBe(u),(0,e.expect)(c.accountKeys[m.accounts[1]].toBase58()).toBe(l)}})});
|
|
2
|
+
//# sourceMappingURL=GenerateSolanaTransaction.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/services/GenerateSolanaTransaction.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n Message,\n type PublicKey,\n SystemProgram,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n COIN_DATA,\n GenerateSolanaTransaction,\n} from \"./GenerateSolanaTransaction\";\n\ndescribe(\"GenerateSolanaTransaction\", () => {\n const feePayer = Keypair.generate();\n const recipient = Keypair.generate();\n const feePayerKey = feePayer.publicKey.toBase58();\n const recipientKey = recipient.publicKey.toBase58();\n\n it(\"generateUsdcTransaction should equal generateSplTokenTransaction with USDC constants\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const txA = gen.generateUsdcTransaction(feePayerKey, recipientKey, 2.5, 3);\n\n // when\n const txB = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n COIN_DATA.USDC.mint.toBase58(),\n 2.5,\n COIN_DATA.USDC.decimals,\n 3,\n );\n\n // then\n expect(txA).toBe(txB);\n });\n\n it(\"generateSplTokenTransaction emits correct SPL-Token TransferChecked instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const mint = COIN_DATA.USDC.mint;\n const decimals = COIN_DATA.USDC.decimals;\n const amount = 1.25;\n const transfers = 2;\n\n // when\n const b64 = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n mint.toBase58(),\n amount,\n decimals,\n transfers,\n );\n\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(transfers);\n\n const sourceAta = getAssociatedTokenAddressSync(\n mint,\n feePayer.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const destAta = getAssociatedTokenAddressSync(\n mint,\n recipient.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n for (const instruction of msg.instructions) {\n // program must be the SPL-Token program\n const pid = msg.accountKeys[instruction.programIdIndex]!;\n expect(pid.equals(TOKEN_PROGRAM_ID)).toBe(true);\n\n // first account is source ATA, second is mint, third is dest ATA\n expect(\n (msg.accountKeys[instruction.accounts[0]!] as PublicKey).equals(\n sourceAta,\n ),\n ).toBe(true);\n expect(\n (msg.accountKeys[instruction.accounts[1]!] as PublicKey).equals(mint),\n ).toBe(true);\n expect(\n (msg.accountKeys[instruction.accounts[2]!] as PublicKey).equals(\n destAta,\n ),\n ).toBe(true);\n\n // feePayer must sign\n expect(\n (msg.accountKeys[instruction.accounts[3]!] as PublicKey).equals(\n feePayer.publicKey,\n ),\n ).toBe(true);\n }\n });\n\n it(\"generatePlainSolanaTransaction emits correct SystemProgram.transfer instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const lamports = 1_000;\n const ops = 3;\n\n // when\n const b64 = gen.generatePlainSolanaTransaction(\n feePayerKey,\n recipientKey,\n lamports,\n ops,\n );\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(ops);\n\n for (const instruction of msg.instructions) {\n // program must be SystemProgram\n const pid = msg.accountKeys[instruction.programIdIndex]!;\n expect(pid.equals(SystemProgram.programId)).toBe(true);\n\n // accounts: [fromPubkey, toPubkey]\n expect(\n (msg.accountKeys[instruction.accounts[0]!] as PublicKey).toBase58(),\n ).toBe(feePayerKey);\n expect(\n (msg.accountKeys[instruction.accounts[1]!] as PublicKey).toBase58(),\n ).toBe(recipientKey);\n }\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAIO,6BACPC,EAKO,2BACPC,EAAqC,kBAErCC,EAGO,0CAEP,YAAS,4BAA6B,IAAM,CAC1C,MAAMC,EAAW,UAAQ,SAAS,EAC5BC,EAAY,UAAQ,SAAS,EAC7BC,EAAcF,EAAS,UAAU,SAAS,EAC1CG,EAAeF,EAAU,UAAU,SAAS,KAElD,MAAG,uFAAwF,IAAM,CAE/F,MAAMG,EAAM,IAAI,4BACVC,EAAMD,EAAI,wBAAwBF,EAAaC,EAAc,IAAK,CAAC,EAGnEG,EAAMF,EAAI,4BACdF,EACAC,EACA,YAAU,KAAK,KAAK,SAAS,EAC7B,IACA,YAAU,KAAK,SACf,CACF,KAGA,UAAOE,CAAG,EAAE,KAAKC,CAAG,CACtB,CAAC,KAED,MAAG,mFAAoF,IAAM,CAE3F,MAAMF,EAAM,IAAI,4BACVG,EAAO,YAAU,KAAK,KACtBC,EAAW,YAAU,KAAK,SAC1BC,EAAS,KACTC,EAAY,EAGZC,EAAMP,EAAI,4BACdF,EACAC,EACAI,EAAK,SAAS,EACdE,EACAD,EACAE,CACF,EAEME,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAM,UAAQ,KAAKD,CAAU,KAGnC,UAAOC,EAAI,YAAY,EAAE,aAAaH,CAAS,EAE/C,MAAMI,KAAY,iCAChBP,EACAP,EAAS,UACT,GACA,mBACA,6BACF,EACMe,KAAU,iCACdR,EACAN,EAAU,UACV,GACA,mBACA,6BACF,EAEA,UAAWe,KAAeH,EAAI,aAAc,CAE1C,MAAMI,EAAMJ,EAAI,YAAYG,EAAY,cAAc,KACtD,UAAOC,EAAI,OAAO,kBAAgB,CAAC,EAAE,KAAK,EAAI,KAG9C,UACGJ,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDF,CACF,CACF,EAAE,KAAK,EAAI,KACX,UACGD,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OAAOT,CAAI,CACtE,EAAE,KAAK,EAAI,KACX,UACGM,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDD,CACF,CACF,EAAE,KAAK,EAAI,KAGX,UACGF,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDhB,EAAS,SACX,CACF,EAAE,KAAK,EAAI,CACb,CACF,CAAC,KAED,MAAG,mFAAoF,IAAM,CAE3F,MAAMI,EAAM,IAAI,4BACVc,EAAW,IACXC,EAAM,EAGNR,EAAMP,EAAI,+BACdF,EACAC,EACAe,EACAC,CACF,EACMP,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAM,UAAQ,KAAKD,CAAU,KAGnC,UAAOC,EAAI,YAAY,EAAE,aAAaM,CAAG,EAEzC,UAAWH,KAAeH,EAAI,aAAc,CAE1C,MAAMI,EAAMJ,EAAI,YAAYG,EAAY,cAAc,KACtD,UAAOC,EAAI,OAAO,gBAAc,SAAS,CAAC,EAAE,KAAK,EAAI,KAGrD,UACGJ,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,SAAS,CACpE,EAAE,KAAKd,CAAW,KAClB,UACGW,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,SAAS,CACpE,EAAE,KAAKb,CAAY,CACrB,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_spl_token", "import_web3", "import_vitest", "import_GenerateSolanaTransaction", "feePayer", "recipient", "feePayerKey", "recipientKey", "gen", "txA", "txB", "mint", "decimals", "amount", "transfers", "b64", "uint8Array", "msg", "sourceAta", "destAta", "instruction", "pid", "lamports", "ops"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var A=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var L=(o,s)=>{for(var r in s)A(o,r,{get:s[r],enumerable:!0})},h=(o,s,r,n)=>{if(s&&typeof s=="object"||typeof s=="function")for(let a of k(s))!S.call(o,a)&&a!==r&&A(o,a,{get:()=>s[a],enumerable:!(n=P(s,a))||n.enumerable});return o};var R=o=>h(A({},"__esModule",{value:!0}),o);var v={};L(v,{SolanaTransactionTypes:()=>g,TransactionInspector:()=>U});module.exports=R(v);var y=require("@solana/spl-token"),c=require("@solana/web3.js"),f=require("buffer"),I=require("../../app-binder/services/utils/transactionDecoders"),g=(r=>(r.STANDARD="Standard",r.SPL="SPL",r))(g||{});const D="https://api.mainnet-beta.solana.com/",M=o=>new c.Connection(o,{commitment:"confirmed"}),T=o=>!!o&&(o.equals(y.ASSOCIATED_TOKEN_PROGRAM_ID)||o.equals(y.TOKEN_PROGRAM_ID)||o.equals(y.TOKEN_2022_PROGRAM_ID));class U{constructor(s,r,n,a){this.rawTransactionBytes=s;this.tokenAddress=r;this.createATA=n;this.injectedRPCURL=a}async inspectTransactionType(){try{const s=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA)return{transactionType:s.compiledInstructions.some(i=>T(s.allKeys[i.programIdIndex]))?"SPL":"Standard",data:{...this.tokenAddress?{tokenAddress:this.tokenAddress}:{},...this.createATA?{createATA:this.createATA}:{}}};let r=!1,n={};for(const a of s.compiledInstructions){const i=s.allKeys[a.programIdIndex];if(!i)continue;T(i)&&(r=!0);const p=a.accountKeyIndexes.map(e=>s.allKeys[e]).filter(e=>!!e),l=new c.TransactionInstruction({programId:i,keys:p.map(e=>({pubkey:e,isSigner:!1,isWritable:!1})),data:f.Buffer.from(a.data)}),u={programId:i,ixMeta:a,message:s,instruction:l};for(const e of I.DECODERS){if(!e.when(u))continue;const t=e.decode(u);t&&(t.createATA&&!n.createATA?n={...n,createATA:t.createATA}:t.tokenAddress&&!n.tokenAddress&&!n.createATA&&(n={...n,tokenAddress:t.tokenAddress}))}}return n.createATA?{transactionType:"SPL",data:n}:n.tokenAddress?{transactionType:"SPL",data:n}:r?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(s){const r=this.tryDeserialiseVersioned(s);if(r){const e=r.message,t=await this.resolveLookedUpAddressesFromMessage(e),K=[...e.staticAccountKeys,...t?.writable??[],...t?.readonly??[]];return{compiledInstructions:e.compiledInstructions.map(d=>{const b=d,x=Array.from(b.accounts??d.accountKeyIndexes??[]);let m;return d.data instanceof Uint8Array?m=d.data:typeof d.data=="string"?m=f.Buffer.from(d.data,"base64"):m=Uint8Array.from(d.data??[]),{programIdIndex:d.programIdIndex,accountKeyIndexes:x,data:m}}),allKeys:K}}const n=c.Transaction.from(s),a=new Map,i=e=>{if(!e)return;const t=e.toBase58();a.has(t)||a.set(t,e)};i(n.feePayer??null);for(const e of n.instructions){i(e.programId);for(const t of e.keys)i(t.pubkey)}const p=Array.from(a.values()),l=new Map(p.map((e,t)=>[e.toBase58(),t]));return{compiledInstructions:n.instructions.map(e=>({programIdIndex:l.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(t=>l.get(t.pubkey.toBase58())??-1),data:e.data})),allKeys:p}}tryDeserialiseVersioned(s){try{return c.VersionedTransaction.deserialize(s)}catch{try{return{message:c.VersionedMessage.deserialize(s)}}catch{return null}}}async resolveLookedUpAddressesFromMessage(s){const r=s.addressTableLookups??[];if(!r.length)return;const n=[],a=[];for(const i of r){const l=(await M(this.injectedRPCURL||D).getAddressLookupTable(i.accountKey)).value;if(!l)continue;const u=l.state.addresses;for(const e of i.writableIndexes??[]){const t=u[e];t&&n.push(t)}for(const e of i.readonlyIndexes??[]){const t=u[e];t&&a.push(t)}}return{writable:n,readonly:a}}}0&&(module.exports={SolanaTransactionTypes,TransactionInspector});
|
|
2
|
+
//# sourceMappingURL=TransactionInspector.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\nexport type TxInspectorResult = {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: { address: string; mintAddress: string };\n };\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst RPC_URL = \"https://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = (rpcUrl: string) =>\n new Connection(rpcUrl, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | undefined,\n private readonly createATA?:\n | {\n address: string;\n mintAddress: string;\n }\n | undefined,\n private readonly injectedRPCURL?: string | undefined,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // fast path when transaction resolution is provided\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((instruction) =>\n isSPLProgramId(message.allKeys[instruction.programIdIndex]),\n );\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data: {\n ...(this.tokenAddress ? { tokenAddress: this.tokenAddress } : {}),\n ...(this.createATA ? { createATA: this.createATA } : {}),\n },\n };\n }\n\n // accumulate best data across all instructions\n let sawSPL = false;\n let best: TxInspectorResult[\"data\"] = {};\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue; // unresolved index, skip\n if (isSPLProgramId(programId)) sawSPL = true;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((pk) => ({\n pubkey: pk,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (!data) continue;\n\n // prefer createATA (needed when destination ATA doesn\u2019t exist yet)\n if (data.createATA && !best.createATA) {\n best = { ...best, createATA: data.createATA };\n } else if (\n data.tokenAddress &&\n !best.tokenAddress &&\n !best.createATA\n ) {\n best = { ...best, tokenAddress: data.tokenAddress };\n }\n }\n }\n\n if (best.createATA)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (best.tokenAddress)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (sawSPL)\n return { transactionType: SolanaTransactionTypes.SPL, data: {} }; // we should never reach here, in case we do tx will fall back to blind sign\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * For v0, auto-fetch looked-up addresses from ALT(s) via the connection.\n */\n private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await this.resolveLookedUpAddressesFromMessage(msg);\n\n const allKeys: PublicKey[] = [\n ...msg.staticAccountKeys,\n ...(lookedUp?.writable ?? []),\n ...(lookedUp?.readonly ?? []),\n ];\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((instruction) => {\n const ixWithAccounts = instruction as typeof instruction & {\n accounts?: number[];\n };\n\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? instruction.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (instruction.data instanceof Uint8Array) {\n data = instruction.data;\n } else if (typeof instruction.data === \"string\") {\n data = Buffer.from(instruction.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(instruction.data ?? []);\n }\n\n return {\n programIdIndex: instruction.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n\n for (const instruction of legacy.instructions) {\n add(instruction.programId);\n for (const key of instruction.keys) add(key.pubkey);\n }\n\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((instruction) => ({\n programIdIndex: indexByB58.get(instruction.programId.toBase58()) ?? -1,\n accountKeyIndexes: instruction.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: instruction.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n\n /**\n * For v0, fetch looked-up addresses from ALT(s) via the connection\n */\n private async resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n ): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n for (const lu of lookups) {\n const res = await defaultConnection(\n this.injectedRPCURL || RPC_URL,\n ).getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) continue;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }\n\n return { writable, readonly };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TransactionInspector_exports", "__export", "SolanaTransactionTypes", "TransactionInspector", "__toCommonJS", "import_spl_token", "import_web3", "import_buffer", "import_transactionDecoders", "RPC_URL", "defaultConnection", "rpcUrl", "isSPLProgramId", "pid", "rawTransactionBytes", "tokenAddress", "createATA", "injectedRPCURL", "message", "instruction", "sawSPL", "best", "ixMeta", "programId", "resolvedKeys", "i", "k", "pk", "ctx", "decoder", "data", "rawBytes", "versionedTX", "msg", "lookedUp", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "key", "indexByB58", "lookups", "writable", "readonly", "lu", "table", "addrs"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=require("@solana/spl-token"),e=require("@solana/web3.js"),n=require("vitest"),T=require("../../app-binder/services/bs58Encoder"),i=require("./TransactionInspector");const A=T.DefaultBs58Encoder.encode(new Uint8Array(32).fill(170));function p(t,s,c){const r=c??s[0]??e.Keypair.generate(),o=new e.Transaction;o.recentBlockhash=A,o.feePayer=r.publicKey,o.add(...t);const u=new Set,d=[r,...s].filter(y=>{const l=y.publicKey.toBase58();return u.has(l)?!1:(u.add(l),!0)});return o.sign(...d),{raw:o.serialize(),payer:r}}(0,n.describe)("TransactionInspector",()=>{(0,n.it)("falls back to STANDARD for a plain SystemProgram transfer",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:s,lamports:1e3}),{raw:r}=p([c],[t],t),o=await new i.TransactionInspector(r).inspectTransactionType();(0,n.expect)(o.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,n.expect)(o.data).toEqual({})}),(0,n.it)("detects an SPL Transfer and returns the destination address",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,42n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector(o).inspectTransactionType();(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.tokenAddress).toBe(c.toBase58())}),(0,n.it)("detects an SPL TransferChecked and returns the destination address",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createTransferCheckedInstruction)(c,s,r,t.publicKey,123n,0,[],a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.tokenAddress).toBe(r.toBase58())}),(0,n.it)("detects InitializeAccount and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createInitializeAccountInstruction)(c,s,r,a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects InitializeAccount2 and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=e.Keypair.generate().publicKey,o=(0,a.createInitializeAccount2Instruction)(c,s,r,a.TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects InitializeAccount3 and returns the new account and mint",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createInitializeAccount3Instruction)(c,s,a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector(o).inspectTransactionType();(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.createATA).toEqual({address:c.toBase58(),mintAddress:s.toBase58()})}),(0,n.it)("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:s.toBase58(),mintAddress:c.toBase58()})}),(0,n.it)("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_2022_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_2022_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d=await new i.TransactionInspector(u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.createATA).toEqual({address:s.toBase58(),mintAddress:c.toBase58()})}),(0,n.it)("detects CloseAccount and returns the closed token account",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createCloseAccountInstruction)(s,c,t.publicKey),{raw:o}=p([r],[t],t),u=await new i.TransactionInspector(o).inspectTransactionType();(0,n.expect)(u.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(u.data.tokenAddress).toBe(s.toBase58())}),(0,n.it)("detects SyncNative and returns the WSOL account",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=(0,a.createSyncNativeInstruction)(s,a.TOKEN_PROGRAM_ID),{raw:r}=p([c],[t],t),o=await new i.TransactionInspector(r).inspectTransactionType();(0,n.expect)(o.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(o.data.tokenAddress).toBe(s.toBase58())}),(0,n.it)("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const t=e.Keypair.generate(),s=new e.TransactionInstruction({programId:a.TOKEN_PROGRAM_ID,keys:[],data:Buffer.from([])}),{raw:c}=p([s],[t],t),r=await new i.TransactionInspector(c).inspectTransactionType();(0,n.expect)(r.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(r.data).toEqual({})}),(0,n.it)("falls back to STANDARD if the payload is unparseable",async()=>{const t=new Uint8Array([171,173,190,239]),s=await new i.TransactionInspector(t).inspectTransactionType();(0,n.expect)(s.transactionType).toBe(i.SolanaTransactionTypes.STANDARD),(0,n.expect)(s.data).toEqual({})}),(0,n.it)("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,1n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=e.Keypair.generate().publicKey.toBase58(),d=await new i.TransactionInspector(o,u).inspectTransactionType();(0,n.expect)(d.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(d.data.tokenAddress).toBe(u)}),(0,n.it)("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.getAssociatedTokenAddressSync)(c,s,!0,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,a.createAssociatedTokenAccountInstruction)(t.publicKey,r,s,c,a.TOKEN_PROGRAM_ID,a.ASSOCIATED_TOKEN_PROGRAM_ID),{raw:u}=p([o],[t],t),d={address:e.Keypair.generate().publicKey.toBase58(),mintAddress:e.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector(u,void 0,d).inspectTransactionType();(0,n.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(y.data.createATA).toEqual(d)}),(0,n.it)("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const t=e.Keypair.generate(),s=e.Keypair.generate().publicKey,c=e.Keypair.generate().publicKey,r=(0,a.createTransferInstruction)(s,c,t.publicKey,7n,[],a.TOKEN_PROGRAM_ID),{raw:o}=p([r],[t],t),u=e.Keypair.generate().publicKey.toBase58(),d={address:e.Keypair.generate().publicKey.toBase58(),mintAddress:e.Keypair.generate().publicKey.toBase58()},y=await new i.TransactionInspector(o,u,d).inspectTransactionType();(0,n.expect)(y.transactionType).toBe(i.SolanaTransactionTypes.SPL),(0,n.expect)(y.data.tokenAddress).toBe(u),(0,n.expect)(y.data.createATA).toEqual(d)})});
|
|
2
|
+
//# sourceMappingURL=TransactionInspector.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n createInitializeAccount2Instruction,\n createInitializeAccount3Instruction,\n createInitializeAccountInstruction,\n createSyncNativeInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { DefaultBs58Encoder } from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = DefaultBs58Encoder.encode(\n new Uint8Array(32).fill(0xaa),\n);\n\nfunction makeSignedRawTx(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniqueSigners = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniqueSigners);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", async () => {\n // given\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner.publicKey,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects InitializeAccount and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount2 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount2Instruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount3 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount3Instruction(\n newAccount,\n mint,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (classic TOKEN program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (TOKEN-2022 program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata22 = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata22,\n owner,\n mint,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects CloseAccount and returns the closed token account\", async () => {\n // given\n const owner = Keypair.generate();\n const account = Keypair.generate().publicKey;\n const dest = Keypair.generate().publicKey;\n\n const instruction = createCloseAccountInstruction(\n account,\n dest,\n owner.publicKey,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"detects SyncNative and returns the WSOL account\", async () => {\n // given\n const payer = Keypair.generate();\n const account = Keypair.generate().publicKey;\n\n const instruction = createSyncNativeInstruction(account, TOKEN_PROGRAM_ID);\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)\", async () => {\n // given\n const payer = Keypair.generate();\n const bogusIx = new TransactionInstruction({\n programId: TOKEN_PROGRAM_ID,\n keys: [],\n data: Buffer.from([]),\n });\n\n const { raw } = makeSignedRawTx([bogusIx], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data).toEqual({});\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", async () => {\n // given\n const garbage = new Uint8Array([0xab, 0xad, 0xbe, 0xef]);\n\n // when\n const result = await new TransactionInspector(\n garbage,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"fast path: tokenAddress override + SPL instruction, SPL and returns override\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 1n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const overrideToken = Keypair.generate().publicKey.toBase58();\n\n // when\n const result = await new TransactionInspector(\n raw,\n overrideToken,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(overrideToken);\n });\n\n it(\"fast path: createATA override + ATA instruction, SPL and returns override\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const overrideATA = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n undefined,\n overrideATA,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual(overrideATA);\n });\n\n it(\"fast path: both overrides + SPL instruction, SPL and returns both\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 7n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const tokenOverride = Keypair.generate().publicKey.toBase58();\n const ataOverride = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n tokenOverride,\n ataOverride,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(tokenOverride);\n expect(result.data.createATA).toEqual(ataOverride);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_spl_token", "import_web3", "import_vitest", "import_bs58Encoder", "import_TransactionInspector", "DUMMY_BLOCKHASH", "makeSignedRawTx", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniqueSigners", "kp", "k", "dest", "instruction", "raw", "result", "owner", "source", "destination", "mint", "newAccount", "ata", "ata22", "account", "bogusIx", "garbage", "overrideToken", "overrideATA", "tokenOverride", "ataOverride"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.create;var d=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var U=(e,r)=>{for(var t in r)d(e,t,{get:r[t],enumerable:!0})},i=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of g(r))!A.call(e,n)&&n!==t&&d(e,n,{get:()=>r[n],enumerable:!(o=s(r,n))||o.enumerable});return e};var f=(e,r,t)=>(t=e!=null?a(y(e)):{},i(r||!e||!e.__esModule?d(t,"default",{value:e,enumerable:!0}):t,e)),p=e=>i(d({},"__esModule",{value:!0}),e);var l={};U(l,{DefaultBs58Encoder:()=>u});module.exports=p(l);var c=f(require("bs58"));class u{static encode(r){return c.default.encode(r)}static decode(r){return c.default.decode(r)}}0&&(module.exports={DefaultBs58Encoder});
|
|
2
|
+
//# sourceMappingURL=bs58Encoder.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/services/bs58Encoder.ts"],
|
|
4
|
+
"sourcesContent": ["import bs58 from \"bs58\";\n\nexport interface Bs58Encoder {\n encode(data: Uint8Array): string;\n decode(encoded: string): Uint8Array;\n}\n\nexport class DefaultBs58Encoder {\n static encode(data: Uint8Array): string {\n return bs58.encode(data);\n }\n static decode(encoded: string): Uint8Array {\n return bs58.decode(encoded);\n }\n}\n"],
|
|
5
|
+
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAiB,mBAOV,MAAMF,CAAmB,CAC9B,OAAO,OAAOG,EAA0B,CACtC,OAAO,EAAAC,QAAK,OAAOD,CAAI,CACzB,CACA,OAAO,OAAOE,EAA6B,CACzC,OAAO,EAAAD,QAAK,OAAOC,CAAO,CAC5B,CACF",
|
|
6
|
+
"names": ["bs58Encoder_exports", "__export", "DefaultBs58Encoder", "__toCommonJS", "import_bs58", "data", "bs58", "encoded"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var k=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var h=(e,n)=>{for(var s in n)k(e,s,{get:n[s],enumerable:!0})},f=(e,n,s,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let u of B(n))!T.call(e,u)&&u!==s&&k(e,u,{get:()=>n[u],enumerable:!(r=p(n,u))||r.enumerable});return e};var w=e=>f(k({},"__esModule",{value:!0}),e);var q={};h(q,{DECODERS:()=>x});module.exports=w(q);var t=require("@solana/spl-token"),i=require("@solana/web3.js");const d=e=>e.equals(t.TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_2022_PROGRAM_ID),c=e=>{try{return e()}catch{return null}},x=[{when:({programId:e})=>e.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID),decode:({ixMeta:e,message:n})=>{const s=e.accountKeyIndexes??[],r=o=>s[o]!==void 0?n.allKeys[s[o]]??null:null,u=r(1),a=r(3);if(!u||!a)return null;const l=s.map(o=>n.allKeys[o]).filter(o=>!!o),A=l.find(o=>o.equals(t.TOKEN_2022_PROGRAM_ID))??l.find(o=>o.equals(t.TOKEN_PROGRAM_ID))??null,b=o=>o.equals(i.SystemProgram.programId)||o.equals(t.TOKEN_PROGRAM_ID)||o.equals(t.TOKEN_2022_PROGRAM_ID)||o.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID)||o.equals(i.SYSVAR_RENT_PUBKEY),I=l.filter(o=>!b(o)&&!o.equals(u)&&!o.equals(a)),y=(o,m)=>(0,t.getAssociatedTokenAddressSync)(a,o,!0,m,t.ASSOCIATED_TOKEN_PROGRAM_ID);if(A){for(const o of I)if(y(o,A).equals(u))return{createATA:{address:o.toBase58(),mintAddress:a.toBase58()}}}for(const o of I){if(y(o,t.TOKEN_PROGRAM_ID).equals(u))return{createATA:{address:o.toBase58(),mintAddress:a.toBase58()}};if(y(o,t.TOKEN_2022_PROGRAM_ID).equals(u))return{createATA:{address:o.toBase58(),mintAddress:a.toBase58()}}}return null}},{when:({programId:e})=>e.equals(t.TOKEN_2022_PROGRAM_ID),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{destination:s}}=(0,t.decodeTransferCheckedWithFeeInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{destination:s}}=(0,t.decodeTransferInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{destination:s}}=(0,t.decodeTransferCheckedInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s,mint:r}}=(0,t.decodeInitializeAccountInstruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:r.pubkey.toBase58()}}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s,mint:r}}=(0,t.decodeInitializeAccount2Instruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:r.pubkey.toBase58()}}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s,mint:r}}=(0,t.decodeInitializeAccount3Instruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:r.pubkey.toBase58()}}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s}}=(0,t.decodeInitializeImmutableOwnerInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s}}=(0,t.decodeCloseAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s}}=(0,t.decodeSyncNativeInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s}}=(0,t.decodeBurnCheckedInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s}}=(0,t.decodeBurnInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s}}=(0,t.decodeFreezeAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>d(e),decode:({instruction:e,programId:n})=>c(()=>{const{keys:{account:s}}=(0,t.decodeThawAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>e.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_2022_PROGRAM_ID),decode:()=>null}];0&&(module.exports={DECODERS});
|
|
2
|
+
//# sourceMappingURL=transactionDecoders.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/internal/app-binder/services/utils/transactionDecoders.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeBurnCheckedInstruction,\n decodeBurnInstruction,\n decodeCloseAccountInstruction,\n decodeFreezeAccountInstruction,\n decodeInitializeAccount2Instruction,\n decodeInitializeAccount3Instruction,\n decodeInitializeAccountInstruction,\n decodeInitializeImmutableOwnerInstruction,\n decodeSyncNativeInstruction,\n decodeThawAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferCheckedWithFeeInstruction,\n decodeTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n type PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n type TransactionInstruction,\n} from \"@solana/web3.js\";\n\nimport {\n type NormalizedCompiledIx,\n type NormalizedMessage,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\n\nexport type IxContext = {\n programId: PublicKey;\n ixMeta: NormalizedCompiledIx;\n message: NormalizedMessage;\n instruction: TransactionInstruction;\n};\n\nexport type Decoder = {\n when: (ctx: IxContext) => boolean;\n decode: (ctx: IxContext) => TxInspectorResult[\"data\"] | null;\n};\n\nconst isTokenProgramId = (pid: PublicKey) =>\n pid.equals(TOKEN_PROGRAM_ID) || pid.equals(TOKEN_2022_PROGRAM_ID);\n\nconst safe = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nexport const DECODERS: Decoder[] = [\n // ATA creation (with derivation fallback)\n {\n when: ({ programId }) => programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID),\n decode: ({ ixMeta, message }) => {\n const indexes = ixMeta.accountKeyIndexes ?? [];\n const byIndexes = (n: number) =>\n indexes[n] !== undefined ? (message.allKeys[indexes[n]] ?? null) : null;\n\n // canonical ATA instruction layout: [payer, ata, owner, mint, system, tokenProgram, rent?]\n const ataPk = byIndexes(1);\n const mintPk = byIndexes(3);\n if (!ataPk || !mintPk) return null;\n\n const accs = indexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n // prefer token-2022 if present among instruction accounts, else token classic\n const tokenProgInIx =\n accs.find((pk) => pk.equals(TOKEN_2022_PROGRAM_ID)) ??\n accs.find((pk) => pk.equals(TOKEN_PROGRAM_ID)) ??\n null;\n\n const isProgramOrSysvar = (pk: PublicKey) =>\n pk.equals(SystemProgram.programId) ||\n pk.equals(TOKEN_PROGRAM_ID) ||\n pk.equals(TOKEN_2022_PROGRAM_ID) ||\n pk.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pk.equals(SYSVAR_RENT_PUBKEY);\n\n // candidate owners: exclude programs/sysvars, the ATA itself, and the mint\n const ownerCandidates = accs.filter(\n (pk) =>\n !isProgramOrSysvar(pk) && !pk.equals(ataPk) && !pk.equals(mintPk),\n );\n\n const derive = (owner: PublicKey, tokenProg: PublicKey) =>\n getAssociatedTokenAddressSync(\n mintPk,\n owner,\n true, // allowOwnerOffCurve\n tokenProg,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // try with the token program actually referenced in the instruction (if any)\n if (tokenProgInIx) {\n for (const owner of ownerCandidates) {\n if (derive(owner, tokenProgInIx).equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n }\n }\n\n // fallback: try both classic and 2022 (covers odd wrappers/missing program acct)\n for (const owner of ownerCandidates) {\n const dClassic = derive(owner, TOKEN_PROGRAM_ID);\n if (dClassic.equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n const d22 = derive(owner, TOKEN_2022_PROGRAM_ID);\n if (d22.equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n }\n return null;\n },\n },\n\n // Token-2022 fee\u2019d transfer\n {\n when: ({ programId }) => programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedWithFeeInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Transfers\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction, programId);\n return { tokenAddress: destination.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Account init\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount2Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount3Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeInitializeImmutableOwnerInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Lifecycle / WSOL\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeCloseAccountInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeSyncNativeInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Mint / Burn\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnCheckedInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // Freeze / Thaw\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeFreezeAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeThawAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // LAST-RESORT: tag as SPL by program id only (when decoders can't run)\n {\n when: ({ programId }) =>\n programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: () => null,\n },\n];\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["transactionDecoders_exports", "__export", "DECODERS", "__toCommonJS", "import_spl_token", "import_web3", "isTokenProgramId", "pid", "safe", "fn", "programId", "ixMeta", "message", "indexes", "byIndexes", "n", "ataPk", "mintPk", "accs", "i", "k", "tokenProgInIx", "pk", "isProgramOrSysvar", "ownerCandidates", "derive", "owner", "tokenProg", "instruction", "destination", "account", "mint"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var C=(n,t)=>{for(var o in t)i(n,o,{get:t[o],enumerable:!0})},g=(n,t,o,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of u(t))!p.call(n,e)&&e!==o&&i(n,e,{get:()=>t[e],enumerable:!(a=d(t,e))||a.enumerable});return n};var m=n=>g(i({},"__esModule",{value:!0}),n);var A={};C(A,{BuildTransactionContextTask:()=>f});module.exports=m(A);var c=require("@ledgerhq/device-management-kit"),l=require("../../app-binder/command/GetChallengeCommand");class f{constructor(t,o){this.api=t;this.args=o}async run(){const{contextModule:t,options:o}=this.args,a=this.api.getDeviceSessionState();let e;const s=await this.api.sendCommand(new l.GetChallengeCommand);return(0,c.isSuccessCommandResult)(s)&&(e=s.data.challenge),(await t.getSolanaContext({deviceModelId:a.deviceModelId,tokenAddress:o.tokenAddress,challenge:e,createATA:o.createATA})).caseOf({Left:r=>{throw r},Right:r=>({challenge:e,descriptor:r.descriptor,addressResult:{tokenAccount:r.tokenAccount,owner:r.owner,contract:r.contract},calCertificate:r.certificate})})}}0&&(module.exports={BuildTransactionContextTask});
|
|
2
|
+
//# sourceMappingURL=BuildTransactionContextTask.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n challenge: string | undefined;\n addressResult: {\n tokenAccount: string;\n owner: string;\n contract: string;\n };\n calCertificate: PkiCertificate;\n descriptor: Uint8Array;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // get Solana context\n const contextResult = await contextModule.getSolanaContext({\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n challenge,\n descriptor: ctx.descriptor,\n addressResult: {\n tokenAccount: ctx.tokenAccount,\n owner: ctx.owner,\n contract: ctx.contract,\n },\n calCertificate: ctx.certificate,\n };\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAGO,2CAGPC,EAAoC,4DAkB7B,MAAMH,CAA4B,CACvC,YACmBI,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAyC,CAC7C,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAI,qBAAqB,EACzE,SAAI,0BAAuBA,CAAY,IACrCD,EAAYC,EAAa,KAAK,YAIV,MAAMJ,EAAc,iBAAiB,CACzD,cAAeE,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,SACrB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,UAAAH,EACA,WAAYG,EAAI,WAChB,cAAe,CACb,aAAcA,EAAI,aAClB,MAAOA,EAAI,MACX,SAAUA,EAAI,QAChB,EACA,eAAgBA,EAAI,WACtB,EAEJ,CAAC,CACH,CACF",
|
|
6
|
+
"names": ["BuildTransactionContextTask_exports", "__export", "BuildTransactionContextTask", "__toCommonJS", "import_device_management_kit", "import_GetChallengeCommand", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "err", "ctx"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=require("@ledgerhq/device-management-kit"),c=require("purify-ts"),e=require("vitest"),i=require("../../app-binder/command/GetChallengeCommand"),l=require("./BuildTransactionContextTask");const a={getSolanaContext:e.vi.fn()},d={contextModule:a,options:{tokenAddress:"someAddress",createATA:void 0}},t={descriptor:new Uint8Array([1,2,3]),tokenAccount:"someTokenAccount",owner:"someOwner",contract:"someContract",certificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1}};let o;(0,e.describe)("BuildTransactionContextTask",()=>{(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),o={getDeviceSessionState:e.vi.fn().mockReturnValue({deviceModelId:n.DeviceModelId.NANO_X}),sendCommand:e.vi.fn().mockResolvedValue({status:n.CommandResultStatus.Success,data:{challenge:"someChallenge"}})}}),(0,e.it)("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(o.sendCommand).toHaveBeenCalledWith(e.expect.any(i.GetChallengeCommand)),(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),(0,e.expect)(s).toEqual({challenge:"someChallenge",descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("returns context when challenge command fails",async()=>{o.sendCommand.mockResolvedValue({status:n.CommandResultStatus.Error,data:{}}),a.getSolanaContext.mockResolvedValue((0,c.Right)(t));const s=await new l.BuildTransactionContextTask(o,d).run();(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:n.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:void 0,createATA:void 0}),(0,e.expect)(s).toEqual({challenge:void 0,descriptor:t.descriptor,calCertificate:t.certificate,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract}})}),(0,e.it)("throws if getSolanaContext returns Left",async()=>{const r=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue((0,c.Left)(r));const s=new l.BuildTransactionContextTask(o,d);await(0,e.expect)(s.run()).rejects.toThrow("Solana context failure")})});
|
|
2
|
+
//# sourceMappingURL=BuildTransactionContextTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst domainSolanaPayload = {\n descriptor: new Uint8Array([1, 2, 3]),\n tokenAccount: \"someTokenAccount\",\n owner: \"someOwner\",\n contract: \"someContract\",\n certificate: { payload: new Uint8Array([0xaa, 0xbb]), keyUsageNumber: 1 },\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: \"someChallenge\",\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"returns context when challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: undefined,\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: undefined,\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
|
|
5
|
+
"mappings": "aAIA,IAAAA,EAIO,2CACPC,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAAoC,4DAEpCC,EAGO,yCAEP,MAAMC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,CAC1B,EAEMC,EAAc,CAClB,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAAsB,CAC1B,WAAY,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACpC,aAAc,mBACd,MAAO,YACP,SAAU,eACV,YAAa,CAAE,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAAG,eAAgB,CAAE,CAC1E,EAEA,IAAIC,KAEJ,YAAS,8BAA+B,IAAM,IAC5C,cAAW,IAAM,CACf,KAAG,cAAc,EAEjBA,EAAU,CACR,sBAAuB,KACpB,GAAG,EACH,gBAAgB,CAAE,cAAe,gBAAc,MAAO,CAAC,EAC1D,YAAa,KAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQ,sBAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,KAED,MAAG,+DAAgE,SAAY,CAC5EH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOE,EAAQ,WAAW,EAAE,qBAC1B,SAAO,IAAI,qBAAmB,CAChC,KAEA,UAAOH,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,gBACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,+CAAgD,SAAY,CAC5DC,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQ,sBAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAE9B,UAAOD,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,OACX,UAAW,MACb,CAAC,KAED,UAAOI,CAAM,EAAE,QAAkC,CAC/C,UAAW,OACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,KAED,MAAG,0CAA2C,SAAY,CACxD,MAAMG,EAAQ,IAAI,MAAM,wBAAwB,EAC/CL,EAAkB,iBAAyB,qBAAkB,QAAKK,CAAK,CAAC,EAEzE,MAAMC,EAAO,IAAI,8BAA4BH,EAASF,CAAW,EAEjE,QAAM,UAAOK,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_GetChallengeCommand", "import_BuildTransactionContextTask", "contextModuleMock", "defaultArgs", "domainSolanaPayload", "apiMock", "result", "error", "task"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var i=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var C=(o,t)=>{for(var e in t)i(o,e,{get:t[e],enumerable:!0})},f=(o,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of l(t))!y.call(o,r)&&r!==e&&i(o,r,{get:()=>t[r],enumerable:!(a=d(t,r))||a.enumerable});return o};var u=o=>f(i({},"__esModule",{value:!0}),o);var P={};C(P,{ProvideSolanaTransactionContextTask:()=>v});module.exports=u(P);var n=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),m=require("../../app-binder/command/ProvideTLVDescriptorCommand"),c=require("../../app-binder/command/ProvideTrustedNamePKICommand");class v{constructor(t,e){this.api=t;this.context=e}async run(){const{descriptor:t,certificate:e}=this.context,{payload:a}=e,r=await this.api.sendCommand(new c.ProvideTrustedNamePKICommand({pkiBlob:a}));if(!(0,n.isSuccessCommandResult)(r))throw r;const p=await this.api.sendCommand(new m.ProvideTLVDescriptorCommand({payload:t}));if(!(0,n.isSuccessCommandResult)(p))throw p;return s.Nothing}}0&&(module.exports={ProvideSolanaTransactionContextTask});
|
|
2
|
+
//# sourceMappingURL=ProvideTransactionContextTask.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.ts"],
|
|
4
|
+
"sourcesContent": ["import { type PkiCertificate } from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Maybe, Nothing } from \"purify-ts\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nexport type SolanaContextForDevice = {\n descriptor: Uint8Array;\n certificate: PkiCertificate;\n};\n\nexport class ProvideSolanaTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly context: SolanaContextForDevice,\n ) {}\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n const { descriptor, certificate } = this.context;\n const { payload: certificatePayload } = certificate;\n\n // send CAL certificate + signature\n const pkiResult = await this.api.sendCommand(\n new ProvideTrustedNamePKICommand({\n pkiBlob: certificatePayload,\n }),\n );\n if (!isSuccessCommandResult(pkiResult)) {\n throw pkiResult;\n }\n\n // send signed TLV descriptor\n const tlvResult = await this.api.sendCommand(\n new ProvideTLVDescriptorCommand({ payload: descriptor }),\n );\n if (!isSuccessCommandResult(tlvResult)) {\n throw tlvResult;\n }\n\n return Nothing;\n }\n}\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,yCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAIO,2CACPC,EAAoC,qBAEpCC,EAA4C,oEAC5CC,EAA6C,qEAQtC,MAAML,CAAoC,CAC/C,YACmBM,EACAC,EACjB,CAFiB,SAAAD,EACA,aAAAC,CAChB,CAEH,MAAM,KAA+D,CACnE,KAAM,CAAE,WAAAC,EAAY,YAAAC,CAAY,EAAI,KAAK,QACnC,CAAE,QAASC,CAAmB,EAAID,EAGlCE,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAI,+BAA6B,CAC/B,QAASD,CACX,CAAC,CACH,EACA,GAAI,IAAC,0BAAuBC,CAAS,EACnC,MAAMA,EAIR,MAAMC,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAI,8BAA4B,CAAE,QAASJ,CAAW,CAAC,CACzD,EACA,GAAI,IAAC,0BAAuBI,CAAS,EACnC,MAAMA,EAGR,OAAO,SACT,CACF",
|
|
6
|
+
"names": ["ProvideTransactionContextTask_exports", "__export", "ProvideSolanaTransactionContextTask", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_ProvideTLVDescriptorCommand", "import_ProvideTrustedNamePKICommand", "api", "context", "descriptor", "certificate", "certificatePayload", "pkiResult", "tlvResult"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("@ledgerhq/device-management-kit"),r=require("purify-ts"),e=require("vitest"),k=require("../../app-binder/command/ProvideTLVDescriptorCommand"),p=require("../../app-binder/command/ProvideTrustedNamePKICommand"),m=require("./ProvideTransactionContextTask");(0,e.describe)("ProvideSolanaTransactionContextTask",()=>{let o,s;const d=Uint8Array.from([170,170,170]),l={payload:Uint8Array.from([222,173,190,239,222,173,190,239])},i={_tag:"SomeError",errorCode:0,message:"SomeError"};(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),o={sendCommand:e.vi.fn()},s={descriptor:d,certificate:l}}),(0,e.it)("returns Nothing when both commands succeed",async()=>{const a=(0,t.CommandResultFactory)({data:r.Maybe.of(null)});o.sendCommand.mockResolvedValue(a);const c=await new m.ProvideSolanaTransactionContextTask(o,s).run();(0,e.expect)(o.sendCommand).toHaveBeenCalledTimes(2);const u=o.sendCommand.mock.calls[0];(0,e.expect)(u).toBeDefined();const C=u[0];(0,e.expect)(C).toBeInstanceOf(p.ProvideTrustedNamePKICommand),(0,e.expect)(C.args.pkiBlob).toStrictEqual(l.payload);const f=o.sendCommand.mock.calls[1][0];(0,e.expect)(f).toBeInstanceOf(k.ProvideTLVDescriptorCommand),(0,e.expect)(f.args.payload).toStrictEqual(d),(0,e.expect)(c).toStrictEqual(r.Nothing)}),(0,e.it)("throws error if PKI command fails",async()=>{const a=(0,t.CommandResultFactory)({error:i});o.sendCommand.mockResolvedValueOnce(a);const n=new m.ProvideSolanaTransactionContextTask(o,s);await(0,e.expect)(n.run()).rejects.toBe(a),(0,e.expect)(o.sendCommand).toHaveBeenCalledTimes(1)}),(0,e.it)("throws error if TLV command fails",async()=>{const a=(0,t.CommandResultFactory)({data:r.Maybe.of(null)}),n=(0,t.CommandResultFactory)({error:i});o.sendCommand.mockResolvedValueOnce(a).mockResolvedValueOnce(n);const c=new m.ProvideSolanaTransactionContextTask(o,s);await(0,e.expect)(c.run()).rejects.toBe(n),(0,e.expect)(o.sendCommand).toHaveBeenCalledTimes(2)})});
|
|
2
|
+
//# sourceMappingURL=ProvideTransactionContextTask.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommandResultFactory } from \"@ledgerhq/device-management-kit\";\nimport { Maybe, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"./ProvideTransactionContextTask\";\n\ndescribe(\"ProvideSolanaTransactionContextTask\", () => {\n let fakeApi: { sendCommand: Mock };\n let context: SolanaContextForDevice;\n\n const dummyDescriptor = Uint8Array.from([0xaa, 0xaa, 0xaa]);\n const dummyCertificate: any = {\n payload: Uint8Array.from([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef]),\n };\n\n const mockError = { _tag: \"SomeError\", errorCode: 0, message: \"SomeError\" };\n\n beforeEach(() => {\n vi.resetAllMocks();\n fakeApi = {\n sendCommand: vi.fn(),\n };\n context = {\n descriptor: dummyDescriptor,\n certificate: dummyCertificate,\n };\n });\n\n it(\"returns Nothing when both commands succeed\", async () => {\n // given\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n fakeApi.sendCommand.mockResolvedValue(successResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n\n const firstCallCall = fakeApi.sendCommand.mock.calls[0];\n expect(firstCallCall).toBeDefined();\n const firstCallArg = firstCallCall![0];\n expect(firstCallArg).toBeInstanceOf(ProvideTrustedNamePKICommand);\n expect(\n (firstCallArg as ProvideTrustedNamePKICommand).args.pkiBlob,\n ).toStrictEqual(dummyCertificate.payload);\n\n const secondCallArg = fakeApi.sendCommand.mock.calls[1]![0]!;\n expect(secondCallArg).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(\n (secondCallArg as ProvideTLVDescriptorCommand).args.payload,\n ).toStrictEqual(dummyDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws error if PKI command fails\", async () => {\n const errorResult = CommandResultFactory({ error: mockError });\n fakeApi.sendCommand.mockResolvedValueOnce(errorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(errorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"throws error if TLV command fails\", async () => {\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n const tlvErrorResult = CommandResultFactory({ error: mockError });\n\n fakeApi.sendCommand\n .mockResolvedValueOnce(successResult)\n .mockResolvedValueOnce(tlvErrorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(tlvErrorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n });\n});\n"],
|
|
5
|
+
"mappings": "aAGA,IAAAA,EAAqC,2CACrCC,EAA+B,qBAC/BC,EAAgE,kBAEhEC,EAA4C,oEAC5CC,EAA6C,qEAE7CC,EAGO,8CAEP,YAAS,sCAAuC,IAAM,CACpD,IAAIC,EACAC,EAEJ,MAAMC,EAAkB,WAAW,KAAK,CAAC,IAAM,IAAM,GAAI,CAAC,EACpDC,EAAwB,CAC5B,QAAS,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAI,CAAC,CAC3E,EAEMC,EAAY,CAAE,KAAM,YAAa,UAAW,EAAG,QAAS,WAAY,KAE1E,cAAW,IAAM,CACf,KAAG,cAAc,EACjBJ,EAAU,CACR,YAAa,KAAG,GAAG,CACrB,EACAC,EAAU,CACR,WAAYC,EACZ,YAAaC,CACf,CACF,CAAC,KAED,MAAG,6CAA8C,SAAY,CAE3D,MAAME,KAAgB,wBAAqB,CAAE,KAAM,QAAM,GAAG,IAAI,CAAE,CAAC,EACnEL,EAAQ,YAAY,kBAAkBK,CAAa,EAQnD,MAAMC,EAAS,MANF,IAAI,sCACfN,EACAC,CACF,EAG0B,IAAI,KAG9B,UAAOD,EAAQ,WAAW,EAAE,sBAAsB,CAAC,EAEnD,MAAMO,EAAgBP,EAAQ,YAAY,KAAK,MAAM,CAAC,KACtD,UAAOO,CAAa,EAAE,YAAY,EAClC,MAAMC,EAAeD,EAAe,CAAC,KACrC,UAAOC,CAAY,EAAE,eAAe,8BAA4B,KAChE,UACGA,EAA8C,KAAK,OACtD,EAAE,cAAcL,EAAiB,OAAO,EAExC,MAAMM,EAAgBT,EAAQ,YAAY,KAAK,MAAM,CAAC,EAAG,CAAC,KAC1D,UAAOS,CAAa,EAAE,eAAe,6BAA2B,KAChE,UACGA,EAA8C,KAAK,OACtD,EAAE,cAAcP,CAAe,KAE/B,UAAOI,CAAM,EAAE,cAAc,SAAO,CACtC,CAAC,KAED,MAAG,oCAAqC,SAAY,CAClD,MAAMI,KAAc,wBAAqB,CAAE,MAAON,CAAU,CAAC,EAC7DJ,EAAQ,YAAY,sBAAsBU,CAAW,EAErD,MAAMC,EAAO,IAAI,sCACfX,EACAC,CACF,EAEA,QAAM,UAAOU,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKD,CAAW,KACjD,UAAOV,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,KAED,MAAG,oCAAqC,SAAY,CAClD,MAAMK,KAAgB,wBAAqB,CAAE,KAAM,QAAM,GAAG,IAAI,CAAE,CAAC,EAC7DO,KAAiB,wBAAqB,CAAE,MAAOR,CAAU,CAAC,EAEhEJ,EAAQ,YACL,sBAAsBK,CAAa,EACnC,sBAAsBO,CAAc,EAEvC,MAAMD,EAAO,IAAI,sCACfX,EACAC,CACF,EAEA,QAAM,UAAOU,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKC,CAAc,KACpD,UAAOZ,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ProvideTLVDescriptorCommand", "import_ProvideTrustedNamePKICommand", "import_ProvideTransactionContextTask", "fakeApi", "context", "dummyDescriptor", "dummyCertificate", "mockError", "successResult", "result", "firstCallCall", "firstCallArg", "secondCallArg", "errorResult", "task", "tlvErrorResult"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var w=(i,t)=>{for(var e in t)u(i,e,{get:t[e],enumerable:!0})},B=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of v(t))!D.call(i,r)&&r!==e&&u(i,r,{get:()=>t[r],enumerable:!(n=R(t,r))||n.enumerable});return i};var M=i=>B(u({},"__esModule",{value:!0}),i);var G={};w(G,{MAX_MESSAGE_LENGTH:()=>g,MessageFormat:()=>S,SendSignMessageTask:()=>N});module.exports=M(G);var a=require("@ledgerhq/device-management-kit"),A=require("@ledgerhq/signer-utils"),m=require("../../app-binder/command/GetPubKeyCommand"),E=require("../../app-binder/command/SignOffChainMessageCommand"),_=require("../../app-binder/services/bs58Encoder"),C=require("./SendCommandInChunksTask");const F=15*1024,k=1280,y=40,I=8,P=F-y-I,p=k-y-I,f=65515,x=126,L=32,O=10;var S=(n=>(n[n.Ascii=0]="Ascii",n[n.Utf8=1]="Utf8",n[n.Utf8LongV0=2]="Utf8LongV0",n))(S||{});const g=f;class N{constructor(t,e,n=_.DefaultBs58Encoder){this.api=t;this.args=e;this.bs58Encoder=n}async run(){const{sendingData:t,derivationPath:e}=this.args;if(t.length===0)return(0,a.CommandResultFactory)({error:new a.InvalidStatusWordError("Message cannot be empty")});if(t.length>g)return(0,a.CommandResultFactory)({error:new a.InvalidStatusWordError(`Message too long: ${t.length} bytes (max is ${g})`)});const n=A.DerivationPathUtils.splitPath(e),r=await this.api.sendCommand(new m.GetPubKeyCommand({derivationPath:e,checkOnDevice:!1}));if(!("data"in r))return(0,a.CommandResultFactory)({error:new a.InvalidStatusWordError("Error getting public key from device")});const o=this.bs58Encoder.decode(r.data),h=this._buildFullMessage(t,o,!1),b=this._buildApduCommand(h,n),d=await this._sendInChunks(b);if((0,a.isSuccessCommandResult)(d))try{const s=this._buildEnvelopeBase58(d.data,h);return(0,a.CommandResultFactory)({data:{signature:s}})}catch(s){return(0,a.CommandResultFactory)({error:new a.InvalidStatusWordError(s instanceof Error?s.message:String(s))})}const U="error"in d?d.error:void 0;if(this._isInvalidOffchainHeaderError(U)){if(t.length>p)return d;const s=this._buildFullMessage(t,o,!0),T=this._buildApduCommand(s,n),c=await this._sendInChunks(T);if((0,a.isSuccessCommandResult)(c))try{const l=this._buildEnvelopeBase58(c.data,s);return(0,a.CommandResultFactory)({data:{signature:l}})}catch(l){return(0,a.CommandResultFactory)({error:new a.InvalidStatusWordError(l instanceof Error?l.message:String(l))})}return c}return d}_isUTF8(t){try{return new TextDecoder("utf-8",{fatal:!0}).decode(t),!0}catch{return!1}}_findMessageFormat(t,e){const n=e?p:P;if(t.length<=n){if(this._isPrintableASCII(t,e))return 0;if(this._isUTF8(t))return 1}else if(t.length<=f){if(this._isUTF8(t))return 2}else throw new a.InvalidStatusWordError(`Message too long: ${t.length} bytes (max is ${f})`);return 0}_isPrintableASCII(t,e){for(let n=0;n<t.length;n++){const r=t[n];if(!(!e&&r===O)&&(r<L||r>x))return!1}return!0}_buildFullMessage(t,e,n){const r=this._findMessageFormat(t,n),o=new a.ByteArrayBuilder;return o.add8BitUIntToData(255).addAsciiStringToData("solana offchain"),o.add8BitUIntToData(0),n||o.addBufferToData(new Uint8Array(32)),o.add8BitUIntToData(r),n||(o.add8BitUIntToData(1),o.addBufferToData(e)),o.add8BitUIntToData(t.length&255),o.add8BitUIntToData(t.length>>8&255),o.addBufferToData(t),o.build()}_isInvalidOffchainHeaderError(t){if(!t||typeof t!="object")return!1;const e=t,n=e._tag,r=e.errorCode;return typeof n=="string"&&typeof r=="string"&&r.toLowerCase()==="6a81"}_buildApduCommand(t,e){const n=new a.ByteArrayBuilder(2+e.length*4+t.length);return n.add8BitUIntToData(1),n.add8BitUIntToData(e.length),e.forEach(r=>n.add32BitUIntToData(r)),n.addBufferToData(t),n.build()}async _sendInChunks(t){const e=n=>new E.SignOffChainMessageCommand(n);return await new C.SendCommandInChunksTask(this.api,{data:t,commandFactory:e}).run()}_buildEnvelopeBase58(t,e){if(t.length!==64)throw new a.InvalidStatusWordError(`Invalid signature length: ${t.length} (expected 64)`);const n=Uint8Array.of(1),r=new Uint8Array(n.length+t.length+e.length);return r.set(n,0),r.set(t,n.length),r.set(e,n.length+t.length),this.bs58Encoder.encode(r)}}0&&(module.exports={MAX_MESSAGE_LENGTH,MessageFormat,SendSignMessageTask});
|
|
2
2
|
//# sourceMappingURL=SendSignMessageTask.js.map
|