@ledgerhq/device-signer-kit-solana 0.0.0-device-id-20251125171501 → 0.0.0-dmk-lifi-20260106144650
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 +3 -0
- package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
- package/lib/cjs/api/SignerSolanaBuilder.js.map +3 -3
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
- package/lib/cjs/api/index.js +1 -1
- package/lib/cjs/api/index.js.map +2 -2
- package/lib/cjs/api/model/TransactionResolutionContext.js +1 -1
- package/lib/cjs/api/model/TransactionResolutionContext.js.map +3 -3
- package/lib/cjs/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
- package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
- package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.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 +3 -3
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/cjs/internal/di.js +1 -1
- package/lib/cjs/internal/di.js.map +3 -3
- package/lib/cjs/internal/externalTypes.js +1 -1
- package/lib/cjs/internal/externalTypes.js.map +2 -2
- package/lib/cjs/package.json +40 -36
- package/lib/esm/api/SignerSolanaBuilder.js +1 -1
- package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
- package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
- package/lib/esm/api/index.js +1 -1
- package/lib/esm/api/index.js.map +2 -2
- package/lib/esm/api/model/TransactionResolutionContext.js +1 -0
- package/lib/esm/api/model/TransactionResolutionContext.js.map +4 -4
- package/lib/esm/internal/DefaultSignerSolana.js.map +2 -2
- package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
- package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
- package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
- package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
- package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
- package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.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 +3 -3
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
- package/lib/esm/internal/di.js +1 -1
- package/lib/esm/internal/di.js.map +3 -3
- package/lib/esm/internal/externalTypes.js +1 -1
- package/lib/esm/internal/externalTypes.js.map +2 -2
- package/lib/esm/package.json +40 -36
- package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +13 -2
- package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/api/index.d.ts +1 -0
- package/lib/types/api/index.d.ts.map +1 -1
- package/lib/types/api/model/TransactionResolutionContext.d.ts +7 -0
- package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -1
- package/lib/types/internal/DefaultSignerSolana.d.ts +3 -0
- package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +3 -2
- package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +29 -0
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts +2 -0
- package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts +2 -0
- package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +2 -2
- package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +7 -10
- package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts +8 -0
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts.map +1 -0
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts +2 -0
- package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +7 -10
- package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +14 -7
- package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
- package/lib/types/internal/di.d.ts.map +1 -1
- package/lib/types/internal/externalTypes.d.ts +1 -0
- package/lib/types/internal/externalTypes.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +34 -30
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
- package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
- package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +0 -14
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +0 -1
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +0 -2
- package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommandResultFactory } from \"@ledgerhq/device-management-kit\";\nimport { Maybe, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"./ProvideTransactionContextTask\";\n\ndescribe(\"ProvideSolanaTransactionContextTask\", () => {\n let fakeApi: { sendCommand: Mock };\n let context: SolanaContextForDevice;\n\n const dummyDescriptor = Uint8Array.from([0xaa, 0xaa, 0xaa]);\n const dummyCertificate: any = {\n payload: Uint8Array.from([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef]),\n };\n\n const mockError = { _tag: \"SomeError\", errorCode: 0, message: \"SomeError\" };\n\n beforeEach(() => {\n vi.resetAllMocks();\n fakeApi = {\n sendCommand: vi.fn(),\n };\n context = {\n descriptor: dummyDescriptor,\n certificate: dummyCertificate,\n };\n });\n\n it(\"returns Nothing when both commands succeed\", async () => {\n // given\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n fakeApi.sendCommand.mockResolvedValue(successResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n\n const firstCallCall = fakeApi.sendCommand.mock.calls[0];\n expect(firstCallCall).toBeDefined();\n const firstCallArg = firstCallCall![0];\n expect(firstCallArg).toBeInstanceOf(ProvideTrustedNamePKICommand);\n expect(\n (firstCallArg as ProvideTrustedNamePKICommand).args.pkiBlob,\n ).toStrictEqual(dummyCertificate.payload);\n\n const secondCallArg = fakeApi.sendCommand.mock.calls[1]![0]!;\n expect(secondCallArg).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(\n (secondCallArg as ProvideTLVDescriptorCommand).args.payload,\n ).toStrictEqual(dummyDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws error if PKI command fails\", async () => {\n const errorResult = CommandResultFactory({ error: mockError });\n fakeApi.sendCommand.mockResolvedValueOnce(errorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(errorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"throws error if TLV command fails\", async () => {\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n const tlvErrorResult = CommandResultFactory({ error: mockError });\n\n fakeApi.sendCommand\n .mockResolvedValueOnce(successResult)\n .mockResolvedValueOnce(tlvErrorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(tlvErrorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n });\n});\n"],
|
|
5
|
-
"mappings": "aAGA,IAAAA,EAAqC,2CACrCC,EAA+B,qBAC/BC,EAAgE,kBAEhEC,EAA4C,oEAC5CC,EAA6C,qEAE7CC,EAGO,8CAEP,YAAS,sCAAuC,IAAM,CACpD,IAAIC,EACAC,EAEJ,MAAMC,EAAkB,WAAW,KAAK,CAAC,IAAM,IAAM,GAAI,CAAC,EACpDC,EAAwB,CAC5B,QAAS,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAI,CAAC,CAC3E,EAEMC,EAAY,CAAE,KAAM,YAAa,UAAW,EAAG,QAAS,WAAY,KAE1E,cAAW,IAAM,CACf,KAAG,cAAc,EACjBJ,EAAU,CACR,YAAa,KAAG,GAAG,CACrB,EACAC,EAAU,CACR,WAAYC,EACZ,YAAaC,CACf,CACF,CAAC,KAED,MAAG,6CAA8C,SAAY,CAE3D,MAAME,KAAgB,wBAAqB,CAAE,KAAM,QAAM,GAAG,IAAI,CAAE,CAAC,EACnEL,EAAQ,YAAY,kBAAkBK,CAAa,EAQnD,MAAMC,EAAS,MANF,IAAI,sCACfN,EACAC,CACF,EAG0B,IAAI,KAG9B,UAAOD,EAAQ,WAAW,EAAE,sBAAsB,CAAC,EAEnD,MAAMO,EAAgBP,EAAQ,YAAY,KAAK,MAAM,CAAC,KACtD,UAAOO,CAAa,EAAE,YAAY,EAClC,MAAMC,EAAeD,EAAe,CAAC,KACrC,UAAOC,CAAY,EAAE,eAAe,8BAA4B,KAChE,UACGA,EAA8C,KAAK,OACtD,EAAE,cAAcL,EAAiB,OAAO,EAExC,MAAMM,EAAgBT,EAAQ,YAAY,KAAK,MAAM,CAAC,EAAG,CAAC,KAC1D,UAAOS,CAAa,EAAE,eAAe,6BAA2B,KAChE,UACGA,EAA8C,KAAK,OACtD,EAAE,cAAcP,CAAe,KAE/B,UAAOI,CAAM,EAAE,cAAc,SAAO,CACtC,CAAC,KAED,MAAG,oCAAqC,SAAY,CAClD,MAAMI,KAAc,wBAAqB,CAAE,MAAON,CAAU,CAAC,EAC7DJ,EAAQ,YAAY,sBAAsBU,CAAW,EAErD,MAAMC,EAAO,IAAI,sCACfX,EACAC,CACF,EAEA,QAAM,UAAOU,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKD,CAAW,KACjD,UAAOV,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,KAED,MAAG,oCAAqC,SAAY,CAClD,MAAMK,KAAgB,wBAAqB,CAAE,KAAM,QAAM,GAAG,IAAI,CAAE,CAAC,EAC7DO,KAAiB,wBAAqB,CAAE,MAAOR,CAAU,CAAC,EAEhEJ,EAAQ,YACL,sBAAsBK,CAAa,EACnC,sBAAsBO,CAAc,EAEvC,MAAMD,EAAO,IAAI,sCACfX,EACAC,CACF,EAEA,QAAM,UAAOU,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKC,CAAc,KACpD,UAAOZ,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,CACH,CAAC",
|
|
6
|
-
"names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ProvideTLVDescriptorCommand", "
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/require-await */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n\nimport { SolanaContextTypes } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n LoadCertificateCommand,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { Buffer } from \"buffer\";\nimport { Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTLVTransactionInstructionDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand\";\nimport { DefaultSolanaMessageNormaliser } from \"@internal/app-binder/services/utils/DefaultSolanaMessageNormaliser\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n SWAP_MODE,\n} from \"./ProvideTransactionContextTask\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawLegacy(\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 uniq = [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 tx.sign(...uniq);\n return { raw: tx.serialize(), payer };\n}\n\nfunction makeSignedRawV0(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const messageV0 = new TransactionMessage({\n payerKey: payer.publicKey,\n recentBlockhash: DUMMY_BLOCKHASH,\n instructions: ixs,\n }).compileToV0Message(); // no ALTs -> offline-safe\n\n const vtx = new VersionedTransaction(messageV0);\n vtx.sign([payer, ...signers]);\n return { raw: vtx.serialize(), payer };\n}\n\nconst makeKey = (base58: string) => ({ toBase58: () => base58 });\n\nconst buildNormaliser = (message: any) =>\n ({\n normaliseMessage: vi.fn(async () => message),\n }) as const;\n\ndescribe(\"ProvideSolanaTransactionContextTask (merged)\", () => {\n let api: { sendCommand: Mock };\n const success = CommandResultFactory({ data: undefined });\n\n const baseCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 1,\n } as const;\n const tlvDescriptor = new Uint8Array([0xaa, 0xbb, 0xcc]);\n\n const tokenCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 2,\n } as const;\n\n const tokenDescriptor = {\n data: \"f0cacc1a\",\n signature: \"01020304\",\n } as const;\n\n const SIG = \"f0cacc1a\";\n\n const dmkLoggerFactoryMock: (tag: string) => LoggerPublisherService = vi.fn(\n () =>\n ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n }) as any,\n );\n\n beforeEach(() => {\n vi.resetAllMocks();\n api = {\n sendCommand: vi.fn(),\n };\n });\n\n // basic context\n describe(\"basic context\", () => {\n it(\"sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // LoadCertificateCommand (trusted name PKI)\n .mockResolvedValueOnce(success); // ProvideTLVDescriptorCommand\n\n const args = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xf0]), // unused in this path\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n args as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n\n const first = api.sendCommand.mock.calls[0]![0]!;\n expect(first).toBeInstanceOf(LoadCertificateCommand);\n expect(first.args.certificate).toStrictEqual(baseCert.payload);\n expect(first.args.keyUsage).toBe(baseCert.keyUsageNumber);\n\n const second = api.sendCommand.mock.calls[1]![0]!;\n expect(second).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(second.args.payload).toStrictEqual(tlvDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand\", async () => {\n // given\n api.sendCommand.mockRejectedValueOnce(new Error(\"oupsy\"));\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xca]),\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"oupsy\");\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)\", async () => {\n // given: include an ERROR loader which should be ignored\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n { type: SolanaContextTypes.ERROR, error: { message: \"err\" } as any },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n });\n });\n\n // basic context + token metadata\n\n describe(\"basic context + token\", () => {\n it(\"when token metadata present, sends token certificate then TLV transaction-instruction descriptor\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI certificate\n .mockResolvedValueOnce(success) // TLV descriptor\n .mockResolvedValueOnce(success) // token metadata certificate\n .mockResolvedValueOnce(success); // token descriptor via TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: tokenDescriptor,\n },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]), // unused in this path\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n expect(third.args.certificate).toStrictEqual(tokenCert.payload);\n expect(third.args.keyUsage).toBe(tokenCert.keyUsageNumber);\n\n const fourth = api.sendCommand.mock.calls[3]![0]!;\n expect(fourth).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(fourth.args.kind).toBe(\"descriptor\");\n expect(fourth.args.dataHex).toBe(tokenDescriptor.data);\n expect(fourth.args.signatureHex).toBe(tokenDescriptor.signature);\n expect(fourth.args.isFirstMessage).toBe(true);\n expect(fourth.args.swapSignatureTag).toBe(false);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token payload is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: undefined,\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token certificate is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: undefined,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws a mapped error when sending token certificate returns a CommandErrorResult\", async () => {\n // given\n const errorResult = CommandResultFactory({\n error: { _tag: \"SomeError\", errorCode: 0x6a80, message: \"bad\" },\n });\n\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(errorResult); // token certificate -> error\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when + then\n await expect(task.run()).rejects.toThrow(\n \"[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required\",\n );\n\n // ensure the TLVTransactionInstructionDescriptor was NOT attempted\n expect(api.sendCommand).toHaveBeenCalledTimes(3);\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n });\n\n it(\"does not send swap APDUs when SOLANA_LIFI context is missing (token present)\", async () => {\n // given: base + token succeed, but no LIFI in loadersResults\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success); // token TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n // no SOLANA_LIFI entry\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n normaliser: { normaliseMessage: vi.fn() } as any,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token only\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n expect(api.sendCommand.mock.calls[2]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n const tokenCmd = api.sendCommand.mock.calls[3]![0]!;\n expect(tokenCmd).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(tokenCmd.args.swapSignatureTag).toBe(false);\n expect(tokenCmd.args.isFirstMessage).toBe(true);\n });\n });\n\n // basic context + token + lifi (swap)\n describe(\"basic context + token + lifi\", () => {\n it(\"sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 },\n { programIdIndex: 1 },\n { programIdIndex: 2 },\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n normaliser: normaliser as any,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.dataHex).toBe(SIG);\n expect(c2.args.signatureHex).toBe(SIG);\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n\n expect((normaliser as any).normaliseMessage).toHaveBeenCalledOnce();\n });\n\n it(\"sends empty when descriptor exists but signatures[SWAP_MODE] is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"ONLY_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n ONLY_PID: {\n data: SIG,\n signatures: {\n // no [SWAP_MODE] key\n },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n normaliser: normaliser as any,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"sends empty when programId is missing for an instruction\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 5 }], // out-of-range\n allKeys: [makeKey(\"X\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n { type: SolanaContextTypes.SOLANA_LIFI, payload: {} },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n normaliser: normaliser as any,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValueOnce(success) // 1st swap ok\n .mockRejectedValueOnce(new Error(\"err\")); // 2nd swap fails\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 }, // descriptor\n { programIdIndex: 1 }, // empty -> rejects\n { programIdIndex: 2 }, // not reached\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n normaliser: normaliser as any,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"err\");\n // 2 base + 2 token + 2 swap (failed on 2nd)\n expect(api.sendCommand).toHaveBeenCalledTimes(6);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n });\n\n it(\"uses signatures[SWAP_MODE] specifically when present\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"SIG_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n SIG_PID: {\n data: SIG,\n signatures: { prod: \"deadbeef\", [SWAP_MODE]: SIG },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n normaliser: normaliser as any,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const dest1 = Keypair.generate().publicKey;\n const ix1 = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest1,\n lamports: 1234,\n });\n\n const owner = Keypair.generate();\n const srcToken = Keypair.generate().publicKey;\n const dstToken = Keypair.generate().publicKey;\n const ix2 = createTransferInstruction(\n srcToken,\n dstToken,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const ix3 = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hi\"),\n });\n\n const { raw } = makeSignedRawLegacy(\n [ix1, ix2, ix3],\n [payer, owner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const MEMO_PID = MEMO_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Tokenkeg missing -> empty\n [MEMO_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n normaliser: DefaultSolanaMessageNormaliser,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 5_678,\n });\n\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 const ataIx = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const memoIx = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hello\"),\n });\n\n // IMPORTANT: sign only with the payer (no PublicKey in signers array)\n const { raw } = makeSignedRawV0([sysIx, ataIx, memoIx], [], payer);\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Memo intentionally missing -> empty\n },\n },\n ];\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n normaliser: DefaultSolanaMessageNormaliser,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n );\n\n const res = await task.run();\n\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Memo missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const payer = Keypair.generate();\n\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 7_777,\n });\n\n const tokenOwner = Keypair.generate(); // owner of the source SPL token account (signer)\n const mint = Keypair.generate().publicKey;\n\n const recipientOwner = Keypair.generate().publicKey; // unfunded account (no ATA yet)\n const recipientATA = getAssociatedTokenAddressSync(\n mint,\n recipientOwner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const createAtaIx = createAssociatedTokenAccountInstruction(\n payer.publicKey, // funder\n recipientATA, // ata to be created\n recipientOwner, // owner of the ATA\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const srcTokenAcc = Keypair.generate().publicKey; // pretend this is an existing token account\n const transferIx = createTransferInstruction(\n srcTokenAcc,\n recipientATA,\n tokenOwner.publicKey, // authority of srcTokenAcc (we will sign with tokenOwner)\n 9n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n // sign v0 with payer + tokenOwner (NO PublicKey objects in the signers array)\n const { raw } = makeSignedRawV0(\n [sysIx, createAtaIx, transferIx],\n [tokenOwner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Token Program intentionally missing -> \"empty\"\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n normaliser: DefaultSolanaMessageNormaliser,\n loggerFactory: dmkLoggerFactoryMock,\n };\n\n // when\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n );\n\n const res = await task.run();\n\n // then\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Token Program missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_context_module", "import_device_management_kit", "import_spl_token", "import_web3", "import_bs58", "import_buffer", "import_purify_ts", "import_vitest", "import_ProvideTLVDescriptorCommand", "import_ProvideTLVTransactionInstructionDescriptorCommand", "import_DefaultSolanaMessageNormaliser", "import_ProvideTransactionContextTask", "DUMMY_BLOCKHASH", "bs58", "makeSignedRawLegacy", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniq", "kp", "k", "makeSignedRawV0", "messageV0", "vtx", "makeKey", "base58", "buildNormaliser", "message", "api", "success", "baseCert", "tlvDescriptor", "tokenCert", "tokenDescriptor", "SIG", "dmkLoggerFactoryMock", "args", "result", "first", "second", "context", "task", "loadersResults", "third", "fourth", "errorResult", "tokenCmd", "normaliser", "c0", "c1", "c2", "dest1", "ix1", "owner", "srcToken", "dstToken", "ix2", "MEMO_PROGRAM_ID", "ix3", "raw", "SYSTEM_PID", "MEMO_PID", "sysDest", "sysIx", "mint", "ata", "ataIx", "memoIx", "ATA_PID", "res", "tokenOwner", "recipientOwner", "recipientATA", "createAtaIx", "srcTokenAcc", "transferIx"]
|
|
7
7
|
}
|
package/lib/cjs/internal/di.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var
|
|
1
|
+
"use strict";var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var g=Object.prototype.hasOwnProperty;var l=(o,e)=>{for(var r in e)a(o,r,{get:e[r],enumerable:!0})},u=(o,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!g.call(o,n)&&n!==r&&a(o,n,{get:()=>e[n],enumerable:!(t=p(e,n))||t.enumerable});return o};var C=o=>u(a({},"__esModule",{value:!0}),o);var y={};l(y,{makeContainer:()=>M});module.exports=C(y);var s=require("inversify"),d=require("./app-binder/di/appBinderModule"),m=require("./use-cases/di/useCasesModule"),i=require("./externalTypes");const M=({dmk:o,sessionId:e,contextModule:r})=>{const t=new s.Container;return t.bind(i.externalTypes.Dmk).toConstantValue(o),t.bind(i.externalTypes.SessionId).toConstantValue(e),t.bind(i.externalTypes.ContextModule).toConstantValue(r),t.bind(i.externalTypes.DmkLoggerFactory).toConstantValue(n=>o.getLoggerFactory()(`SignerSolana-${n}`)),t.loadSync((0,d.appBinderModuleFactory)(),(0,m.useCasesModuleFactory)()),t};0&&(module.exports={makeContainer});
|
|
2
2
|
//# sourceMappingURL=di.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/di.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"./app-binder/di/appBinderModule\";\nimport { useCasesModuleFactory } from \"./use-cases/di/useCasesModule\";\nimport { externalTypes } from \"./externalTypes\";\n\nexport type MakeContainerProps = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\nexport const makeContainer = ({\n dmk,\n sessionId,\n contextModule,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container\n .bind<DeviceSessionId>(externalTypes.SessionId)\n .toConstantValue(sessionId);\n container\n .bind<ContextModule>(externalTypes.ContextModule)\n .toConstantValue(contextModule);\n\n container.loadSync(appBinderModuleFactory(), useCasesModuleFactory());\n\n return container;\n};\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,
|
|
6
|
-
"names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_appBinderModule", "import_useCasesModule", "import_externalTypes", "dmk", "sessionId", "contextModule", "container"]
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"./app-binder/di/appBinderModule\";\nimport { useCasesModuleFactory } from \"./use-cases/di/useCasesModule\";\nimport { externalTypes } from \"./externalTypes\";\n\nexport type MakeContainerProps = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport const makeContainer = ({\n dmk,\n sessionId,\n contextModule,\n}: MakeContainerProps) => {\n const container = new Container();\n\n container.bind<DeviceManagementKit>(externalTypes.Dmk).toConstantValue(dmk);\n container\n .bind<DeviceSessionId>(externalTypes.SessionId)\n .toConstantValue(sessionId);\n container\n .bind<ContextModule>(externalTypes.ContextModule)\n .toConstantValue(contextModule);\n\n container\n .bind<\n (tag: string) => LoggerPublisherService\n >(externalTypes.DmkLoggerFactory)\n .toConstantValue((tag: string) =>\n dmk.getLoggerFactory()(`SignerSolana-${tag}`),\n );\n\n container.loadSync(appBinderModuleFactory(), useCasesModuleFactory());\n\n return container;\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EAA0B,qBAE1BC,EAAuC,2CACvCC,EAAsC,yCACtCC,EAA8B,2BAQvB,MAAML,EAAgB,CAAC,CAC5B,IAAAM,EACA,UAAAC,EACA,cAAAC,CACF,IAA0B,CACxB,MAAMC,EAAY,IAAI,YAEtB,OAAAA,EAAU,KAA0B,gBAAc,GAAG,EAAE,gBAAgBH,CAAG,EAC1EG,EACG,KAAsB,gBAAc,SAAS,EAC7C,gBAAgBF,CAAS,EAC5BE,EACG,KAAoB,gBAAc,aAAa,EAC/C,gBAAgBD,CAAa,EAEhCC,EACG,KAEC,gBAAc,gBAAgB,EAC/B,gBAAiBC,GAChBJ,EAAI,iBAAiB,EAAE,gBAAgBI,CAAG,EAAE,CAC9C,EAEFD,EAAU,YAAS,0BAAuB,KAAG,yBAAsB,CAAC,EAE7DA,CACT",
|
|
6
|
+
"names": ["di_exports", "__export", "makeContainer", "__toCommonJS", "import_inversify", "import_appBinderModule", "import_useCasesModule", "import_externalTypes", "dmk", "sessionId", "contextModule", "container", "tag"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var n=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var S=(e,o)=>{for(var t in o)m(e,t,{get:o[t],enumerable:!0})},b=(e,o,t,l)=>{if(o&&typeof o=="object"||typeof o=="function")for(let r of n(o))!s.call(e,r)&&r!==t&&m(e,r,{get:()=>o[r],enumerable:!(l=y(o,r))||l.enumerable});return e};var d=e=>b(m({},"__esModule",{value:!0}),e);var g={};S(g,{externalTypes:()=>f});module.exports=d(g);const f={Dmk:Symbol.for("Dmk"),SessionId:Symbol.for("SessionId"),ContextModule:Symbol.for("ContextModule"),DmkLoggerFactory:Symbol.for("DmkLoggerFactory")};0&&(module.exports={externalTypes});
|
|
2
2
|
//# sourceMappingURL=externalTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/externalTypes.ts"],
|
|
4
|
-
"sourcesContent": ["export const externalTypes = {\n Dmk: Symbol.for(\"Dmk\"),\n SessionId: Symbol.for(\"SessionId\"),\n ContextModule: Symbol.for(\"ContextModule\"),\n};\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAgB,CAC3B,IAAK,OAAO,IAAI,KAAK,EACrB,UAAW,OAAO,IAAI,WAAW,EACjC,cAAe,OAAO,IAAI,eAAe,
|
|
4
|
+
"sourcesContent": ["export const externalTypes = {\n Dmk: Symbol.for(\"Dmk\"),\n SessionId: Symbol.for(\"SessionId\"),\n ContextModule: Symbol.for(\"ContextModule\"),\n DmkLoggerFactory: Symbol.for(\"DmkLoggerFactory\"),\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAgB,CAC3B,IAAK,OAAO,IAAI,KAAK,EACrB,UAAW,OAAO,IAAI,WAAW,EACjC,cAAe,OAAO,IAAI,eAAe,EACzC,iBAAkB,OAAO,IAAI,kBAAkB,CACjD",
|
|
6
6
|
"names": ["externalTypes_exports", "__export", "externalTypes", "__toCommonJS"]
|
|
7
7
|
}
|
package/lib/cjs/package.json
CHANGED
|
@@ -1,39 +1,4 @@
|
|
|
1
1
|
{
|
|
2
|
-
"name": "@ledgerhq/device-signer-kit-solana",
|
|
3
|
-
"version": "1.4.1",
|
|
4
|
-
"private": false,
|
|
5
|
-
"license": "Apache-2.0",
|
|
6
|
-
"exports": {
|
|
7
|
-
".": {
|
|
8
|
-
"types": "./lib/types/index.d.ts",
|
|
9
|
-
"import": "./lib/esm/index.js",
|
|
10
|
-
"require": "./lib/cjs/index.js"
|
|
11
|
-
},
|
|
12
|
-
"./*": {
|
|
13
|
-
"types": "./lib/types/*",
|
|
14
|
-
"import": "./lib/esm/*",
|
|
15
|
-
"require": "./lib/cjs/*"
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"files": [
|
|
19
|
-
"./lib"
|
|
20
|
-
],
|
|
21
|
-
"scripts": {
|
|
22
|
-
"prebuild": "rimraf lib",
|
|
23
|
-
"build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
24
|
-
"dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
|
|
25
|
-
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
26
|
-
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\"",
|
|
27
|
-
"lint": "eslint",
|
|
28
|
-
"lint:fix": "pnpm lint --fix",
|
|
29
|
-
"postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
|
|
30
|
-
"prettier": "prettier . --check",
|
|
31
|
-
"prettier:fix": "prettier . --write",
|
|
32
|
-
"typecheck": "tsc --noEmit",
|
|
33
|
-
"test": "vitest run",
|
|
34
|
-
"test:watch": "vitest",
|
|
35
|
-
"test:coverage": "vitest run --coverage"
|
|
36
|
-
},
|
|
37
2
|
"dependencies": {
|
|
38
3
|
"@ledgerhq/context-module": "workspace:*",
|
|
39
4
|
"@ledgerhq/signer-utils": "workspace:*",
|
|
@@ -58,7 +23,46 @@
|
|
|
58
23
|
"rxjs": "catalog:",
|
|
59
24
|
"ts-node": "catalog:"
|
|
60
25
|
},
|
|
26
|
+
"exports": {
|
|
27
|
+
".": {
|
|
28
|
+
"import": "./lib/esm/index.js",
|
|
29
|
+
"require": "./lib/cjs/index.js",
|
|
30
|
+
"types": "./lib/types/index.d.ts"
|
|
31
|
+
},
|
|
32
|
+
"./*": {
|
|
33
|
+
"import": "./lib/esm/*",
|
|
34
|
+
"require": "./lib/cjs/*",
|
|
35
|
+
"types": "./lib/types/*"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"./lib"
|
|
40
|
+
],
|
|
41
|
+
"license": "Apache-2.0",
|
|
42
|
+
"name": "@ledgerhq/device-signer-kit-solana",
|
|
61
43
|
"peerDependencies": {
|
|
62
44
|
"@ledgerhq/device-management-kit": "workspace:*"
|
|
63
|
-
}
|
|
45
|
+
},
|
|
46
|
+
"private": false,
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/LedgerHQ/device-sdk-ts.git"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "pnpm ldmk-tool build --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
53
|
+
"dev": "concurrently \"pnpm watch:builds\" \"pnpm watch:types\"",
|
|
54
|
+
"lint": "eslint",
|
|
55
|
+
"lint:fix": "pnpm lint --fix",
|
|
56
|
+
"postpack": "find . -name '*.tgz' -exec cp {} ../../../dist/ \\; ",
|
|
57
|
+
"prebuild": "rimraf lib",
|
|
58
|
+
"prettier": "prettier . --check",
|
|
59
|
+
"prettier:fix": "prettier . --write",
|
|
60
|
+
"test": "vitest run",
|
|
61
|
+
"test:coverage": "vitest run --coverage",
|
|
62
|
+
"test:watch": "vitest",
|
|
63
|
+
"typecheck": "tsc --noEmit",
|
|
64
|
+
"watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
65
|
+
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
66
|
+
},
|
|
67
|
+
"version": "0.0.0-dmk-lifi-20260106144650"
|
|
64
68
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ContextModuleBuilder as
|
|
1
|
+
import{ContextModuleBuilder as i}from"@ledgerhq/context-module";import{DefaultSignerSolana as n}from"../internal/DefaultSignerSolana";class u{_dmk;_sessionId;_customContextModule;_originToken;constructor({dmk:e,sessionId:t,originToken:o}){this._dmk=e,this._sessionId=t,this._originToken=o}withContextModule(e){return this._customContextModule=e,this}build(){return new n({dmk:this._dmk,sessionId:this._sessionId,contextModule:this._customContextModule??new i({originToken:this._originToken,loggerFactory:e=>this._dmk.getLoggerFactory()(`SignerSolanaContextModule-${e}`)}).build()})}}export{u as SignerSolanaBuilder};
|
|
2
2
|
//# sourceMappingURL=SignerSolanaBuilder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/SignerSolanaBuilder.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type ContextModule,\n ContextModuleBuilder,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultSignerSolana } from \"@internal/DefaultSignerSolana\";\n\ntype SignerSolanaBuilderConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n originToken?: string;\n};\n\n/**\n * Builder for the `SignerSolana` class.\n *\n * @example\n * ```\n * const signer = new SignerSolanaBuilder({ dmk, sessionId })\n * .build();\n * ```\n */\nexport class SignerSolanaBuilder {\n private _dmk: DeviceManagementKit;\n private _sessionId: DeviceSessionId;\n private _customContextModule: ContextModule | undefined;\n private _originToken: string | undefined;\n\n constructor({\n dmk,\n sessionId,\n originToken,\n }: SignerSolanaBuilderConstructorArgs) {\n this._dmk = dmk;\n this._sessionId = sessionId;\n this._originToken = originToken;\n }\n\n /**\n * Override the default context module\n *\n * @param contextModule\n * @returns this\n */\n withContextModule(contextModule: ContextModule) {\n this._customContextModule = contextModule;\n return this;\n }\n\n /**\n * Build the solana signer\n *\n * @returns the solana signer\n */\n public build() {\n return new DefaultSignerSolana({\n dmk: this._dmk,\n sessionId: this._sessionId,\n contextModule:\n this._customContextModule ??\n new ContextModuleBuilder({
|
|
5
|
-
"mappings": "AAAA,OAEE,wBAAAA,MACK,2BAMP,OAAS,uBAAAC,MAA2B,gCAiB7B,MAAMC,CAAoB,CACvB,KACA,WACA,qBACA,aAER,YAAY,CACV,IAAAC,EACA,UAAAC,EACA,YAAAC,CACF,EAAuC,CACrC,KAAK,KAAOF,EACZ,KAAK,WAAaC,EAClB,KAAK,aAAeC,CACtB,CAQA,kBAAkBC,EAA8B,CAC9C,YAAK,qBAAuBA,EACrB,IACT,CAOO,OAAQ,CACb,OAAO,IAAIL,EAAoB,CAC7B,IAAK,KAAK,KACV,UAAW,KAAK,WAChB,cACE,KAAK,sBACL,IAAID,EAAqB,
|
|
6
|
-
"names": ["ContextModuleBuilder", "DefaultSignerSolana", "SignerSolanaBuilder", "dmk", "sessionId", "originToken", "contextModule"]
|
|
4
|
+
"sourcesContent": ["import {\n type ContextModule,\n ContextModuleBuilder,\n} from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { DefaultSignerSolana } from \"@internal/DefaultSignerSolana\";\n\ntype SignerSolanaBuilderConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n originToken?: string;\n};\n\n/**\n * Builder for the `SignerSolana` class.\n *\n * @example\n * ```\n * const signer = new SignerSolanaBuilder({ dmk, sessionId })\n * .build();\n * ```\n */\nexport class SignerSolanaBuilder {\n private _dmk: DeviceManagementKit;\n private _sessionId: DeviceSessionId;\n private _customContextModule: ContextModule | undefined;\n private _originToken: string | undefined;\n\n constructor({\n dmk,\n sessionId,\n originToken,\n }: SignerSolanaBuilderConstructorArgs) {\n this._dmk = dmk;\n this._sessionId = sessionId;\n this._originToken = originToken;\n }\n\n /**\n * Override the default context module\n *\n * @param contextModule\n * @returns this\n */\n withContextModule(contextModule: ContextModule) {\n this._customContextModule = contextModule;\n return this;\n }\n\n /**\n * Build the solana signer\n *\n * @returns the solana signer\n */\n public build() {\n return new DefaultSignerSolana({\n dmk: this._dmk,\n sessionId: this._sessionId,\n contextModule:\n this._customContextModule ??\n new ContextModuleBuilder({\n originToken: this._originToken,\n loggerFactory: (tag: string) =>\n this._dmk.getLoggerFactory()(`SignerSolanaContextModule-${tag}`),\n }).build(),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,wBAAAA,MACK,2BAMP,OAAS,uBAAAC,MAA2B,gCAiB7B,MAAMC,CAAoB,CACvB,KACA,WACA,qBACA,aAER,YAAY,CACV,IAAAC,EACA,UAAAC,EACA,YAAAC,CACF,EAAuC,CACrC,KAAK,KAAOF,EACZ,KAAK,WAAaC,EAClB,KAAK,aAAeC,CACtB,CAQA,kBAAkBC,EAA8B,CAC9C,YAAK,qBAAuBA,EACrB,IACT,CAOO,OAAQ,CACb,OAAO,IAAIL,EAAoB,CAC7B,IAAK,KAAK,KACV,UAAW,KAAK,WAChB,cACE,KAAK,sBACL,IAAID,EAAqB,CACvB,YAAa,KAAK,aAClB,cAAgBO,GACd,KAAK,KAAK,iBAAiB,EAAE,6BAA6BA,CAAG,EAAE,CACnE,CAAC,EAAE,MAAM,CACb,CAAC,CACH,CACF",
|
|
6
|
+
"names": ["ContextModuleBuilder", "DefaultSignerSolana", "SignerSolanaBuilder", "dmk", "sessionId", "originToken", "contextModule", "tag"]
|
|
7
7
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
+
const t=Object.freeze({OPEN_APP:"signer.sol.steps.openApp",GET_APP_CONFIG:"signer.sol.steps.getAppConfig",INSPECT_TRANSACTION:"signer.sol.steps.inspectTransaction",BUILD_TRANSACTION_CONTEXT:"signer.sol.steps.buildTransactionContext",PROVIDE_TRANSACTION_CONTEXT:"signer.sol.steps.provideTransactionContext",SIGN_TRANSACTION:"signer.sol.steps.signTransaction"});export{t as signTransactionDAStateSteps};
|
|
1
2
|
//# sourceMappingURL=SignTransactionDeviceActionTypes.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../../../src/api/app-binder/SignTransactionDeviceActionTypes.ts"],
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type LoggerPublisherService,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport const signTransactionDAStateSteps = Object.freeze({\n OPEN_APP: \"signer.sol.steps.openApp\",\n GET_APP_CONFIG: \"signer.sol.steps.getAppConfig\",\n INSPECT_TRANSACTION: \"signer.sol.steps.inspectTransaction\",\n BUILD_TRANSACTION_CONTEXT: \"signer.sol.steps.buildTransactionContext\",\n PROVIDE_TRANSACTION_CONTEXT: \"signer.sol.steps.provideTransactionContext\",\n SIGN_TRANSACTION: \"signer.sol.steps.signTransaction\",\n} as const);\n\nexport type SignTransactionDAStateStep =\n (typeof signTransactionDAStateSteps)[keyof typeof signTransactionDAStateSteps];\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly loggerFactory: (tag: string) => LoggerPublisherService;\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly contextModule: ContextModule;\n readonly transactionOptions?: SolanaTransactionOptionalConfig;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n step: SignTransactionDAStateStep;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
|
|
5
|
+
"mappings": "AAmBO,MAAMA,EAA8B,OAAO,OAAO,CACvD,SAAU,2BACV,eAAgB,gCAChB,oBAAqB,sCACrB,0BAA2B,2CAC3B,4BAA6B,6CAC7B,iBAAkB,kCACpB,CAAU",
|
|
6
|
+
"names": ["signTransactionDAStateSteps"]
|
|
7
7
|
}
|
package/lib/esm/api/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{SignerSolanaBuilder as
|
|
1
|
+
import{SignerSolanaBuilder as n}from"./SignerSolanaBuilder";import{SolanaToolsBuilder as a}from"./SolanaToolsBuilder";export{n as SignerSolanaBuilder,a as SolanaToolsBuilder};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/lib/esm/api/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/api/index.ts"],
|
|
4
|
-
"sourcesContent": ["export type {\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue,\n GenerateTransactionDAOutput,\n GenerateTransactionDAReturnType,\n} from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nexport type {\n GetAddressDAError,\n GetAddressDAIntermediateValue,\n GetAddressDAOutput,\n GetAddressDAReturnType,\n} from \"@api/app-binder/GetAddressDeviceActionTypes\";\nexport type {\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue,\n GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nexport type {\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAOutput,\n} from \"@api/app-binder/SignMessageDeviceActionTypes\";\nexport type {\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAOutput,\n SignTransactionDAReturnType,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nexport type { Signature } from \"@api/model/Signature\";\nexport type { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nexport type { Transaction } from \"@api/model/Transaction\";\nexport type { SignerSolana } from \"@api/SignerSolana\";\nexport { SignerSolanaBuilder } from \"@api/SignerSolanaBuilder\";\nexport type { SolanaTools } from \"@api/SolanaTools\";\nexport { SolanaToolsBuilder } from \"@api/SolanaToolsBuilder\";\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["export type {\n GenerateTransactionDAError,\n GenerateTransactionDAIntermediateValue,\n GenerateTransactionDAOutput,\n GenerateTransactionDAReturnType,\n} from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nexport type {\n GetAddressDAError,\n GetAddressDAIntermediateValue,\n GetAddressDAOutput,\n GetAddressDAReturnType,\n} from \"@api/app-binder/GetAddressDeviceActionTypes\";\nexport type {\n GetAppConfigurationDAError,\n GetAppConfigurationDAIntermediateValue,\n GetAppConfigurationDAOutput,\n} from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nexport type {\n SignMessageDAError,\n SignMessageDAIntermediateValue,\n SignMessageDAOutput,\n} from \"@api/app-binder/SignMessageDeviceActionTypes\";\nexport type {\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAOutput,\n SignTransactionDAReturnType,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nexport type { Signature } from \"@api/model/Signature\";\nexport type { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nexport type { Transaction } from \"@api/model/Transaction\";\nexport type {\n TransactionResolutionContext,\n UserInputType,\n} from \"@api/model/TransactionResolutionContext\";\nexport type { SignerSolana } from \"@api/SignerSolana\";\nexport { SignerSolanaBuilder } from \"@api/SignerSolanaBuilder\";\nexport type { SolanaTools } from \"@api/SolanaTools\";\nexport { SolanaToolsBuilder } from \"@api/SolanaToolsBuilder\";\n"],
|
|
5
|
+
"mappings": "AAoCA,OAAS,uBAAAA,MAA2B,2BAEpC,OAAS,sBAAAC,MAA0B",
|
|
6
6
|
"names": ["SignerSolanaBuilder", "SolanaToolsBuilder"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [],
|
|
4
|
-
"sourcesContent": [],
|
|
5
|
-
"mappings": "",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../../../src/api/model/TransactionResolutionContext.ts"],
|
|
4
|
+
"sourcesContent": ["export type TransactionResolutionContext = {\n tokenAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n tokenInternalId?: string;\n templateId?: string;\n userInputType?: UserInputType;\n};\n\nexport enum UserInputType {\n SOL = \"sol\",\n ATA = \"ata\",\n}\n"],
|
|
5
|
+
"mappings": "AAWO,IAAKA,OACVA,EAAA,IAAM,MACNA,EAAA,IAAM,MAFIA,OAAA",
|
|
6
|
+
"names": ["UserInputType"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/internal/DefaultSignerSolana.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n /**\n * ## signTransaction\n * #### Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction.\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **options** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **solanaRPCURL** `string`\n * RPC endpoint to use if `transactionResolutionContext` is not provided\n * and parsing requires network lookups.\n * In browser environments, use a CORS-enabled RPC URL.\n * Defaults to: `\"https://api.mainnet-beta.solana.com/\"`.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed transaction bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignTransactionDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signTransaction(\"m/44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: resolution,\n * });\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * ## signMessage\n * #### Securely sign an arbitrary message on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing.\n *\n * - **message** `string (hex-encoded)`\n * The message to sign, provided as a hex string.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignMessageDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed message bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignMessageDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signMessage(\n * \"m/44'/501'/0'/0'\",\n * \"48656c6c6f20576f726c64\" // hex string\n * );\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * ## getAddress\n * #### Retrieve a Solana address from Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from.\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<string, GetAddressDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the base58-encoded address string, decoded to `Uint8Array`.\n * - **Error** \u2192 The device or signing operation failed (`GetAddressDAError`).\n *\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * ## getAppConfiguration\n * #### Retrieve the current Solana app configuration from a Ledger device.\n * ---\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<GetAppConfigurationResult, Error, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the app configuration object.\n * - **Error** \u2192 The device or signing operation failed.\n *\n * ---\n * ### Example\n *\n * ```ts\n * const config = await signerSolana.getAppConfiguration();\n * console.log(config.version, config.flags);\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
-
"mappings": "AAmBA,OAAS,iBAAAA,MAAqB,+BAG9B,OAAS,iBAAAC,MAAqB,OAQvB,MAAMC,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAC,EACA,UAAAC,EACA,cAAAC,CACF,EAAuC,CACrC,KAAK,WAAaJ,EAAc,CAAE,IAAAE,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n type DeviceManagementKit,\n type DeviceSessionId,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Container } from \"inversify\";\n\nimport { type GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { type GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { type SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { type SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AddressOptions } from \"@api/model/AddressOption\";\nimport { type MessageOptions } from \"@api/model/MessageOptions\";\nimport { type SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type SignerSolana } from \"@api/SignerSolana\";\n\nimport { type GetAddressUseCase } from \"./use-cases/address/GetAddressUseCase\";\nimport { type GetAppConfigurationUseCase } from \"./use-cases/app-configuration/GetAppConfigurationUseCase\";\nimport { useCasesTypes } from \"./use-cases/di/useCasesTypes\";\nimport { type SignMessageUseCase } from \"./use-cases/message/SignMessageUseCase\";\nimport { type SignTransactionUseCase } from \"./use-cases/transaction/SignTransactionUseCase\";\nimport { makeContainer } from \"./di\";\n\nexport type DefaultSignerSolanaConstructorArgs = {\n dmk: DeviceManagementKit;\n sessionId: DeviceSessionId;\n contextModule: ContextModule;\n};\n\nexport class DefaultSignerSolana implements SignerSolana {\n private _container: Container;\n\n constructor({\n dmk,\n sessionId,\n contextModule,\n }: DefaultSignerSolanaConstructorArgs) {\n this._container = makeContainer({ dmk, sessionId, contextModule });\n }\n\n /**\n * ## signTransaction\n * #### Securely sign a Solana or SPL transaction using **clear signing** on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used in the transaction.\n *\n * - **transaction** `Uint8Array`\n * The serialised transaction to sign.\n *\n * **Optional**\n * - **options** `SolanaTransactionOptionalConfig`\n * Provides additional context for transaction signing.\n *\n * - **transactionResolutionContext** `object`\n * Lets you explicitly pass `tokenAddress` and ATA details, bypassing extraction from the transaction itself.\n *\n * - **tokenAddress** `string`\n * SPL token address being transferred.\n *\n * - **createATA** `object`\n * Information about creating an associated token account (ATA).\n *\n * - **address** `string` \u2013 Address (owner) of the ATA.\n * - **mintAddress** `string` \u2013 Mint address of the ATA.\n *\n * - **tokenInternalId** `string`\n * Ledger internal token ID\n *\n * - **solanaRPCURL** `string`\n * RPC endpoint to use if `transactionResolutionContext` is not provided\n * and parsing requires network lookups.\n * In browser environments, use a CORS-enabled RPC URL.\n * Defaults to: `\"https://api.mainnet-beta.solana.com/\"`.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignTransactionDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed transaction bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignTransactionDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signTransaction(\"m/44'/501'/0'/0'\", serializedTx, {\n * transactionResolutionContext: resolution,\n * });\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signTransaction(\n derivationPath: string,\n transaction: Transaction,\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig,\n ): SignTransactionDAReturnType {\n return this._container\n .get<SignTransactionUseCase>(useCasesTypes.SignTransactionUseCase)\n .execute(derivationPath, transaction, solanaTransactionOptionalConfig);\n }\n\n /**\n * ## signMessage\n * #### Securely sign an arbitrary message on Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path used for signing.\n *\n * - **message** `string (hex-encoded)`\n * The message to sign, provided as a hex string.\n *\n * **Optional**\n * - **options** `MessageOptions`\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<Uint8Array, SignMessageDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the signed message bytes (`Uint8Array`).\n * - **Error** \u2192 The device or signing operation failed (`SignMessageDAError`).\n *\n * ---\n * ### Example\n *\n * ```ts\n * const { observable } = signerSolana.signMessage(\n * \"m/44'/501'/0'/0'\",\n * \"48656c6c6f20576f726c64\" // hex string\n * );\n * observable.subscribe({\n * next: state => {\n * if (state.status === DeviceActionStatus.Pending) {\n * console.log(\"Waiting for user action...\", state.intermediateValue);\n * }\n * if (state.status === DeviceActionStatus.Completed) {\n * console.log(\"Signature:\", state.output);\n * }\n * },\n * error: err => console.error(\"Error:\", err),\n * });\n * ```\n */\n signMessage(\n derivationPath: string,\n message: string,\n options?: MessageOptions,\n ): SignMessageDAReturnType {\n return this._container\n .get<SignMessageUseCase>(useCasesTypes.SignMessageUseCase)\n .execute(derivationPath, message, options);\n }\n\n /**\n * ## getAddress\n * #### Retrieve a Solana address from Ledger devices.\n * ---\n * ### Parameters\n *\n * **Required**\n * - **derivationPath** `string`\n * The derivation path of the account to retrieve the address from.\n *\n * **Optional**\n * - **options** `AddressOptions`\n * - **checkOnDevice** `boolean`\n * If `true`, prompts the user to verify the address on the device.\n *\n * - **skipOpenApp** `boolean`\n * If `true`, skips opening the Solana app on the device.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<string, GetAddressDAError, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the base58-encoded address string, decoded to `Uint8Array`.\n * - **Error** \u2192 The device or signing operation failed (`GetAddressDAError`).\n *\n */\n getAddress(\n derivationPath: string,\n options?: AddressOptions,\n ): GetAddressDAReturnType {\n return this._container\n .get<GetAddressUseCase>(useCasesTypes.GetAddressUseCase)\n .execute(derivationPath, options);\n }\n\n /**\n * ## getAppConfiguration\n * #### Retrieve the current Solana app configuration from a Ledger device.\n * ---\n * ### Parameters\n *\n * This method does not require any parameters.\n *\n * ---\n * ### Returns\n *\n * - `observable` That emits DeviceActionState updates\n * - `cancel` A function to cancel the action on the Ledger device.\n *\n * ---\n * ### Internal Flow\n *\n * Under the hood, this method subscribes to an\n * `Observable<DeviceActionState<GetAppConfigurationResult, Error, IntermediateValue>>`.\n *\n * #### DeviceActionState\n * Represents the lifecycle of a device action:\n *\n * ```ts\n * type DeviceActionState<Output, Error, IntermediateValue> =\n * | { status: DeviceActionStatus.NotStarted }\n * | { status: DeviceActionStatus.Pending; intermediateValue: IntermediateValue }\n * | { status: DeviceActionStatus.Stopped }\n * | { status: DeviceActionStatus.Completed; output: Output }\n * | { status: DeviceActionStatus.Error; error: Error };\n *\n * enum DeviceActionStatus {\n * NotStarted = \"not-started\",\n * Pending = \"pending\",\n * Stopped = \"stopped\",\n * Completed = \"completed\",\n * Error = \"error\"\n * }\n * ```\n *\n * - **NotStarted** \u2192 Action hasn\u2019t begun.\n * - **Pending** \u2192 Waiting for user confirmation on the device.\n * Includes an `intermediateValue` of type `IntermediateValue`.\n * - **Stopped** \u2192 Action was cancelled before completion.\n * - **Completed** \u2192 Provides the app configuration object.\n * - **Error** \u2192 The device or signing operation failed.\n *\n * ---\n * ### Example\n *\n * ```ts\n * const config = await signerSolana.getAppConfiguration();\n * console.log(config.version, config.flags);\n * ```\n */\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this._container\n .get<GetAppConfigurationUseCase>(useCasesTypes.GetAppConfigurationUseCase)\n .execute();\n }\n}\n"],
|
|
5
|
+
"mappings": "AAmBA,OAAS,iBAAAA,MAAqB,+BAG9B,OAAS,iBAAAC,MAAqB,OAQvB,MAAMC,CAA4C,CAC/C,WAER,YAAY,CACV,IAAAC,EACA,UAAAC,EACA,cAAAC,CACF,EAAuC,CACrC,KAAK,WAAaJ,EAAc,CAAE,IAAAE,EAAK,UAAAC,EAAW,cAAAC,CAAc,CAAC,CACnE,CAsGA,gBACEC,EACAC,EACAC,EAC6B,CAC7B,OAAO,KAAK,WACT,IAA4BR,EAAc,sBAAsB,EAChE,QAAQM,EAAgBC,EAAaC,CAA+B,CACzE,CAgFA,YACEF,EACAG,EACAC,EACyB,CACzB,OAAO,KAAK,WACT,IAAwBV,EAAc,kBAAkB,EACxD,QAAQM,EAAgBG,EAASC,CAAO,CAC7C,CA4DA,WACEJ,EACAI,EACwB,CACxB,OAAO,KAAK,WACT,IAAuBV,EAAc,iBAAiB,EACtD,QAAQM,EAAgBI,CAAO,CACpC,CAyDA,qBAAuD,CACrD,OAAO,KAAK,WACT,IAAgCV,EAAc,0BAA0B,EACxE,QAAQ,CACb,CACF",
|
|
6
6
|
"names": ["useCasesTypes", "makeContainer", "DefaultSignerSolana", "dmk", "sessionId", "contextModule", "derivationPath", "transaction", "solanaTransactionOptionalConfig", "message", "options"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var A=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var u=(o,e,n,i)=>{for(var t=i>1?void 0:i?v(e,n):e,d=o.length-1,m;d>=0;d--)(m=o[d])&&(t=(i?m(e,n,t):m(t))||t);return i&&t&&A(e,n,t),t},r=(o,e)=>(n,i)=>e(n,i,o);import{CallTaskInAppDeviceAction as l,SendCommandInAppDeviceAction as g,UserInteractionRequired as s}from"@ledgerhq/device-management-kit";import{inject as a,injectable as D}from"inversify";import{SendSignMessageTask as T}from"../app-binder/task/SendSignMessageTask";import{externalTypes as p}from"../externalTypes";import{GetAppConfigurationCommand as h}from"./command/GetAppConfigurationCommand";import{GetPubKeyCommand as f}from"./command/GetPubKeyCommand";import{GenerateTransactionDeviceAction as k}from"./device-action/GenerateTransactionDeviceAction";import{SignTransactionDeviceAction as y}from"./device-action/SignTransactionDeviceAction";let c=class{constructor(e,n,i,t){this.dmk=e;this.sessionId=n;this.contextModule=i;this.dmkLoggerFactory=t}getAddress(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new g({input:{command:new f(e),appName:"Solana",requiredUserInteraction:e.checkOnDevice?s.VerifyAddress:s.None,skipOpenApp:e.skipOpenApp}})})}signTransaction(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new y({input:{derivationPath:e.derivationPath,transaction:e.transaction,transactionOptions:e.solanaTransactionOptionalConfig,contextModule:this.contextModule,loggerFactory:this.dmkLoggerFactory}})})}generateTransaction(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new k({input:{derivationPath:e.derivationPath,skipOpenApp:e.skipOpenApp,contextModule:this.contextModule}})})}signMessage(e){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new l({input:{task:async n=>new T(n,{derivationPath:e.derivationPath,sendingData:new TextEncoder().encode(e.message)}).run(),appName:"Solana",requiredUserInteraction:s.SignPersonalMessage,skipOpenApp:e.skipOpenApp}})})}getAppConfiguration(){return this.dmk.executeDeviceAction({sessionId:this.sessionId,deviceAction:new g({input:{command:new h,appName:"Solana",requiredUserInteraction:s.None,skipOpenApp:!1}})})}};c=u([D(),r(0,a(p.Dmk)),r(1,a(p.SessionId)),r(2,a(p.ContextModule)),r(3,a(p.DmkLoggerFactory))],c);export{c as SolanaAppBinder};
|
|
2
2
|
//# sourceMappingURL=SolanaAppBinder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/app-binder/SolanaAppBinder.ts"],
|
|
4
|
-
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CallTaskInAppDeviceAction,\n DeviceManagementKit,\n type DeviceSessionId,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { GenerateTransactionDAReturnType } from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nimport { GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { Transaction } from \"@api/model/Transaction\";\nimport { SendSignMessageTask } from \"@internal/app-binder/task/SendSignMessageTask\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { GenerateTransactionDeviceAction } from \"./device-action/GenerateTransactionDeviceAction\";\nimport { SignTransactionDeviceAction } from \"./device-action/SignTransactionDeviceAction\";\n\n@injectable()\nexport class SolanaAppBinder {\n constructor(\n @inject(externalTypes.Dmk) private dmk: DeviceManagementKit,\n @inject(externalTypes.SessionId) private sessionId: DeviceSessionId,\n @inject(externalTypes.ContextModule) private contextModule: ContextModule,\n ) {}\n\n getAddress(args: {\n derivationPath: string;\n checkOnDevice: boolean;\n skipOpenApp: boolean;\n }): GetAddressDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(args),\n appName: \"Solana\",\n requiredUserInteraction: args.checkOnDevice\n ? UserInteractionRequired.VerifyAddress\n : UserInteractionRequired.None,\n skipOpenApp: args.skipOpenApp,\n },\n }),\n });\n }\n\n signTransaction(args: {\n derivationPath: string;\n transaction: Transaction;\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig;\n }): SignTransactionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SignTransactionDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n transaction: args.transaction,\n transactionOptions: args.solanaTransactionOptionalConfig,\n contextModule: this.contextModule,\n },\n }),\n });\n }\n\n generateTransaction(args: {\n derivationPath: string;\n skipOpenApp: boolean;\n }): GenerateTransactionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new GenerateTransactionDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n skipOpenApp: args.skipOpenApp,\n contextModule: this.contextModule,\n },\n }),\n });\n }\n\n signMessage(args: {\n derivationPath: string;\n message: string;\n skipOpenApp: boolean;\n }): SignMessageDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new CallTaskInAppDeviceAction({\n input: {\n task: async (internalApi) =>\n new SendSignMessageTask(internalApi, {\n derivationPath: args.derivationPath,\n sendingData: new TextEncoder().encode(args.message),\n }).run(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.SignPersonalMessage,\n skipOpenApp: args.skipOpenApp,\n },\n }),\n });\n }\n\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "iOACA,OACE,6BAAAA,
|
|
6
|
-
"names": ["CallTaskInAppDeviceAction", "SendCommandInAppDeviceAction", "UserInteractionRequired", "inject", "injectable", "SendSignMessageTask", "externalTypes", "GetAppConfigurationCommand", "GetPubKeyCommand", "GenerateTransactionDeviceAction", "SignTransactionDeviceAction", "SolanaAppBinder", "dmk", "sessionId", "contextModule", "args", "SendCommandInAppDeviceAction", "GetPubKeyCommand", "UserInteractionRequired", "SignTransactionDeviceAction", "GenerateTransactionDeviceAction", "CallTaskInAppDeviceAction", "internalApi", "SendSignMessageTask", "GetAppConfigurationCommand", "__decorateClass", "injectable", "__decorateParam", "inject", "externalTypes"]
|
|
4
|
+
"sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CallTaskInAppDeviceAction,\n DeviceManagementKit,\n type DeviceSessionId,\n LoggerPublisherService,\n SendCommandInAppDeviceAction,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { GenerateTransactionDAReturnType } from \"@api/app-binder/GenerateTransactionDeviceActionTypes\";\nimport { GetAddressDAReturnType } from \"@api/app-binder/GetAddressDeviceActionTypes\";\nimport { GetAppConfigurationDAReturnType } from \"@api/app-binder/GetAppConfigurationDeviceActionTypes\";\nimport { SignMessageDAReturnType } from \"@api/app-binder/SignMessageDeviceActionTypes\";\nimport { SignTransactionDAReturnType } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { SolanaTransactionOptionalConfig } from \"@api/model/SolanaTransactionOptionalConfig\";\nimport { Transaction } from \"@api/model/Transaction\";\nimport { SendSignMessageTask } from \"@internal/app-binder/task/SendSignMessageTask\";\nimport { externalTypes } from \"@internal/externalTypes\";\n\nimport { GetAppConfigurationCommand } from \"./command/GetAppConfigurationCommand\";\nimport { GetPubKeyCommand } from \"./command/GetPubKeyCommand\";\nimport { GenerateTransactionDeviceAction } from \"./device-action/GenerateTransactionDeviceAction\";\nimport { SignTransactionDeviceAction } from \"./device-action/SignTransactionDeviceAction\";\n\n@injectable()\nexport class SolanaAppBinder {\n constructor(\n @inject(externalTypes.Dmk) private dmk: DeviceManagementKit,\n @inject(externalTypes.SessionId) private sessionId: DeviceSessionId,\n @inject(externalTypes.ContextModule) private contextModule: ContextModule,\n @inject(externalTypes.DmkLoggerFactory)\n private dmkLoggerFactory: (tag: string) => LoggerPublisherService,\n ) {}\n\n getAddress(args: {\n derivationPath: string;\n checkOnDevice: boolean;\n skipOpenApp: boolean;\n }): GetAddressDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetPubKeyCommand(args),\n appName: \"Solana\",\n requiredUserInteraction: args.checkOnDevice\n ? UserInteractionRequired.VerifyAddress\n : UserInteractionRequired.None,\n skipOpenApp: args.skipOpenApp,\n },\n }),\n });\n }\n\n signTransaction(args: {\n derivationPath: string;\n transaction: Transaction;\n solanaTransactionOptionalConfig?: SolanaTransactionOptionalConfig;\n }): SignTransactionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SignTransactionDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n transaction: args.transaction,\n transactionOptions: args.solanaTransactionOptionalConfig,\n contextModule: this.contextModule,\n loggerFactory: this.dmkLoggerFactory,\n },\n }),\n });\n }\n\n generateTransaction(args: {\n derivationPath: string;\n skipOpenApp: boolean;\n }): GenerateTransactionDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new GenerateTransactionDeviceAction({\n input: {\n derivationPath: args.derivationPath,\n skipOpenApp: args.skipOpenApp,\n contextModule: this.contextModule,\n },\n }),\n });\n }\n\n signMessage(args: {\n derivationPath: string;\n message: string;\n skipOpenApp: boolean;\n }): SignMessageDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new CallTaskInAppDeviceAction({\n input: {\n task: async (internalApi) =>\n new SendSignMessageTask(internalApi, {\n derivationPath: args.derivationPath,\n sendingData: new TextEncoder().encode(args.message),\n }).run(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.SignPersonalMessage,\n skipOpenApp: args.skipOpenApp,\n },\n }),\n });\n }\n\n getAppConfiguration(): GetAppConfigurationDAReturnType {\n return this.dmk.executeDeviceAction({\n sessionId: this.sessionId,\n deviceAction: new SendCommandInAppDeviceAction({\n input: {\n command: new GetAppConfigurationCommand(),\n appName: \"Solana\",\n requiredUserInteraction: UserInteractionRequired.None,\n skipOpenApp: false,\n },\n }),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "iOACA,OACE,6BAAAA,EAIA,gCAAAC,EACA,2BAAAC,MACK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YASnC,OAAS,uBAAAC,MAA2B,gDACpC,OAAS,iBAAAC,MAAqB,0BAE9B,OAAS,8BAAAC,MAAkC,uCAC3C,OAAS,oBAAAC,MAAwB,6BACjC,OAAS,mCAAAC,MAAuC,kDAChD,OAAS,+BAAAC,MAAmC,8CAGrC,IAAMC,EAAN,KAAsB,CAC3B,YACqCC,EACMC,EACIC,EAErCC,EACR,CALmC,SAAAH,EACM,eAAAC,EACI,mBAAAC,EAErC,sBAAAC,CACP,CAEH,WAAWC,EAIgB,CACzB,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAIC,EAA6B,CAC7C,MAAO,CACL,QAAS,IAAIC,EAAiBF,CAAI,EAClC,QAAS,SACT,wBAAyBA,EAAK,cAC1BG,EAAwB,cACxBA,EAAwB,KAC5B,YAAaH,EAAK,WACpB,CACF,CAAC,CACH,CAAC,CACH,CAEA,gBAAgBA,EAIgB,CAC9B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAII,EAA4B,CAC5C,MAAO,CACL,eAAgBJ,EAAK,eACrB,YAAaA,EAAK,YAClB,mBAAoBA,EAAK,gCACzB,cAAe,KAAK,cACpB,cAAe,KAAK,gBACtB,CACF,CAAC,CACH,CAAC,CACH,CAEA,oBAAoBA,EAGgB,CAClC,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAIK,EAAgC,CAChD,MAAO,CACL,eAAgBL,EAAK,eACrB,YAAaA,EAAK,YAClB,cAAe,KAAK,aACtB,CACF,CAAC,CACH,CAAC,CACH,CAEA,YAAYA,EAIgB,CAC1B,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAIM,EAA0B,CAC1C,MAAO,CACL,KAAM,MAAOC,GACX,IAAIC,EAAoBD,EAAa,CACnC,eAAgBP,EAAK,eACrB,YAAa,IAAI,YAAY,EAAE,OAAOA,EAAK,OAAO,CACpD,CAAC,EAAE,IAAI,EACT,QAAS,SACT,wBAAyBG,EAAwB,oBACjD,YAAaH,EAAK,WACpB,CACF,CAAC,CACH,CAAC,CACH,CAEA,qBAAuD,CACrD,OAAO,KAAK,IAAI,oBAAoB,CAClC,UAAW,KAAK,UAChB,aAAc,IAAIC,EAA6B,CAC7C,MAAO,CACL,QAAS,IAAIQ,EACb,QAAS,SACT,wBAAyBN,EAAwB,KACjD,YAAa,EACf,CACF,CAAC,CACH,CAAC,CACH,CACF,EAnGaR,EAANe,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAc,GAAG,GACxBF,EAAA,EAAAC,EAAOC,EAAc,SAAS,GAC9BF,EAAA,EAAAC,EAAOC,EAAc,aAAa,GAClCF,EAAA,EAAAC,EAAOC,EAAc,gBAAgB,IAL7BnB",
|
|
6
|
+
"names": ["CallTaskInAppDeviceAction", "SendCommandInAppDeviceAction", "UserInteractionRequired", "inject", "injectable", "SendSignMessageTask", "externalTypes", "GetAppConfigurationCommand", "GetPubKeyCommand", "GenerateTransactionDeviceAction", "SignTransactionDeviceAction", "SolanaAppBinder", "dmk", "sessionId", "contextModule", "dmkLoggerFactory", "args", "SendCommandInAppDeviceAction", "GetPubKeyCommand", "UserInteractionRequired", "SignTransactionDeviceAction", "GenerateTransactionDeviceAction", "CallTaskInAppDeviceAction", "internalApi", "SendSignMessageTask", "GetAppConfigurationCommand", "__decorateClass", "injectable", "__decorateParam", "inject", "externalTypes"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DeviceActionStatus as
|
|
1
|
+
import{DeviceActionStatus as u,SendCommandInAppDeviceAction as m,UserInteractionRequired as v}from"@ledgerhq/device-management-kit";import{from as l}from"rxjs";import{GetAppConfigurationCommand as g}from"./command/GetAppConfigurationCommand";import{GetPubKeyCommand as D}from"./command/GetPubKeyCommand";import{GenerateTransactionDeviceAction as h}from"./device-action/GenerateTransactionDeviceAction";import{SignTransactionDeviceAction as f}from"./device-action/SignTransactionDeviceAction";import{SolanaAppBinder as p}from"./SolanaAppBinder";describe("SolanaAppBinder",()=>{const o={},i={sendCommand:vi.fn(),executeDeviceAction:vi.fn()},r=vi.fn(()=>({}));beforeEach(()=>{vi.clearAllMocks()}),it("should be defined",()=>{const n=new p({},{},o,r);expect(n).toBeDefined()}),describe("getAddress",()=>{it("should return the address",()=>new Promise((n,s)=>{const t="D2PPQSYFe83nDzk96FqGumVU8JA7J8vj2Rhjc2oXzEi5";vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:l([{status:u.Completed,output:t}]),cancel:vi.fn()});const c=new p(i,"sessionId",o,r),{observable:d}=c.getAddress({derivationPath:"44'/501'",checkOnDevice:!1,skipOpenApp:!1}),a=[];d.subscribe({next:e=>{a.push(e)},error:e=>{s(e)},complete:()=>{try{expect(a).toEqual([{status:u.Completed,output:t}]),n()}catch(e){s(e)}}})})),describe("calls of executeDeviceAction with the correct params",()=>{const n={derivationPath:"44'/60'/3'/2/1",returnChainCode:!1,skipOpenApp:!1};it("when checkOnDevice is true: UserInteractionRequired.VerifyAddress",()=>{const t={...n,checkOnDevice:!0};new p(i,"sessionId",o,r).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith({sessionId:"sessionId",deviceAction:new m({input:{command:new D(t),appName:"Solana",requiredUserInteraction:v.VerifyAddress,skipOpenApp:!1}})})}),it("when checkOnDevice is false: UserInteractionRequired.None",()=>{const t={...n,checkOnDevice:!1};new p(i,"sessionId",o,r).getAddress(t),expect(i.executeDeviceAction).toHaveBeenCalledWith({sessionId:"sessionId",deviceAction:new m({input:{command:new D(t),appName:"Solana",requiredUserInteraction:v.None,skipOpenApp:!1}})})})})}),describe("signTransaction",()=>{it("should return the signature",()=>new Promise((n,s)=>{const t=new Uint8Array([1,2,3]);vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:l([{status:u.Completed,output:t}]),cancel:vi.fn()});const c=new p(i,"sessionId",o,r),{observable:d}=c.signTransaction({derivationPath:"44'/501'",transaction:new Uint8Array([1,2,3,4]),solanaTransactionOptionalConfig:{skipOpenApp:!1}}),a=[];d.subscribe({next:e=>{a.push(e)},error:e=>{s(e)},complete:()=>{try{expect(a).toEqual([{status:u.Completed,output:t}]),n()}catch(e){s(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{const n="44'/60'/3'/2/1",s=new Uint8Array([1,2,3,4]),t=!1;new p(i,"sessionId",o,r).signTransaction({derivationPath:n,transaction:s,solanaTransactionOptionalConfig:{skipOpenApp:!1}}),expect(i.executeDeviceAction).toHaveBeenCalledWith({sessionId:"sessionId",deviceAction:new f({input:{derivationPath:n,transaction:s,transactionOptions:{skipOpenApp:t},contextModule:o,loggerFactory:r}})})})}),describe("signMessage",()=>{it("should return the signed message",()=>new Promise((n,s)=>{const t={signature:"signature"},c={derivationPath:"44'/501'/0'/0'",message:"Hello world",skipOpenApp:!1};vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:l([{status:u.Completed,output:t}]),cancel:vi.fn()});const d=new p(i,"sessionId",o,r),{observable:a}=d.signMessage(c),e=[];a.subscribe({next:A=>{e.push(A)},error:A=>{s(A)},complete:()=>{try{expect(e).toEqual([{status:u.Completed,output:t}]),n()}catch(A){s(A)}}})}))}),describe("getAppConfiguration",()=>{it("should return the app configuration",()=>new Promise((n,s)=>{const t={blindSigningEnabled:!0,pubKeyDisplayMode:"LONG",version:"2.5.10"};vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:l([{status:u.Completed,output:t}]),cancel:vi.fn()});const c=new p(i,"sessionId",o,r),{observable:d}=c.getAppConfiguration(),a=[];d.subscribe({next:e=>{a.push(e)},error:e=>{s(e)},complete:()=>{try{expect(a).toEqual([{status:u.Completed,output:t}]),n()}catch(e){s(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{new p(i,"sessionId",o,r).getAppConfiguration(),expect(i.executeDeviceAction).toHaveBeenCalledWith({sessionId:"sessionId",deviceAction:new m({input:{command:new g,appName:"Solana",requiredUserInteraction:v.None,skipOpenApp:!1}})})})}),describe("generateTransaction",()=>{it("should return the serialized transaction",()=>new Promise((n,s)=>{const t="BASE64_OR_HEX_TX";vi.spyOn(i,"executeDeviceAction").mockReturnValue({observable:l([{status:u.Completed,output:t}]),cancel:vi.fn()});const c=new p(i,"sessionId",o,r),{observable:d}=c.generateTransaction({derivationPath:"44'/501'/0'/0'",skipOpenApp:!1}),a=[];d.subscribe({next:e=>a.push(e),error:e=>s(e),complete:()=>{try{expect(a).toEqual([{status:u.Completed,output:t}]),n()}catch(e){s(e)}}})})),it("should call executeDeviceAction with the correct params",()=>{const n="44'/501'/0'/0'";new p(i,"sessionId",o,r).generateTransaction({derivationPath:n,skipOpenApp:!0}),expect(i.executeDeviceAction).toHaveBeenCalledWith({sessionId:"sessionId",deviceAction:new h({input:{derivationPath:n,skipOpenApp:!0,contextModule:o}})})})})});
|
|
2
2
|
//# sourceMappingURL=SolanaAppBinder.test.js.map
|