@ledgerhq/device-signer-kit-solana 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -24
- package/lib/cjs/api/SignerSolana.js +1 -1
- package/lib/cjs/api/SignerSolana.js.map +1 -1
- package/lib/cjs/api/SolanaTools.js +1 -1
- package/lib/cjs/api/SolanaTools.js.map +1 -1
- package/lib/cjs/api/app-binder/SignMessageDeviceActionTypes.js.map +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 +1 -1
- 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/app-binder/SolanaAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +2 -2
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +2 -2
- 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/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/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -3
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +3 -3
- 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 +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- 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 +2 -2
- package/lib/cjs/package.json +4 -4
- package/lib/esm/api/index.js +1 -1
- package/lib/esm/api/index.js.map +1 -1
- package/lib/esm/api/model/SolanaTransactionOptionalConfig.js +1 -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/app-binder/SolanaAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +2 -2
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +2 -2
- 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/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/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +2 -2
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +2 -2
- package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +3 -3
- package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -3
- package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +3 -3
- 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 +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +2 -2
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
- 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 +2 -2
- package/lib/esm/package.json +4 -4
- package/lib/types/api/SignerSolana.d.ts +2 -2
- package/lib/types/api/SignerSolana.d.ts.map +1 -1
- package/lib/types/api/SolanaTools.d.ts +1 -2
- package/lib/types/api/SolanaTools.d.ts.map +1 -1
- 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 +2 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +1 -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/{TransactionOptions.d.ts → TransactionResolutionContext.d.ts} +2 -2
- package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -0
- package/lib/types/internal/DefaultSignerSolana.d.ts +290 -1
- package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +2 -1
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +3 -1
- package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts +6 -3
- package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +3 -0
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +30 -5
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
- 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 +2 -2
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +5 -3
- package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
- package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +2 -3
- package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +8 -8
- 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.map +0 -1
- /package/lib/esm/api/model/{TransactionOptions.js.map → SolanaTransactionOptionalConfig.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({ input }: { input: SignTransactionDAInput }) =>\n inspectTransaction({ serializedTransaction: input.transaction }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOPdL37pAFj1WArACYANCACeuh4Y46dxgGzSBnZ6AQZ6dgC+ES5omLgERGxUtAxMrORU3Lz8QiJiUjrySCDKqhkYGtoI+kam5pY29s5uujrSxhzSAJw+AcZWplZ+BlEx6Nj4hCTlKYwsSZwA8opgGMyKirNpC+IQVGAcqBh0FADWBxQraxvComAAsiQAFkdgMkVKKmpUlYjhOhw7F0bAYrAN9HZrC53NV2lZAV1AnYrGEul0wpFoiBYhMEtN2Ft5uUOABhJ5gYinZardabehzdLsABKcAArgJSFI5BpSt8KsUqjoDDoHJ0ug5jAY6jowbZoa0ZYDpHYfA59A47H4BqNseN4lMFoTGZkyRSqVdaUaFizYOzOZJCjyvuVftVhaLuhKpWYZY15QhjADpH4HAMQ0FzOEujqcfrEjN6dtiQBxMCkWkkqgAM3Qu32h2OZwOMHTG0zGBzUHeTrK6gFukDeg4fj04Slwbavis-pFAw4en6wSGfmRXWMMb1k3jBMTRPYHFTpcU5cr4jAOBwFBwHEUAlEWa3AFsOCWM9n0NXiryXfXqo3m627O2-J3+j20RwHIjhiHPAOrIEE5xFO+LJLOxqcIuZ4VugNp2qalJch8JTOnWoBVA4njwv0OiOFYaohNIwY9p4HR+GiGrGNYAEOEEQG4gaCapHOmRQWW55QHBHIIacBTIdeaFaIgmG2CYVi4aGBEBMRLQIKCQY6F0QIigY0iKdGWKxiBhrgQsWSwCsZBxqBGB5hgBxHCc5wFgZFKkMZCyXp8tY-LeEr4f2yKmGOwyGF0JHkRwYQGORxj+C2fgtvRDlMQyek8LZRnaeUa4bluO57qQB44MeRyJfZyXsE5KEufy6HCf0orhAMeg+cF-myfYXSfjYtgiphiLIn40WFWBzEQRwzBZmIOAJYZ9rcleqGueVcmYUYtFdC2spSphPYih0QxLX4gbCqCdiYmMwF4jp-V6UNI1jXZfE1nyroGPNn4GEttggsYa2yUK0iilYSkorRaqqQYIyaZOJ2xUm84XeuV1kFIDj8dNZVCXNtFPS9K3vc0MLSRwXQhFqkZKYpOg9eDM5ncSABCrKoAIEDlmImicns5kFlZBwAEa0-TjNgMzxUCTNKNhDYn5jqpA6guJB3rWjNiOARX74-YZOMRTcXUzzDNUEznLrpu267vuR4cNzdM6xgeuC0j922E2X6SuYkpgrhdj+hYzUONY-QK8Y4o7Wr059Zr84AAqbgwEBgHzzNmRZhbWYokeoNHsekDbpWuvhYWAp4in9Pj4r2OtWr9p4yIE-0YXjqDx3qyHkOZBHFBRzHuv8-raVG5l2XHsnrep+3Vud5nd23jnHSOJ7he1aG7uyf40h48Dr3CgdAGHbq9fBzQunEi3bfp1xpA8Uht03rNCvYQO3T+IMIbrRYJhLUC3syvtQcmVaB8p2nHfMxPmfB0iMs4T2qiYW+PkH7Y10ERUUkUHBam9GqZEIMjoMV3j-ecWlyZUHjuzIsHBVA7xMmPS+KNHCSiCsCMEAQfRjhIgObwL4vwahJqwr+p1Q6ZFwQ3UyBt0rGyyqbEhmCyGTWcuPWaVCjDPTBEMcwalGGfRFMvf2cIBwqk1L4LhEMWKcD4bvIB5JELkMElUYIyJvDBEijYF8wweyqQ6OYAIkJhT6DClvIx39944LBvwkxZobpTTATIiBuECb2J0I4z6SCEEFzsO9NErZAxRCxBgCg0d4DFB8dwpuyMhbIyqAAWj8P6Epdg8ZohqbUmpX49EawKVkNQghbhiAvhYxA+EArwnIm0b6SC1JmG8QErBfjMjUmuHSSmgkin3QOs2bo5hHDbXEjoHswZl5fkUphAZ-gkGNMbgY0kpjzQ0g2NgqgJ9OnC0FERZerZES7X2Z4dawZOiPjaMYTUoUjl71maxNM0FKy3OKboSEP0RQ+HCFY-GsDqioI4DVAI3skn-FGaQ-JJy2LLg4kEykYLXTew1J0B6L5HCr1qgYJh2yLAqnaL4XCwN-lXM4LDAqeDCm2zckMKpMSVK-RbCFZUJEnzIuGe-GqIRSZ13Ediga0NRqEHGkS28qkdotQOWGQMxgSKIhMH0A6oIgieAcKyiZnAaYW3Tmq2a0sqnkWRJqAYalgx6E2QazxIq1IDCBhawFnBD5D1taE6RIs-rNlWU+HwQRIrlNUe0Zs1cJTKk1GYbqcqYpNJOcG-+I9AFsm4mcu1KMwRKRMFjcILZgw-NLkYIYpgQqBkhHoUMAaeGGLGSZUtVRfr2G8PjKiwIwiYQRe1JsT4-rPVwuib6Hbml5PKAS04vbECjkeb9SlkklINRhCKD8Wpfb+13WqTNGDs3HIGsgVkxAmCwByVIihlixzwlahiFUQo926FUthX0iJ8K-Xmguk5ABRbua6EBAn6Mi1sH7Y3foQIYJsQR1n42VEKRw6SIhAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n input: ({ context }) => ({\n ...context.input,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAIE,iBAAAA,EAEA,0BAAAC,EACA,uBAAAC,EAEA,kBAAAC,EACA,2BAAAC,EACA,sBAAAC,MACK,kCACP,OAAS,QAAAC,EAAkB,SAAAC,MAAa,YACxC,OAAS,UAAAC,EAAQ,eAAAC,EAAa,SAAAC,MAAa,
|
|
4
|
+
"sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\n rpcUrl: input.rpcUrl,\n }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) =>\n context.input.transactionOptions?.skipOpenApp || false,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.transactionOptions?.transactionResolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOAJzSAbNNOmATNZ0AWPRYA0IAJ67bLjgcfW-hYArNIGpsGOAL5R7miYuAREbFS0DEys5FTcvPxCImJSOvJIIMqqWRga2gj6RmaW1nYOzm6eujqdHNbWPsE6DXq2MXHo2PiEJJVpjCwpnADyimAYzIqKMxnz4hBUYByoGHQUANb7FMur68KiYACyJAAWh2AyJUoqalTViHrBthxbP5-I5HMZjH9gm0vLVpBCOBYnI5bBY9NI4RZjCMQPFxkkpuxNnNKhwAMKPMDEE5LFZrDb0WaZdgAJTgAFcBKQpHINOUvlVSjUdAZhX5HAY9JLbMEDAZMXp3DDOvoOKEXIZgsZ9JrorEcWNEpN5kSmdlyZTqZc6Sb5qzYByuZJirzPpUfrURUZgZKhjK5RDFYgtRxHDZTKCJZjEXosXrcYbktMGVsSQBxMCkOmkqgAM3QOz2ByOp32MEz62zGDzUDeLoq6kFui1plVpgMEIs9kldlsgdq0oBYU6xmkAwh0mCwWx8YmicJyeJ7A46fLikr1fEYBwOAoOA4igEohzu4Athwy1nc+ha6U+W7G7Vm632y4u3oe32dDYOGHzDLLMYEootOBqzgSqQLqanArpeVboHaDrmlS3LvGUroNqANS2D4eh+H8fSvl+eiOJ+tjBnYyKohY5hAtIuqjAkYHGpB8zLhmsHVghnJIScRSoXeGFaIg2GSnh-x-IRpjEX2-g6D+LigqioIyo4kQgYx+LMeki7ZDwsDLGQCbgRgBYYPshzHGcRb6ZSpBGfMN4fPW3wPmRqk-tR6KOE4Oids4pFDAiUmYjYI5gu26l4kaSbaVBOQ2YZTGVJu267vuh6kMeOBnocCV2Ul7COWhzkCphwnGO5pieXRPl+Qq7QII4Vghgp0jqqpOiRfZMWMqxzA5mIOB6QZjo8re6EuWVCAGCJ3SdtRAwxqOvYNZ0IohiEETBKYgHBHowpdQVEGxX1A1bsNtl8XW-LujNPhzSipiLSOOgrUqBgThw752GidHvpqBiHZpPUpku-WDRdZBSLY-ETaVQnTbNliPc9y19lYAKqbY4ZPa9XbDHGoHA-OJ0kgAQmyqACBAlZiJoXK7GZRaWfsABGlPU7TYD00VAmTQjEr9CYr3il+6JOJ+r0WKqQzmDNvk6P8sYMVFc7Hb15MczTVB01yW47nuB5HqeHDs1T2sYLrvNw7dfxyVqtii+Yo4kQ1QzSD+-w7VJIrGCEgOExp0UkxrS4AAo7gwEBgFz9OmeZxZWYokeoNHsekNbJXusibZfQMARO09b0dKiJjGCi6JkdtthOEDwfq6D2QRxQUcxzr3N66lhsZVlZ7Jy3qdt5bHeZzdD450Y+0VXRIo2K9fZ+wCdgRCKvkRPNddqzQLEks3rfp1xpA8Sh133lNrQe-K7ZURjiuS383Shk1fqK8Bgeq8ZNq7ynaft-Th-HydLDLO48XCXwhNfFwt9gifi8j+CcNhsbaklJ1d+3UQ6N04DOYmVB47MxLBwVQQct6jzPgjJWLYIT-DottbyOhSLBjBBERWmp5rGCnGgo629SZLmwfXEy+s0pG0yibIhH8HJjScmPKaFCTD4RoeGToksgQhgQTKCqkJHab0-jvXhRN+EAIpMhUhgkah7URICUIbVpA13FE9T8q8-DlxCJ2Jwjt2HaK0qHbIfCt6GItFdcaICZEuDktKdEaJbHhHoatFEwQnHSmIlJUMM1dR6gwBQaO8BSi+J0Tw-mfN4Y1AALTQkQMU+Jv4qm-gsKpTxIMdKcB4GoQQNwxCn1MYgZEpFMQcH0FjbCgECYq3QQ3RpHAaRXHpPk+GhTbpQkBMCZEnRtpDBCLAiwXoAhVR0BEtqeh6kYPGTxSZ1pdFUEPh0-mQpK7dEVhYaiGiXoGEltYMU1hPJi1WYcsZcUYIVivFAK5RTdChEcICEI5cwT7VUpqUiAwETEXbE0CE4JUEjK4V-Jc-y1yAv8VSYF7p7D3UiGicUyyXA7QCpPcxyItRDCcAczhODuHeKaYQEaozZk21ck1YwgIpK+QCOiJ6VVSILKUtjOe21NkBwxSyrF2RwbnQ5bZQlD4PqBWRoYNqwoXmxPDCGR2q8dq7WVvqYheS2UcApubdO6qpr+FCH0gItT7A2CsJEWBuca6aietQ7y-wfmsswRwPeg97VBOkQLCILYXBKzCJOF8ksujfW8nYKwU96IWvEQ0uK4bf7D3-uybiRiTgOoRqpUciLFb7T9GYSWDyy4oi1G1J6dTmX8MVVg-RW8K01FDELKwP0rHOFBKRD6X0bBNQeaEWeFhg3do4Lk20Jaj5lv7YgSIUkTBkQnB9FJe0HFhEBIrLU4IDCRBFou85WC2TECYLAbJUiyFmMQX0oYOEa751du9OECTMQyn+AEDh8qu23o4AAUS7puhA207AfpEgyn9fZDAtllH7awSaJTghiDEIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext:\n context.input.transactionOptions?.transactionResolutionContext,\n rpcUrl: context.input.transactionOptions?.solanaRPCURL,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n arg0.rpcUrl,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{CommandResultFactory as o,DeviceActionStatus as e,DeviceModelId as g,DeviceSessionStateType as v,DeviceStatus as y,InvalidStatusWordError as C,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as T,Nothing as N}from"purify-ts";import{beforeEach as P,describe as w,it as D,vi as n}from"vitest";import{testDeviceActionStates as f}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as m}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as E}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as k}from"./SignTransactionDeviceAction";const V="44'/501'/0'/0'",x=new Uint8Array([222,173,190,239]),I={getSolanaContext:n.fn(),
|
|
1
|
+
import{CommandResultFactory as o,DeviceActionStatus as e,DeviceModelId as g,DeviceSessionStateType as v,DeviceStatus as y,InvalidStatusWordError as C,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as T,Nothing as N}from"purify-ts";import{beforeEach as P,describe as w,it as D,vi as n}from"vitest";import{testDeviceActionStates as f}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as m}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as E}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as k}from"./SignTransactionDeviceAction";const V="44'/501'/0'/0'",x=new Uint8Array([222,173,190,239]),I={getSolanaContext:n.fn(),getFieldContext:n.fn(),getContexts:n.fn(),getTypedDataFilters:n.fn(),getWeb3Checks:n.fn()};let r,u,d,A,S,l;function R(){return{getAppConfig:u,buildContext:d,provideContext:A,signTransaction:S,inspectTransaction:l}}w("SignTransactionDeviceAction (Solana)",()=>{P(()=>{r=E(),u=n.fn(),d=n.fn(),A=n.fn(),S=n.fn(),l=n.fn().mockResolvedValue({transactionType:m.SPL,data:{tokenAddress:null,createATA:!1}})}),D("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL});const a={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(a),A.mockResolvedValue(N);const i=new Uint8Array([170,187]);S.mockResolvedValue(o({data:T(i)}));const p=new k({input:{derivationPath:V,transaction:x,transactionOptions:{skipOpenApp:!0},contextModule:I}});n.spyOn(p,"extractDependencies").mockReturnValue(R());const U=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:i,status:e.Completed}];f(p,U,r,{onDone:s,onError:c})})),D("failure in provideContext still signs",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),A.mockResolvedValue(T(o({error:new C("ctxErr")})));const a=new Uint8Array([254]);S.mockResolvedValue(o({data:T(a)}));const i=new k({input:{derivationPath:V,transaction:x,transactionOptions:{skipOpenApp:!0},contextModule:I}});n.spyOn(i,"extractDependencies").mockReturnValue(R());const p=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:a,status:e.Completed}];f(i,p,r,{onDone:s,onError:c})})),D("buildContext throws \u2192 error",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockRejectedValue(new C("bldErr"));const a=new k({input:{derivationPath:V,transaction:x,transactionOptions:{skipOpenApp:!0},contextModule:I}});n.spyOn(a,"extractDependencies").mockReturnValue(R());const i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:expect.anything(),status:e.Error}];f(a,i,r,{onDone:s,onError:c})}))});
|
|
2
2
|
//# sourceMappingURL=SignTransactionDeviceAction.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true, // always skip open\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
|
|
5
|
-
"mappings": "AACA,OACE,wBAAAA,EAEA,sBAAAC,EACA,iBAAAC,EACA,0BAAAC,EACA,gBAAAC,EACA,0BAAAC,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,WAAAC,MAAe,YAC9B,OAAS,cAAAC,EAAY,YAAAC,EAAU,MAAAC,EAAI,MAAAC,MAAU,SAO7C,OAAS,0BAAAC,MAA8B,2EACvC,OAAS,0BAAAC,MAA8B,qDAGvC,OAAS,mCAAAC,MAAuC,mCAChD,OAAS,+BAAAC,MAAmC,gCAE5C,MAAMC,EAAoB,iBACpBC,EAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAEnDC,EAAmC,CACvC,iBAAkBP,EAAG,GAAG,EACxB,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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
|
|
5
|
-
"mappings": "AAAA,OACE,+BAAAA,EACA,iCAAAC,EACA,oBAAAC,MACK,oBACP,OACE,WAAAC,EACA,WAAAC,EAEA,iBAAAC,MACK,kBACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,aAAAC,EACA,6BAAAC,MACK,8BAEPJ,EAAS,4BAA6B,IAAM,CAC1C,MAAMK,EAAWR,EAAQ,SAAS,EAC5BS,EAAYT,EAAQ,SAAS,EAC7BU,EAAcF,EAAS,UAAU,SAAS,EAC1CG,EAAeF,EAAU,UAAU,SAAS,EAElDJ,EAAG,uFAAwF,IAAM,CAE/F,MAAMO,EAAM,IAAIL,EACVM,EAAMD,EAAI,wBAAwBF,EAAaC,EAAc,IAAK,CAAC,EAGnEG,EAAMF,EAAI,4BACdF,EACAC,EACAL,EAAU,KAAK,KAAK,SAAS,EAC7B,IACAA,EAAU,KAAK,SACf,CACF,EAGAF,EAAOS,CAAG,EAAE,KAAKC,CAAG,CACtB,CAAC,EAEDT,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVQ,EAAOT,EAAU,KAAK,KACtBU,EAAWV,EAAU,KAAK,SAC1BW,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,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaH,CAAS,EAE/C,MAAMI,EAAYxB,EAChBiB,EACAP,EAAS,UACT,GACAT,EACAF,CACF,EACM0B,EAAUzB,EACdiB,EACAN,EAAU,UACV,GACAV,EACAF,CACF,EAEA,UAAW2B,
|
|
6
|
-
"names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "getAssociatedTokenAddressSync", "TOKEN_PROGRAM_ID", "Keypair", "Message", "SystemProgram", "describe", "expect", "it", "COIN_DATA", "GenerateSolanaTransaction", "feePayer", "recipient", "feePayerKey", "recipientKey", "gen", "txA", "txB", "mint", "decimals", "amount", "transfers", "b64", "uint8Array", "msg", "sourceAta", "destAta", "
|
|
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,OACE,+BAAAA,EACA,iCAAAC,EACA,oBAAAC,MACK,oBACP,OACE,WAAAC,EACA,WAAAC,EAEA,iBAAAC,MACK,kBACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,aAAAC,EACA,6BAAAC,MACK,8BAEPJ,EAAS,4BAA6B,IAAM,CAC1C,MAAMK,EAAWR,EAAQ,SAAS,EAC5BS,EAAYT,EAAQ,SAAS,EAC7BU,EAAcF,EAAS,UAAU,SAAS,EAC1CG,EAAeF,EAAU,UAAU,SAAS,EAElDJ,EAAG,uFAAwF,IAAM,CAE/F,MAAMO,EAAM,IAAIL,EACVM,EAAMD,EAAI,wBAAwBF,EAAaC,EAAc,IAAK,CAAC,EAGnEG,EAAMF,EAAI,4BACdF,EACAC,EACAL,EAAU,KAAK,KAAK,SAAS,EAC7B,IACAA,EAAU,KAAK,SACf,CACF,EAGAF,EAAOS,CAAG,EAAE,KAAKC,CAAG,CACtB,CAAC,EAEDT,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVQ,EAAOT,EAAU,KAAK,KACtBU,EAAWV,EAAU,KAAK,SAC1BW,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,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaH,CAAS,EAE/C,MAAMI,EAAYxB,EAChBiB,EACAP,EAAS,UACT,GACAT,EACAF,CACF,EACM0B,EAAUzB,EACdiB,EACAN,EAAU,UACV,GACAV,EACAF,CACF,EAEA,UAAW2B,KAAeH,EAAI,aAAc,CAE1C,MAAMI,EAAMJ,EAAI,YAAYG,EAAY,cAAc,EACtDpB,EAAOqB,EAAI,OAAO1B,CAAgB,CAAC,EAAE,KAAK,EAAI,EAG9CK,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDF,CACF,CACF,EAAE,KAAK,EAAI,EACXlB,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OAAOT,CAAI,CACtE,EAAE,KAAK,EAAI,EACXX,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDD,CACF,CACF,EAAE,KAAK,EAAI,EAGXnB,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDhB,EAAS,SACX,CACF,EAAE,KAAK,EAAI,CACb,CACF,CAAC,EAEDH,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVmB,EAAW,IACXC,EAAM,EAGNR,EAAMP,EAAI,+BACdF,EACAC,EACAe,EACAC,CACF,EACMP,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaM,CAAG,EAEzC,UAAWH,KAAeH,EAAI,aAAc,CAE1C,MAAMI,EAAMJ,EAAI,YAAYG,EAAY,cAAc,EACtDpB,EAAOqB,EAAI,OAAOvB,EAAc,SAAS,CAAC,EAAE,KAAK,EAAI,EAGrDE,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,SAAS,CACpE,EAAE,KAAKd,CAAW,EAClBN,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,SAAS,CACpE,EAAE,KAAKb,CAAY,CACrB,CACF,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "getAssociatedTokenAddressSync", "TOKEN_PROGRAM_ID", "Keypair", "Message", "SystemProgram", "describe", "expect", "it", "COIN_DATA", "GenerateSolanaTransaction", "feePayer", "recipient", "feePayerKey", "recipientKey", "gen", "txA", "txB", "mint", "decimals", "amount", "transfers", "b64", "uint8Array", "msg", "sourceAta", "destAta", "instruction", "pid", "lamports", "ops"]
|
|
7
7
|
}
|
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`+n.map((t,r)=>`${r+1}) ${t}`).join(`
|
|
3
|
-
`))}}export{f as SolanaTransactionTypes,x as TransactionInspector};
|
|
1
|
+
import{ASSOCIATED_TOKEN_PROGRAM_ID as I,TOKEN_2022_PROGRAM_ID as g,TOKEN_PROGRAM_ID as K}from"@solana/spl-token";import{Connection as b,Transaction as x,TransactionInstruction as P,VersionedMessage as k,VersionedTransaction as S}from"@solana/web3.js";import{Buffer as p}from"buffer";import{DECODERS as L}from"../../app-binder/services/utils/transactionDecoders";var h=(r=>(r.STANDARD="Standard",r.SPL="SPL",r))(h||{});const R="https://api.mainnet-beta.solana.com/",D=c=>new b(c,{commitment:"confirmed"}),m=c=>!!c&&(c.equals(I)||c.equals(K)||c.equals(g));class N{constructor(n,r,t,o){this.rawTransactionBytes=n;this.tokenAddress=r;this.createATA=t;this.injectedRPCURL=o}async inspectTransactionType(){try{const n=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA)return{transactionType:n.compiledInstructions.some(a=>m(n.allKeys[a.programIdIndex]))?"SPL":"Standard",data:{...this.tokenAddress?{tokenAddress:this.tokenAddress}:{},...this.createATA?{createATA:this.createATA}:{}}};let r=!1,t={};for(const o of n.compiledInstructions){const a=n.allKeys[o.programIdIndex];if(!a)continue;m(a)&&(r=!0);const u=o.accountKeyIndexes.map(e=>n.allKeys[e]).filter(e=>!!e),d=new P({programId:a,keys:u.map(e=>({pubkey:e,isSigner:!1,isWritable:!1})),data:p.from(o.data)}),l={programId:a,ixMeta:o,message:n,instruction:d};for(const e of L){if(!e.when(l))continue;const s=e.decode(l);s&&(s.createATA&&!t.createATA?t={...t,createATA:s.createATA}:s.tokenAddress&&!t.tokenAddress&&!t.createATA&&(t={...t,tokenAddress:s.tokenAddress}))}}return t.createATA?{transactionType:"SPL",data:t}:t.tokenAddress?{transactionType:"SPL",data:t}:r?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(n){const r=this.tryDeserialiseVersioned(n);if(r){const e=r.message,s=await this.resolveLookedUpAddressesFromMessage(e),A=[...e.staticAccountKeys,...s?.writable??[],...s?.readonly??[]];return{compiledInstructions:e.compiledInstructions.map(i=>{const f=i,T=Array.from(f.accounts??i.accountKeyIndexes??[]);let y;return i.data instanceof Uint8Array?y=i.data:typeof i.data=="string"?y=p.from(i.data,"base64"):y=Uint8Array.from(i.data??[]),{programIdIndex:i.programIdIndex,accountKeyIndexes:T,data:y}}),allKeys:A}}const t=x.from(n),o=new Map,a=e=>{if(!e)return;const s=e.toBase58();o.has(s)||o.set(s,e)};a(t.feePayer??null);for(const e of t.instructions){a(e.programId);for(const s of e.keys)a(s.pubkey)}const u=Array.from(o.values()),d=new Map(u.map((e,s)=>[e.toBase58(),s]));return{compiledInstructions:t.instructions.map(e=>({programIdIndex:d.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(s=>d.get(s.pubkey.toBase58())??-1),data:e.data})),allKeys:u}}tryDeserialiseVersioned(n){try{return S.deserialize(n)}catch{try{return{message:k.deserialize(n)}}catch{return null}}}async resolveLookedUpAddressesFromMessage(n){const r=n.addressTableLookups??[];if(!r.length)return;const t=[],o=[];for(const a of r){const d=(await D(this.injectedRPCURL||R).getAddressLookupTable(a.accountKey)).value;if(!d)continue;const l=d.state.addresses;for(const e of a.writableIndexes??[]){const s=l[e];s&&t.push(s)}for(const e of a.readonlyIndexes??[]){const s=l[e];s&&o.push(s)}}return{writable:t,readonly:o}}}export{h as SolanaTransactionTypes,N as TransactionInspector};
|
|
4
2
|
//# sourceMappingURL=TransactionInspector.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n
|
|
5
|
-
"mappings": "AAAA,OACE,
|
|
6
|
-
"names": ["
|
|
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": ["ASSOCIATED_TOKEN_PROGRAM_ID", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Connection", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "DECODERS", "SolanaTransactionTypes", "RPC_URL", "defaultConnection", "rpcUrl", "isSPLProgramId", "pid", "TransactionInspector", "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
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createInitializeAccountInstruction as
|
|
1
|
+
import{ASSOCIATED_TOKEN_PROGRAM_ID as A,createAssociatedTokenAccountInstruction as w,createCloseAccountInstruction as m,createInitializeAccount2Instruction as S,createInitializeAccount3Instruction as f,createInitializeAccountInstruction as P,createSyncNativeInstruction as k,createTransferCheckedInstruction as I,createTransferInstruction as g,getAssociatedTokenAddressSync as b,TOKEN_2022_PROGRAM_ID as B,TOKEN_PROGRAM_ID as l}from"@solana/spl-token";import{Keypair as t,SystemProgram as L,Transaction as h,TransactionInstruction as E}from"@solana/web3.js";import{describe as v,expect as r,it as u}from"vitest";import{DefaultBs58Encoder as D}from"../../app-binder/services/bs58Encoder";import{SolanaTransactionTypes as d,TransactionInspector as p}from"./TransactionInspector";const O=D.encode(new Uint8Array(32).fill(170));function y(e,n,a){const s=a??n[0]??t.generate(),c=new h;c.recentBlockhash=O,c.feePayer=s.publicKey,c.add(...e);const o=new Set,i=[s,...n].filter(T=>{const K=T.publicKey.toBase58();return o.has(K)?!1:(o.add(K),!0)});return c.sign(...i),{raw:c.serialize(),payer:s}}v("TransactionInspector",()=>{u("falls back to STANDARD for a plain SystemProgram transfer",async()=>{const e=t.generate(),n=t.generate().publicKey,a=L.transfer({fromPubkey:e.publicKey,toPubkey:n,lamports:1e3}),{raw:s}=y([a],[e],e),c=await new p(s).inspectTransactionType();r(c.transactionType).toBe(d.STANDARD),r(c.data).toEqual({})}),u("detects an SPL Transfer and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,42n,[],l),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(a.toBase58())}),u("detects an SPL TransferChecked and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=I(a,n,s,e.publicKey,123n,0,[],l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(s.toBase58())}),u("detects InitializeAccount and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=P(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount2 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=S(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount3 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=f(a,n,l),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,B,A),c=w(e.publicKey,s,n,a,B,A),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects CloseAccount and returns the closed token account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=m(n,a,e.publicKey),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(n.toBase58())}),u("detects SyncNative and returns the WSOL account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=k(n,l),{raw:s}=y([a],[e],e),c=await new p(s).inspectTransactionType();r(c.transactionType).toBe(d.SPL),r(c.data.tokenAddress).toBe(n.toBase58())}),u("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const e=t.generate(),n=new E({programId:l,keys:[],data:Buffer.from([])}),{raw:a}=y([n],[e],e),s=await new p(a).inspectTransactionType();r(s.transactionType).toBe(d.SPL),r(s.data).toEqual({})}),u("falls back to STANDARD if the payload is unparseable",async()=>{const e=new Uint8Array([171,173,190,239]),n=await new p(e).inspectTransactionType();r(n.transactionType).toBe(d.STANDARD),r(n.data).toEqual({})}),u("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,1n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i=await new p(c,o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(o)}),u("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p(o,void 0,i).inspectTransactionType();r(T.transactionType).toBe(d.SPL),r(T.data.createATA).toEqual(i)}),u("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,7n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p(c,o,i).inspectTransactionType();r(T.transactionType).toBe(d.SPL),r(T.data.tokenAddress).toBe(o),r(T.data.createATA).toEqual(i)})});
|
|
2
2
|
//# sourceMappingURL=TransactionInspector.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n createInitializeAccountInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { Keypair, SystemProgram, Transaction } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(1));\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", () => {\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const tx = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n }),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const raw = tx.serialize();\n const result = new TransactionInspector(raw).inspectTransactionType();\n\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\", () => {\n const payer = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createTransferInstruction(\n source,\n destination,\n owner,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\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\", () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL InitializeAccount and returns the new ATA and mint\", () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\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(\"falls back to STANDARD if the payload is unparseable\", () => {\n const garbage = new Uint8Array([0, 1, 2, 3, 4, 5]);\n const result = new TransactionInspector(garbage).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OACE,
|
|
6
|
-
"names": ["createInitializeAccountInstruction", "createTransferCheckedInstruction", "createTransferInstruction", "TOKEN_PROGRAM_ID", "Keypair", "SystemProgram", "Transaction", "
|
|
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": ["ASSOCIATED_TOKEN_PROGRAM_ID", "createAssociatedTokenAccountInstruction", "createCloseAccountInstruction", "createInitializeAccount2Instruction", "createInitializeAccount3Instruction", "createInitializeAccountInstruction", "createSyncNativeInstruction", "createTransferCheckedInstruction", "createTransferInstruction", "getAssociatedTokenAddressSync", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Keypair", "SystemProgram", "Transaction", "TransactionInstruction", "describe", "expect", "it", "DefaultBs58Encoder", "SolanaTransactionTypes", "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
7
|
}
|
|
@@ -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": "AAAA,OAAOA,MAAU,OAOV,MAAMC,CAAmB,CAC9B,OAAO,OAAOC,EAA0B,CACtC,OAAOF,EAAK,OAAOE,CAAI,CACzB,CACA,OAAO,OAAOC,EAA6B,CACzC,OAAOH,EAAK,OAAOG,CAAO,CAC5B,CACF",
|
|
6
|
+
"names": ["bs58", "DefaultBs58Encoder", "data", "encoded"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ASSOCIATED_TOKEN_PROGRAM_ID as l,decodeBurnCheckedInstruction as p,decodeBurnInstruction as B,decodeCloseAccountInstruction as T,decodeFreezeAccountInstruction as h,decodeInitializeAccount2Instruction as f,decodeInitializeAccount3Instruction as w,decodeInitializeAccountInstruction as x,decodeInitializeImmutableOwnerInstruction as q,decodeSyncNativeInstruction as P,decodeThawAccountInstruction as C,decodeTransferCheckedInstruction as K,decodeTransferCheckedWithFeeInstruction as R,decodeTransferInstruction as O,getAssociatedTokenAddressSync as _,TOKEN_2022_PROGRAM_ID as u,TOKEN_PROGRAM_ID as i}from"@solana/spl-token";import{SystemProgram as z,SYSVAR_RENT_PUBKEY as N}from"@solana/web3.js";const c=e=>e.equals(i)||e.equals(u),o=e=>{try{return e()}catch{return null}},g=[{when:({programId:e})=>e.equals(l),decode:({ixMeta:e,message:s})=>{const n=e.accountKeyIndexes??[],d=t=>n[t]!==void 0?s.allKeys[n[t]]??null:null,a=d(1),r=d(3);if(!a||!r)return null;const y=n.map(t=>s.allKeys[t]).filter(t=>!!t),A=y.find(t=>t.equals(u))??y.find(t=>t.equals(i))??null,b=t=>t.equals(z.programId)||t.equals(i)||t.equals(u)||t.equals(l)||t.equals(N),I=y.filter(t=>!b(t)&&!t.equals(a)&&!t.equals(r)),k=(t,m)=>_(r,t,!0,m,l);if(A){for(const t of I)if(k(t,A).equals(a))return{createATA:{address:t.toBase58(),mintAddress:r.toBase58()}}}for(const t of I){if(k(t,i).equals(a))return{createATA:{address:t.toBase58(),mintAddress:r.toBase58()}};if(k(t,u).equals(a))return{createATA:{address:t.toBase58(),mintAddress:r.toBase58()}}}return null}},{when:({programId:e})=>e.equals(u),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{destination:n}}=R(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{destination:n}}=O(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{destination:n}}=K(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n,mint:d}}=x(e,s);return{createATA:{address:n.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n,mint:d}}=f(e,s);return{createATA:{address:n.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n,mint:d}}=w(e,s);return{createATA:{address:n.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=q(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=T(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=P(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=p(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=B(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=h(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=C(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>e.equals(l)||e.equals(i)||e.equals(u),decode:()=>null}];export{g as DECODERS};
|
|
2
|
+
//# sourceMappingURL=transactionDecoders.js.map
|