@ledgerhq/device-signer-kit-solana 0.0.0-hid-candidate-4-20250528125313 → 0.0.0-intent-queue-1-20251112094350
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/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 +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/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/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 +8 -2
- 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/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 +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/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/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 +8 -2
- package/lib/types/api/SignerSolana.d.ts +2 -2
- 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 -2
- 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/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 +293 -3
- 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 +10 -2
- 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/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/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/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/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 +12 -6
- 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 -4
- package/lib/types/api/model/TransactionOptions.d.ts.map +0 -1
- /package/lib/esm/api/{model/TransactionOptions.js.map → SolanaTools.js.map} +0 -0
|
@@ -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
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/SendSignMessageTask.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,
|
|
6
|
-
"names": ["SendSignMessageTask_exports", "__export", "SendSignMessageTask", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_SignOffChainMessageCommand", "api", "args", "sendingData", "derivationPath", "
|
|
4
|
+
"sourcesContent": ["import {\n ByteArrayBuilder,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\n\nimport { GetPubKeyCommand } from \"@internal/app-binder/command/GetPubKeyCommand\";\nimport {\n SignOffChainMessageCommand,\n type SignOffChainRawResponse,\n} from \"@internal/app-binder/command/SignOffChainMessageCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n type CommandFactory,\n SendCommandInChunksTask,\n} from \"./SendCommandInChunksTask\";\n\nconst DEVICE_V0_PAYLOAD_CEILING = 15 * 1024; // 15360\nconst DEVICE_LEGACY_PAYLOAD_CEILING = 1280;\n\n// bytes reserved by app/header and transport\nconst RESERVED_HEADER_BYTES = 40;\nconst RESERVED_TRANSPORT_BYTES = 8;\n\n// derived usable body sizes\nconst OFFCHAINMSG_MAX_LEN =\n DEVICE_V0_PAYLOAD_CEILING - RESERVED_HEADER_BYTES - RESERVED_TRANSPORT_BYTES; // 15312\n\nconst LEGACY_OFFCHAINMSG_MAX_LEN =\n DEVICE_LEGACY_PAYLOAD_CEILING -\n RESERVED_HEADER_BYTES -\n RESERVED_TRANSPORT_BYTES; // 1232\n\n// device cap for v0 long UTF-8\nconst OFFCHAINMSG_MAX_V0_LEN = 65515;\n\nconst MAX_PRINTABLE_ASCII = 0x7e;\nconst MIN_PRINTABLE_ASCII = 0x20;\nconst LINE_FEED_ASCII = 0x0a;\n\nexport enum MessageFormat {\n Ascii = 0,\n Utf8 = 1,\n Utf8LongV0 = 2,\n}\n\nexport const MAX_MESSAGE_LENGTH = OFFCHAINMSG_MAX_V0_LEN;\n\nexport type SendSignMessageTaskArgs = {\n sendingData: Uint8Array;\n derivationPath: string;\n};\n\nexport type SendSignMessageTaskRunFunctionReturn = Promise<\n CommandResult<{ signature: string }, SolanaAppErrorCodes>\n>;\n\nexport class SendSignMessageTask {\n constructor(\n private api: InternalApi,\n private args: SendSignMessageTaskArgs,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {}\n\n async run(): SendSignMessageTaskRunFunctionReturn {\n const { sendingData, derivationPath } = this.args;\n\n if (sendingData.length === 0) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Message cannot be empty\"),\n });\n }\n if (sendingData.length > MAX_MESSAGE_LENGTH) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Message too long: ${sendingData.length} bytes (max is ${MAX_MESSAGE_LENGTH})`,\n ),\n });\n }\n\n const paths = DerivationPathUtils.splitPath(derivationPath);\n\n const pubkeyResult = await this.api.sendCommand(\n new GetPubKeyCommand({ derivationPath, checkOnDevice: false }),\n );\n if (!(\"data\" in pubkeyResult)) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Error getting public key from device\",\n ),\n });\n }\n const signerPubkey = this.bs58Encoder.decode(pubkeyResult.data);\n\n // try v0 first\n const v0OCM = this._buildFullMessage(sendingData, signerPubkey, false);\n const v0Payload = this._buildApduCommand(v0OCM, paths);\n const v0Res = await this._sendInChunks(v0Payload);\n\n if (isSuccessCommandResult(v0Res)) {\n try {\n const sigB58 = this._buildEnvelopeBase58(v0Res.data, v0OCM);\n return CommandResultFactory({ data: { signature: sigB58 } });\n } catch (e) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n e instanceof Error ? e.message : String(e),\n ),\n });\n }\n }\n\n // if the app says header invalid, try legacy\n const v0Error: unknown =\n \"error\" in v0Res ? (v0Res as { error: unknown }).error : undefined;\n\n if (this._isInvalidOffchainHeaderError(v0Error)) {\n if (sendingData.length > LEGACY_OFFCHAINMSG_MAX_LEN) {\n return v0Res;\n }\n\n const legacyOCM = this._buildFullMessage(sendingData, signerPubkey, true);\n const legacyPayload = this._buildApduCommand(legacyOCM, paths);\n const legacyRes = await this._sendInChunks(legacyPayload);\n\n if (isSuccessCommandResult(legacyRes)) {\n try {\n const sigB58 = this._buildEnvelopeBase58(legacyRes.data, legacyOCM);\n return CommandResultFactory({ data: { signature: sigB58 } });\n } catch (e) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n e instanceof Error ? e.message : String(e),\n ),\n });\n }\n }\n return legacyRes;\n }\n\n return v0Res;\n }\n\n private _isUTF8(buf: Uint8Array): boolean {\n try {\n new TextDecoder(\"utf-8\", { fatal: true }).decode(buf);\n return true;\n } catch {\n return false;\n }\n }\n\n private _findMessageFormat(\n message: Uint8Array,\n isLegacy: boolean,\n ): MessageFormat {\n const maxLedgerLen = isLegacy\n ? LEGACY_OFFCHAINMSG_MAX_LEN\n : OFFCHAINMSG_MAX_LEN;\n\n if (message.length <= maxLedgerLen) {\n if (this._isPrintableASCII(message, isLegacy)) return MessageFormat.Ascii;\n if (this._isUTF8(message)) return MessageFormat.Utf8;\n } else if (message.length <= OFFCHAINMSG_MAX_V0_LEN) {\n if (this._isUTF8(message)) return MessageFormat.Utf8LongV0;\n } else {\n // unreachable if run() guards length\n throw new InvalidStatusWordError(\n `Message too long: ${message.length} bytes (max is ${OFFCHAINMSG_MAX_V0_LEN})`,\n );\n }\n // default to ASCII like legacy\n return MessageFormat.Ascii;\n }\n\n private _isPrintableASCII(buf: Uint8Array, isLegacy: boolean): boolean {\n for (let i = 0; i < buf.length; i++) {\n const ch: number = buf[i]!;\n if (!isLegacy && ch === LINE_FEED_ASCII) continue; // newline allowed only for non-legacy\n if (ch < MIN_PRINTABLE_ASCII || ch > MAX_PRINTABLE_ASCII) return false;\n }\n return true;\n }\n\n /**\n * build serialised off-chain message header + body\n * when `isLegacy` is true, build the short legacy header (no app-domain or signers).\n */\n private _buildFullMessage(\n messageBody: Uint8Array,\n signerPubkey: Uint8Array,\n isLegacy: boolean,\n ): Uint8Array {\n const format: MessageFormat = this._findMessageFormat(\n messageBody,\n isLegacy,\n );\n\n const builder = new ByteArrayBuilder();\n\n // signing domain: 0xFF + \"solana offchain\" (16 bytes)\n builder.add8BitUIntToData(0xff).addAsciiStringToData(\"solana offchain\");\n\n // header version = 0\n builder.add8BitUIntToData(0);\n\n if (!isLegacy) {\n // application domain = 32 zeros\n builder.addBufferToData(new Uint8Array(32));\n }\n\n // message format\n builder.add8BitUIntToData(format);\n\n if (!isLegacy) {\n // signer count = 1\n builder.add8BitUIntToData(1);\n // signer pubkey (32 bytes)\n builder.addBufferToData(signerPubkey);\n }\n\n // message length (LE, 2 bytes)\n builder.add8BitUIntToData(messageBody.length & 0xff);\n builder.add8BitUIntToData((messageBody.length >> 8) & 0xff);\n\n // message body\n builder.addBufferToData(messageBody);\n\n return builder.build();\n }\n\n // guard for the device\u2019s 0x6A81 \u201CInvalid off-chain message header\u201D error\n private _isInvalidOffchainHeaderError(\n e: unknown,\n ): e is { _tag: string; errorCode: string } {\n if (!e || typeof e !== \"object\") return false;\n const obj = e as Record<string, unknown>;\n const tag = obj[\"_tag\"];\n const code = obj[\"errorCode\"];\n return (\n typeof tag === \"string\" &&\n typeof code === \"string\" &&\n code.toLowerCase() === \"6a81\"\n );\n }\n\n /**\n * build APDU payload:\n * [signerCount=1][derivationsCount][each 4-byte index][OCM message]\n */\n private _buildApduCommand(\n fullMessage: Uint8Array,\n paths: number[],\n ): Uint8Array {\n const builder = new ByteArrayBuilder(\n 1 + 1 + paths.length * 4 + fullMessage.length,\n );\n\n builder.add8BitUIntToData(1); // number of signers\n builder.add8BitUIntToData(paths.length); // number of derivations\n paths.forEach((idx) => builder.add32BitUIntToData(idx)); // big-endian\n builder.addBufferToData(fullMessage);\n\n return builder.build(); // larger than 255 is ok, SendCommandInChunksTask will chunk it\n }\n\n // send APDU payload using chunk task, return raw 64-byte signature (last chunk)\n private async _sendInChunks(\n apduPayload: Uint8Array,\n ): Promise<CommandResult<SignOffChainRawResponse, SolanaAppErrorCodes>> {\n const commandFactory: CommandFactory<SignOffChainRawResponse> = (\n chunkArgs,\n ) => new SignOffChainMessageCommand(chunkArgs);\n\n return await new SendCommandInChunksTask<SignOffChainRawResponse>(\n this.api,\n {\n data: apduPayload,\n commandFactory,\n },\n ).run();\n }\n\n // build base58 OCM envelope: [signatureCount=1][signature(64)][serialized OCM]\n private _buildEnvelopeBase58(\n rawSignature: Uint8Array,\n serializedOCM: Uint8Array,\n ): string {\n if (rawSignature.length !== 64) {\n throw new InvalidStatusWordError(\n `Invalid signature length: ${rawSignature.length} (expected 64)`,\n );\n }\n const sigCount = Uint8Array.of(1);\n const envelope = new Uint8Array(\n sigCount.length + rawSignature.length + serializedOCM.length,\n );\n envelope.set(sigCount, 0);\n envelope.set(rawSignature, sigCount.length);\n envelope.set(serializedOCM, sigCount.length + rawSignature.length);\n return this.bs58Encoder.encode(envelope);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SendSignMessageTask_exports", "__export", "MAX_MESSAGE_LENGTH", "MessageFormat", "SendSignMessageTask", "__toCommonJS", "import_device_management_kit", "import_signer_utils", "import_GetPubKeyCommand", "import_SignOffChainMessageCommand", "import_bs58Encoder", "import_SendCommandInChunksTask", "DEVICE_V0_PAYLOAD_CEILING", "DEVICE_LEGACY_PAYLOAD_CEILING", "RESERVED_HEADER_BYTES", "RESERVED_TRANSPORT_BYTES", "OFFCHAINMSG_MAX_LEN", "LEGACY_OFFCHAINMSG_MAX_LEN", "OFFCHAINMSG_MAX_V0_LEN", "MAX_PRINTABLE_ASCII", "MIN_PRINTABLE_ASCII", "LINE_FEED_ASCII", "api", "args", "bs58Encoder", "sendingData", "derivationPath", "paths", "pubkeyResult", "signerPubkey", "v0OCM", "v0Payload", "v0Res", "sigB58", "e", "v0Error", "legacyOCM", "legacyPayload", "legacyRes", "buf", "message", "isLegacy", "maxLedgerLen", "i", "ch", "messageBody", "format", "builder", "obj", "tag", "code", "fullMessage", "idx", "apduPayload", "commandFactory", "chunkArgs", "rawSignature", "serializedOCM", "sigCount", "envelope"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
"use strict";var s=require("@ledgerhq/device-management-kit"),
|
|
1
|
+
"use strict";var s=require("@ledgerhq/device-management-kit"),y=require("../../app-binder/device-action/__test-utils__/makeInternalApi"),g=require("../../app-binder/services/bs58Encoder"),t=require("../../app-binder/task/SendSignMessageTask");const r="44'/501'/0'/0'",c=new Uint8Array(32).fill(17),m=g.DefaultBs58Encoder.encode(c);function w(){return{_tag:"SolanaAppCommandError",errorCode:"6a81",message:"Invalid off-chain message header"}}describe("SendSignMessageTask",()=>{const n=(0,y.makeDeviceActionInternalApiMock)();beforeEach(()=>{vi.resetAllMocks()}),describe("run()",()=>{it("errors on empty message before any device call",async()=>{const e=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:new Uint8Array([])}).run();expect(n.sendCommand).toHaveBeenCalledTimes(0),expect(e.error).toEqual(new s.InvalidStatusWordError("Message cannot be empty"))}),it("errors when GET_PUBKEY fails",async()=>{n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({error:new s.InvalidStatusWordError("pubkey error")}));const e=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:new Uint8Array([1,2,3])}).run();expect(n.sendCommand).toHaveBeenCalledTimes(1),expect(e.error).toEqual(new s.InvalidStatusWordError("Error getting public key from device"))}),it("surfaces command error when signing fails",async()=>{n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({data:m})).mockResolvedValueOnce((0,s.CommandResultFactory)({error:new s.InvalidStatusWordError("no signature returned")}));const e=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:new Uint8Array([170,187])}).run();expect(n.sendCommand).toHaveBeenCalledTimes(2),expect(e.error).toEqual(new s.InvalidStatusWordError("no signature returned"))}),it("returns base58 envelope when signing succeeds",async()=>{const e=new Uint8Array([240,202,204,26]),a=new Uint8Array(64).fill(51);n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({data:m})).mockResolvedValueOnce((0,s.CommandResultFactory)({data:a}));const o=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}),i=o._buildFullMessage(e,c,!1),d=await o.run();expect(n.sendCommand).toHaveBeenCalledTimes(2),expect("data"in d).toBe(!0);const u=d.data.signature,l=new Uint8Array(1+a.length+i.length);l.set(Uint8Array.of(1),0),l.set(a,1),l.set(i,1+a.length),expect(g.DefaultBs58Encoder.decode(u)).toEqual(l)}),it("rejects invalid derivation path",async()=>{const e={derivationPath:"not/a/path",sendingData:new Uint8Array([1])};await expect(new t.SendSignMessageTask(n,e).run()).rejects.toThrow()}),it("builds APDU command with correct structure (prefix + tail)",()=>{const e=new Uint8Array([1,2,3]),a=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}),o=a._buildFullMessage(e,c,!1),i=[-2147483604,-2147483147,-2147483648,0],d=a._buildApduCommand(o,i);expect(d[0]).toBe(1),expect(d[1]).toBe(i.length),expect(d.slice(d.length-o.length)).toEqual(o)}),it("handles large messages via chunking (no exact call count assertion)",async()=>{const e=new Uint8Array(4e3).fill(1),a=new Uint8Array(64).fill(68);n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({data:m})).mockResolvedValue((0,s.CommandResultFactory)({data:a}));const o=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}).run();expect("data"in o).toBe(!0)}),it("errors on message exceeding v0 max (65515)",async()=>{const e=new Uint8Array(t.MAX_MESSAGE_LENGTH+1).fill(170),a=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}).run();expect(n.sendCommand).toHaveBeenCalledTimes(0),expect(a.error).toEqual(new s.InvalidStatusWordError(`Message too long: ${e.length} bytes (max is ${t.MAX_MESSAGE_LENGTH})`))}),it("falls back to legacy when v0 returns 6a81 (header error)",async()=>{const e=new Uint8Array([97,98,99]),a=new Uint8Array(64).fill(85);n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({data:m})).mockResolvedValueOnce((0,s.CommandResultFactory)({error:w()})).mockResolvedValueOnce((0,s.CommandResultFactory)({data:a}));const o=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}),i=o._buildFullMessage(e,c,!0),d=await o.run();expect(n.sendCommand).toHaveBeenCalledTimes(3);const u=d.data.signature,l=new Uint8Array(1+a.length+i.length);l.set(Uint8Array.of(1),0),l.set(a,1),l.set(i,1+a.length),expect(g.DefaultBs58Encoder.decode(u)).toEqual(l)}),it("does NOT fallback on non-6a81 errors",async()=>{n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({data:m})).mockResolvedValueOnce((0,s.CommandResultFactory)({error:new s.InvalidStatusWordError("oups")}));const e=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:new Uint8Array([1,2])}).run();expect(n.sendCommand).toHaveBeenCalledTimes(2),expect(e.error).toBeInstanceOf(s.InvalidStatusWordError)}),it("propagates 6a81 if body is too large for legacy",async()=>{const e=new Uint8Array(2e3).fill(49);n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({data:m})).mockResolvedValueOnce((0,s.CommandResultFactory)({error:w()}));const a=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}).run();expect(n.sendCommand).toHaveBeenCalledTimes(2),expect(a.error).toEqual(w())})}),describe("message format detection (indirect via header byte)",()=>{it("sets format=0 for ASCII \u2264 maxLedgerLen (v0 header)",()=>{const e=new TextEncoder().encode(`hello
|
|
2
|
+
world`),o=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e})._buildFullMessage(e,c,!1);expect(o[49]).toBe(t.MessageFormat.Ascii)}),it("sets format=1 for short UTF-8 non-ASCII (v0 header)",()=>{const e=new TextEncoder().encode("h\xE9ll\xF8"),o=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e})._buildFullMessage(e,c,!1);expect(o[49]).toBe(t.MessageFormat.Utf8)}),it("sets format=2 for long UTF-8 (v0 header)",()=>{const e=new TextEncoder().encode("x".repeat(15313)),o=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e})._buildFullMessage(e,c,!1);expect(o[49]).toBe(t.MessageFormat.Utf8LongV0)}),it("legacy header forbids newline in ASCII (so format becomes UTF-8=1)",()=>{const e=new TextEncoder().encode(`hello
|
|
3
|
+
world`),o=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e})._buildFullMessage(e,c,!0);expect(o[17]).toBe(t.MessageFormat.Utf8)}),it("legacy header sets format=0 for plain ASCII (no newline)",()=>{const e=new TextEncoder().encode("HELLO_123"),o=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e})._buildFullMessage(e,c,!0);expect(o[17]).toBe(t.MessageFormat.Ascii)}),it("message length is little-endian in both headers",()=>{const e=new Uint8Array([1,2,3]),a=new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}),o=a._buildFullMessage(e,c,!1);expect(o[83]).toBe(3),expect(o[84]).toBe(0);const i=a._buildFullMessage(e,c,!0);expect(i[18]).toBe(3),expect(i[19]).toBe(0)})}),it("returns error when device returns non-64-byte signature on final chunk",async()=>{const e=new Uint8Array([1,2,3]);n.sendCommand.mockResolvedValueOnce((0,s.CommandResultFactory)({data:m})).mockResolvedValueOnce((0,s.CommandResultFactory)({data:new Uint8Array(0)}));const a=await new t.SendSignMessageTask(n,{derivationPath:r,sendingData:e}).run();expect("error"in a).toBe(!0);const o=a.error;expect(o).toBeInstanceOf(s.InvalidStatusWordError)})});
|
|
2
4
|
//# sourceMappingURL=SendSignMessageTask.test.js.map
|