@ledgerhq/context-module 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/package.json +2 -1
- package/lib/cjs/src/ContextModuleBuilder.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
- package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
- package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
- package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
- package/lib/cjs/src/shared/utils/bs58Encoder.js +2 -0
- package/lib/cjs/src/shared/utils/bs58Encoder.js.map +7 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.js +2 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.js.map +7 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js +2 -0
- package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
- package/lib/esm/package.json +2 -1
- package/lib/esm/src/ContextModuleBuilder.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
- package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
- package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
- package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
- package/lib/esm/src/shared/utils/bs58Encoder.js +2 -0
- package/lib/esm/src/shared/utils/bs58Encoder.js.map +7 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.js +2 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.js.map +7 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js +2 -0
- package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts +3 -2
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts.map +1 -1
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts +3 -2
- package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts.map +1 -1
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts +16 -2
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts +2 -0
- package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts.map +1 -0
- package/lib/types/src/modules/solana/lifi/data/HttpLifiDataSource.d.ts.map +1 -1
- package/lib/types/src/shared/utils/bs58Encoder.d.ts +9 -0
- package/lib/types/src/shared/utils/bs58Encoder.d.ts.map +1 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts +3 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts.map +1 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts +2 -0
- package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts.map +1 -0
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +5 -4
package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, exactly, number, oneOf, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/modules/multichain/transaction-check/di/transactionCheckTypes\";\nimport { type TransactionCheckLoader } from \"@/modules/multichain/transaction-check/loaders/TransactionCheckLoader\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nexport type SolanaTransactionCheckRequest = {\n from: string;\n
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,kCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAAmC,qBACnCC,EAAsD,qBAEtDC,EAA4B,mCAC5BC,EAAyB,gDAEzBC,EAAyB,mDAEzBC,EAAsC,2EAEtCC,EAAsC,kEACtCC,EAGO,
|
|
6
|
-
"names": ["SolanaTransactionCheckLoader_exports", "__export", "SolanaTransactionCheckLoader", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_transactionCheckTypes", "import_constants", "import_ClearSignContext", "SUPPORTED_TYPES", "solanaTransactionCheckInputCodec", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "input", "expectedType", "type", "from", "
|
|
4
|
+
"sourcesContent": ["import {\n DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, exactly, number, oneOf, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/modules/multichain/transaction-check/di/transactionCheckTypes\";\nimport { type TransactionCheckLoader } from \"@/modules/multichain/transaction-check/loaders/TransactionCheckLoader\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@/shared/utils/bs58Encoder\";\nimport { uint8ArrayCodec } from \"@/shared/utils/uint8ArrayCodec\";\n\nexport type SolanaTransactionCheckRequest = {\n from: string;\n transactionBytes: Uint8Array;\n chain: number;\n};\n\nexport type SolanaTransactionCheckContextInput = {\n deviceModelId: DeviceModelId;\n transactionCheck: SolanaTransactionCheckRequest;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n];\n\nconst SOLANA_SIGNATURE_LENGTH = 64;\nconst SOLANA_MAX_SIGNATURES = 64;\nconst VERSIONED_MESSAGE_PREFIX_MASK = 0x80;\nconst SHORTVEC_CONTINUATION_BIT = 0x80;\nconst SHORTVEC_DATA_MASK = 0x7f;\nconst SHORTVEC_DATA_BITS = 7;\n\nconst solanaTransactionCheckInputCodec = Codec.interface({\n deviceModelId: oneOf([\n exactly(DeviceModelId.NANO_X),\n exactly(DeviceModelId.NANO_SP),\n exactly(DeviceModelId.STAX),\n exactly(DeviceModelId.FLEX),\n ]),\n transactionCheck: Codec.interface({\n from: string,\n transactionBytes: uint8ArrayCodec,\n chain: number,\n }),\n});\n\n@injectable()\nexport class SolanaTransactionCheckLoader\n implements TransactionCheckLoader<SolanaTransactionCheckContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private readonly transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.logger = loggerFactory(\"SolanaTransactionCheckLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is SolanaTransactionCheckContextInput {\n if (!SUPPORTED_TYPES.every((type) => expectedType.includes(type)))\n return false;\n return solanaTransactionCheckInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ transactionCheck: { from, transactionBytes } }) =>\n from.length > 0 && transactionBytes.length > 0,\n });\n }\n\n async load(\n ctx: SolanaTransactionCheckContextInput,\n ): Promise<ClearSignContext[]> {\n const { from, transactionBytes, chain } = ctx.transactionCheck;\n\n let rawTx: string;\n try {\n rawTx = this.bs58Encoder.encode(\n this.wrapMessageAsTransaction(transactionBytes),\n );\n } catch (error) {\n const result: ClearSignContext[] = [\n {\n type: ClearSignContextType.ERROR,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n ];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n const txCheck = await this.transactionCheckDataSource.check({\n path: TransactionCheckPaths.SOLANA_TRANSACTION,\n body: { tx: { from, raw: rawTx }, chain },\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (data) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: data.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: data.descriptor },\n certificate,\n };\n },\n });\n\n const result = [context];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n /**\n * Wrap a serialized Solana Message into a serialized Transaction expected\n * by the web3checks endpoint, by prepending a compact-u16 signature count\n * and the matching number of zero-filled signature placeholders.\n *\n * Supports legacy and versioned messages: versioned messages start with a\n * version prefix byte (high bit set), shifting `numRequiredSignatures` by\n * one position.\n */\n private wrapMessageAsTransaction(message: Uint8Array): Uint8Array {\n const numRequiredSignatures = this.readNumRequiredSignatures(message);\n const sigCount = this.encodeShortVec(numRequiredSignatures);\n const placeholdersLength = numRequiredSignatures * SOLANA_SIGNATURE_LENGTH;\n\n const wrapped = new Uint8Array(\n sigCount.length + placeholdersLength + message.length,\n );\n wrapped.set(sigCount, 0);\n wrapped.set(message, sigCount.length + placeholdersLength);\n return wrapped;\n }\n\n private readNumRequiredSignatures(message: Uint8Array): number {\n const firstByte = message[0];\n if (firstByte === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes\",\n );\n }\n const isVersioned = (firstByte & VERSIONED_MESSAGE_PREFIX_MASK) !== 0;\n const headerOffset = isVersioned ? 1 : 0;\n const numRequiredSignatures = message[headerOffset];\n if (numRequiredSignatures === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: malformed message header\",\n );\n }\n if (numRequiredSignatures > SOLANA_MAX_SIGNATURES) {\n throw new Error(\n `[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${numRequiredSignatures}) exceeds SOLANA_MAX_SIGNATURES (${SOLANA_MAX_SIGNATURES})`,\n );\n }\n return numRequiredSignatures;\n }\n\n private encodeShortVec(value: number): Uint8Array {\n const bytes: number[] = [];\n let remaining = value;\n while (true) {\n const lowBits = remaining & SHORTVEC_DATA_MASK;\n remaining >>>= SHORTVEC_DATA_BITS;\n if (remaining === 0) {\n bytes.push(lowBits);\n break;\n }\n bytes.push(lowBits | SHORTVEC_CONTINUATION_BIT);\n }\n return Uint8Array.from(bytes);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SolanaTransactionCheckLoader_exports", "__export", "SolanaTransactionCheckLoader", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_transactionCheckTypes", "import_constants", "import_ClearSignContext", "import_bs58Encoder", "import_uint8ArrayCodec", "SUPPORTED_TYPES", "SOLANA_SIGNATURE_LENGTH", "SOLANA_MAX_SIGNATURES", "VERSIONED_MESSAGE_PREFIX_MASK", "SHORTVEC_CONTINUATION_BIT", "SHORTVEC_DATA_MASK", "SHORTVEC_DATA_BITS", "solanaTransactionCheckInputCodec", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "bs58Encoder", "input", "expectedType", "type", "from", "transactionBytes", "ctx", "chain", "rawTx", "error", "result", "data", "certificate", "message", "numRequiredSignatures", "sigCount", "placeholdersLength", "wrapped", "firstByte", "headerOffset", "value", "bytes", "remaining", "lowBits", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var u=Object.create;var f=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var N=(e,a,r,A)=>{if(a&&typeof a=="object"||typeof a=="function")for(let s of C(a))!k.call(e,s)&&s!==r&&f(e,s,{get:()=>a[s],enumerable:!(A=m(a,s))||A.enumerable});return e};var w=(e,a,r)=>(r=e!=null?u(x(e)):{},N(a||!e||!e.__esModule?f(r,"default",{value:e,enumerable:!0}):r,e));var o=require("@ledgerhq/device-management-kit"),p=w(require("bs58")),d=require("purify-ts"),y=require("../../../../modules/multichain/transaction-check/utils/constants"),n=require("../../../../shared/model/ClearSignContext"),h=require("./SolanaTransactionCheckLoader");const c=64,g={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},O=()=>g,l={loadCertificate:vi.fn()};let i,t;beforeEach(()=>{vi.resetAllMocks(),i={check:vi.fn()},t=new h.SolanaTransactionCheckLoader(i,l,O)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(t.canHandle(e,[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(t.canHandle(e,[n.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(t.canHandle({...e,deviceModelId:o.DeviceModelId.NANO_S},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{i.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk",descriptor:"aabb"})),l.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("wraps a legacy Message into a serialized Transaction (sig count + zero-filled signatures + message) and bs58-encodes it",async()=>{const e=new Uint8Array([2,0,3,170,187,204]);await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=i.check.mock.calls[0][0],r=p.default.decode(a.body.tx.raw);expect(a.path).toBe(y.TransactionCheckPaths.SOLANA_TRANSACTION),expect(a.body.tx.from).toBe("signer"),expect(a.body.chain).toBe(1),expect(r.length).toBe(1+2*c+e.length),expect(r[0]).toBe(2),expect(Array.from(r.slice(1,1+2*c))).toEqual(new Array(2*c).fill(0)),expect(Array.from(r.slice(1+2*c))).toEqual(Array.from(e))}),it("wraps a versioned (v0) Message by skipping the version prefix when reading numRequiredSignatures",async()=>{const e=new Uint8Array([128,1,0,3,222,173]);await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=p.default.decode(i.check.mock.calls[0][0].body.tx.raw);expect(a.length).toBe(1+c+e.length),expect(a[0]).toBe(1),expect(Array.from(a.slice(1,1+c))).toEqual(new Array(c).fill(0)),expect(Array.from(a.slice(1+c))).toEqual(Array.from(e))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{i.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};l.loadCertificate.mockResolvedValue(e);const[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:n.ClearSignContextType.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");i.check.mockResolvedValue((0,d.Left)(e));const[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:n.ClearSignContextType.ERROR,error:e}),expect(l.loadCertificate).not.toHaveBeenCalled()}),it("returns an ERROR context (and does not call the data source) when numRequiredSignatures exceeds the max",async()=>{const e=new Uint8Array([65,0,3,170]),[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});expect(a).toMatchObject({type:n.ClearSignContextType.ERROR,error:expect.any(Error)}),expect(a.error.message).toContain("numRequiredSignatures (65)"),expect(i.check).not.toHaveBeenCalled()})})});
|
|
2
|
+
//# sourceMappingURL=SolanaTransactionCheckLoader.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.ts"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst SIG_LENGTH = 64;\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"wraps a legacy Message into a serialized Transaction (sig count + zero-filled signatures + message) and bs58-encodes it\", async () => {\n // Legacy message: numRequiredSignatures=2, then arbitrary bytes\n const message = new Uint8Array([2, 0, 3, 0xaa, 0xbb, 0xcc]);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n const wrapped = bs58.decode(sent.body.tx.raw);\n\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(1);\n expect(wrapped.length).toBe(1 + 2 * SIG_LENGTH + message.length);\n expect(wrapped[0]).toBe(2);\n expect(Array.from(wrapped.slice(1, 1 + 2 * SIG_LENGTH))).toEqual(\n new Array(2 * SIG_LENGTH).fill(0),\n );\n expect(Array.from(wrapped.slice(1 + 2 * SIG_LENGTH))).toEqual(\n Array.from(message),\n );\n });\n\n it(\"wraps a versioned (v0) Message by skipping the version prefix when reading numRequiredSignatures\", async () => {\n // V0 message: [0x80 version prefix, numRequiredSignatures=1, ...]\n const message = new Uint8Array([0x80, 1, 0, 3, 0xde, 0xad]);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n const wrapped = bs58.decode(\n dataSourceMock.check.mock.calls[0]![0].body.tx.raw,\n );\n\n expect(wrapped.length).toBe(1 + SIG_LENGTH + message.length);\n expect(wrapped[0]).toBe(1);\n expect(Array.from(wrapped.slice(1, 1 + SIG_LENGTH))).toEqual(\n new Array(SIG_LENGTH).fill(0),\n );\n expect(Array.from(wrapped.slice(1 + SIG_LENGTH))).toEqual(\n Array.from(message),\n );\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: 1,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: 1,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"returns an ERROR context (and does not call the data source) when numRequiredSignatures exceeds the max\", async () => {\n // numRequiredSignatures = 65, one above SOLANA_MAX_SIGNATURES (64)\n const message = new Uint8Array([65, 0, 3, 0xaa]);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n expect(ctx).toMatchObject({\n type: ClearSignContextType.ERROR,\n error: expect.any(Error),\n });\n expect((ctx as { error: Error }).error.message).toContain(\n \"numRequiredSignatures (65)\",\n );\n expect(dataSourceMock.check).not.toHaveBeenCalled();\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_device_management_kit", "import_bs58", "import_purify_ts", "import_constants", "import_ClearSignContext", "import_SolanaTransactionCheckLoader", "SIG_LENGTH", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "sent", "wrapped", "bs58", "cert", "ctx", "error"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var c=Object.defineProperty;var
|
|
1
|
+
"use strict";var c=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var y=(e,t)=>{for(var r in t)c(e,r,{get:t[r],enumerable:!0})},T=(e,t,r,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of m(t))!D.call(e,o)&&o!==r&&c(e,o,{get:()=>t[o],enumerable:!(s=h(t,o))||s.enumerable});return e};var C=e=>T(c({},"__esModule",{value:!0}),e),f=(e,t,r,s)=>{for(var o=s>1?void 0:s?h(t,r):t,p=e.length-1,l;p>=0;p--)(l=e[p])&&(o=(s?l(t,r,o):l(o))||o);return s&&o&&c(t,r,o),o},g=(e,t)=>(r,s)=>t(r,s,e);var P={};y(P,{HttpLifiDataSource:()=>a});module.exports=C(P);var i=require("inversify"),n=require("purify-ts"),d=require("../../../../config/di/configTypes"),u=require("../../../../shared/network/di/networkTypes");let a=class{constructor(t,r,s){this.config=t;this.http=s;this.logger=r("HttpLifiDataSource")}logger;async getTransactionDescriptorsPayload({templateId:t}){this.logger.debug("[getTransactionDescriptorsPayload] Fetching transaction descriptors",{data:{templateId:t}});try{const r=await this.http.get(`${this.config.cal.url}/swap_templates`,{params:{template_id:t,output:"id,chain_id,instructions,descriptors"}});return this.logger.debug("[getTransactionDescriptorsPayload] Received response",{data:{templateId:t,responseLength:r?.length??0,hasData:!!r&&r.length>0}}),!r||r.length===0||!r[0]?(this.logger.warn("[getTransactionDescriptorsPayload] No transaction descriptors found",{data:{templateId:t,responseLength:r?.length??0}}),(0,n.Left)(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${t}`))):(this.logger.info("[getTransactionDescriptorsPayload] Successfully fetched transaction descriptors",{data:{templateId:t,descriptorsCount:r[0].descriptors?.length??0}}),(0,n.Right)(r[0]))}catch(r){return this.logger.error("[getTransactionDescriptorsPayload] Failed to fetch transaction descriptors",{data:{templateId:t,error:r instanceof Error?r.message:String(r)}}),(0,n.Left)(new Error("[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors"))}}};a=f([(0,i.injectable)(),g(0,(0,i.inject)(d.configTypes.Config)),g(1,(0,i.inject)(d.configTypes.ContextModuleLoggerFactory)),g(2,(0,i.inject)(u.networkTypes.NetworkClient))],a);0&&(module.exports={HttpLifiDataSource});
|
|
2
2
|
//# sourceMappingURL=HttpLifiDataSource.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/solana/lifi/data/HttpLifiDataSource.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DmkNetworkClient,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n GetTransactionDescriptorsParams,\n GetTransactionDescriptorsResponse,\n LifiDataSource,\n} from \"./LifiDataSource\";\n\n@injectable()\nexport class HttpLifiDataSource implements LifiDataSource {\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {\n this.logger = loggerFactory(\"HttpLifiDataSource\");\n }\n\n public async getTransactionDescriptorsPayload({\n templateId,\n }: GetTransactionDescriptorsParams): Promise<\n Either<Error, GetTransactionDescriptorsResponse>\n > {\n this.logger.debug(\n \"[getTransactionDescriptorsPayload] Fetching transaction descriptors\",\n {\n data: { templateId },\n },\n );\n\n try {\n const data = (await this.http.get(\n `${this.config.cal.url}/swap_templates`,\n {\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n
|
|
5
|
-
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAStB,IAAMC,EAAN,KAAmD,CAGxD,YAEmBC,EAEjBC,EAEiBC,EACjB,CALiB,YAAAF,EAIA,UAAAE,EAEjB,KAAK,OAASD,EAAc,oBAAoB,CAClD,CAXQ,OAaR,MAAa,iCAAiC,CAC5C,WAAAE,CACF,EAEE,CACA,KAAK,OAAO,MACV,sEACA,CACE,KAAM,CAAE,WAAAA,CAAW,CACrB,CACF,EAEA,GAAI,CACF,MAAMC,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,IAAI,GAAG,kBACtB,CACE,OAAQ,CACN,YAAaD,EACb,OAAQ,
|
|
4
|
+
"sourcesContent": ["import {\n DmkNetworkClient,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n GetTransactionDescriptorsParams,\n GetTransactionDescriptorsResponse,\n LifiDataSource,\n} from \"./LifiDataSource\";\n\n@injectable()\nexport class HttpLifiDataSource implements LifiDataSource {\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {\n this.logger = loggerFactory(\"HttpLifiDataSource\");\n }\n\n public async getTransactionDescriptorsPayload({\n templateId,\n }: GetTransactionDescriptorsParams): Promise<\n Either<Error, GetTransactionDescriptorsResponse>\n > {\n this.logger.debug(\n \"[getTransactionDescriptorsPayload] Fetching transaction descriptors\",\n {\n data: { templateId },\n },\n );\n\n try {\n const data = (await this.http.get(\n `${this.config.cal.url}/swap_templates`,\n {\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n },\n },\n )) as GetTransactionDescriptorsResponse[];\n\n this.logger.debug(\n \"[getTransactionDescriptorsPayload] Received response\",\n {\n data: {\n templateId,\n responseLength: data?.length ?? 0,\n hasData: !!data && data.length > 0,\n },\n },\n );\n\n if (!data || data.length === 0 || !data[0]) {\n this.logger.warn(\n \"[getTransactionDescriptorsPayload] No transaction descriptors found\",\n {\n data: { templateId, responseLength: data?.length ?? 0 },\n },\n );\n return Left(\n new Error(\n `[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n );\n }\n\n this.logger.info(\n \"[getTransactionDescriptorsPayload] Successfully fetched transaction descriptors\",\n {\n data: {\n templateId,\n descriptorsCount: data[0].descriptors?.length ?? 0,\n },\n },\n );\n\n return Right(data[0]);\n } catch (error) {\n this.logger.error(\n \"[getTransactionDescriptorsPayload] Failed to fetch transaction descriptors\",\n {\n data: {\n templateId,\n error: error instanceof Error ? error.message : String(error),\n },\n },\n );\n return Left(\n new Error(\n \"[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors\",\n ),\n );\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAStB,IAAMC,EAAN,KAAmD,CAGxD,YAEmBC,EAEjBC,EAEiBC,EACjB,CALiB,YAAAF,EAIA,UAAAE,EAEjB,KAAK,OAASD,EAAc,oBAAoB,CAClD,CAXQ,OAaR,MAAa,iCAAiC,CAC5C,WAAAE,CACF,EAEE,CACA,KAAK,OAAO,MACV,sEACA,CACE,KAAM,CAAE,WAAAA,CAAW,CACrB,CACF,EAEA,GAAI,CACF,MAAMC,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,IAAI,GAAG,kBACtB,CACE,OAAQ,CACN,YAAaD,EACb,OAAQ,sCACV,CACF,CACF,EAaA,OAXA,KAAK,OAAO,MACV,uDACA,CACE,KAAM,CACJ,WAAAA,EACA,eAAgBC,GAAM,QAAU,EAChC,QAAS,CAAC,CAACA,GAAQA,EAAK,OAAS,CACnC,CACF,CACF,EAEI,CAACA,GAAQA,EAAK,SAAW,GAAK,CAACA,EAAK,CAAC,GACvC,KAAK,OAAO,KACV,sEACA,CACE,KAAM,CAAE,WAAAD,EAAY,eAAgBC,GAAM,QAAU,CAAE,CACxD,CACF,KACO,QACL,IAAI,MACF,yEAAyED,CAAU,EACrF,CACF,IAGF,KAAK,OAAO,KACV,kFACA,CACE,KAAM,CACJ,WAAAA,EACA,iBAAkBC,EAAK,CAAC,EAAE,aAAa,QAAU,CACnD,CACF,CACF,KAEO,SAAMA,EAAK,CAAC,CAAC,EACtB,OAASC,EAAO,CACd,YAAK,OAAO,MACV,6EACA,CACE,KAAM,CACJ,WAAAF,EACA,MAAOE,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAC9D,CACF,CACF,KACO,QACL,IAAI,MACF,6EACF,CACF,CACF,CACF,CACF,EA1FaN,EAANO,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,cAAY,0BAA0B,GAE7CA,EAAA,eAAO,eAAa,aAAa,IARzBR",
|
|
6
6
|
"names": ["HttpLifiDataSource_exports", "__export", "HttpLifiDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "HttpLifiDataSource", "config", "loggerFactory", "http", "templateId", "data", "error", "__decorateClass", "__decorateParam"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var n=require("purify-ts"),
|
|
1
|
+
"use strict";var n=require("purify-ts"),t=require("vitest"),s=require("./HttpLifiDataSource");const l=()=>({debug:t.vi.fn(),info:t.vi.fn(),warn:t.vi.fn(),error:t.vi.fn(),subscribers:[]});(0,t.describe)("HttpLifiDataSource",()=>{let a,e;const o="tpl-123",i={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}};(0,t.beforeEach)(()=>{t.vi.clearAllMocks(),e={get:t.vi.fn()},a=new s.HttpLifiDataSource(i,l,e)}),(0,t.it)("should call the network client with the expected URL and params",async()=>{e.get.mockResolvedValue([]),await a.getTransactionDescriptorsPayload({templateId:o}),(0,t.expect)(e.get).toHaveBeenCalledTimes(1),(0,t.expect)(e.get).toHaveBeenCalledWith("https://crypto-assets-service.api.ledger.com/v1/swap_templates",{params:{template_id:o,output:"id,chain_id,instructions,descriptors"}})}),(0,t.it)("should return Right(data[0]) when the network client responds with a non-empty array",async()=>{const r={descriptors:{swap:{programId:"SwapProgram",accounts:[],data:"abcd"}}};e.get.mockResolvedValue([r]);const c=await a.getTransactionDescriptorsPayload({templateId:o});(0,t.expect)(c).toEqual((0,n.Right)(r))}),(0,t.it)("should return an error when data is undefined",async()=>{e.get.mockResolvedValue(null);const r=await a.getTransactionDescriptorsPayload({templateId:o});(0,t.expect)(r).toEqual((0,n.Left)(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${o}`)))}),(0,t.it)("should return an error when data array is empty",async()=>{e.get.mockResolvedValue([]);const r=await a.getTransactionDescriptorsPayload({templateId:o});(0,t.expect)(r).toEqual((0,n.Left)(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${o}`)))}),(0,t.it)("should return an error when first element is falsy",async()=>{e.get.mockResolvedValue([null]);const r=await a.getTransactionDescriptorsPayload({templateId:o});(0,t.expect)(r).toEqual((0,n.Left)(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${o}`)))}),(0,t.it)("should return an error when the network client throws",async()=>{e.get.mockRejectedValue(new Error("network"));const r=await a.getTransactionDescriptorsPayload({templateId:o});(0,t.expect)(r).toEqual((0,n.Left)(new Error("[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors")))})});
|
|
2
2
|
//# sourceMappingURL=HttpLifiDataSource.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/solana/lifi/data/HttpLifiDataSource.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpLifiDataSource } from \"./HttpLifiDataSource\";\nimport {\n type GetTransactionDescriptorsResponse,\n type LifiDataSource,\n} from \"./LifiDataSource\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"HttpLifiDataSource\", () => {\n let datasource: LifiDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const templateId = \"tpl-123\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpLifiDataSource(\n config,\n mockLoggerFactory,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"should call the network client with the expected URL and params\", async () => {\n // given\n httpMock.get.mockResolvedValue([]);\n\n // when\n await datasource.getTransactionDescriptorsPayload({ templateId });\n\n // then\n expect(httpMock.get).toHaveBeenCalledTimes(1);\n expect(httpMock.get).toHaveBeenCalledWith(\n \"https://crypto-assets-service.api.ledger.com/v1/swap_templates\",\n {\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n
|
|
5
|
-
"mappings": "aAGA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAAmC,gCAMnC,MAAMC,EAAoB,KAAO,CAC/B,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,EACb,YAAa,CAAC,CAChB,MAEA,YAAS,qBAAsB,IAAM,CACnC,IAAIC,EACAC,EACJ,MAAMC,EAAa,UACbC,EAAqC,CACzC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,KAEA,cAAW,IAAM,CACf,KAAG,cAAc,EACjBF,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,qBACfG,EACAJ,EACAE,CACF,CACF,CAAC,KAED,MAAG,kEAAmE,SAAY,CAEhFA,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMD,EAAW,iCAAiC,CAAE,WAAAE,CAAW,CAAC,KAGhE,UAAOD,EAAS,GAAG,EAAE,sBAAsB,CAAC,KAC5C,UAAOA,EAAS,GAAG,EAAE,qBACnB,iEACA,CACE,OAAQ,CACN,YAAaC,EACb,OAAQ,
|
|
4
|
+
"sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpLifiDataSource } from \"./HttpLifiDataSource\";\nimport {\n type GetTransactionDescriptorsResponse,\n type LifiDataSource,\n} from \"./LifiDataSource\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"HttpLifiDataSource\", () => {\n let datasource: LifiDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const templateId = \"tpl-123\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpLifiDataSource(\n config,\n mockLoggerFactory,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"should call the network client with the expected URL and params\", async () => {\n // given\n httpMock.get.mockResolvedValue([]);\n\n // when\n await datasource.getTransactionDescriptorsPayload({ templateId });\n\n // then\n expect(httpMock.get).toHaveBeenCalledTimes(1);\n expect(httpMock.get).toHaveBeenCalledWith(\n \"https://crypto-assets-service.api.ledger.com/v1/swap_templates\",\n {\n params: {\n template_id: templateId,\n output: \"id,chain_id,instructions,descriptors\",\n },\n },\n );\n });\n\n it(\"should return Right(data[0]) when the network client responds with a non-empty array\", async () => {\n // given\n const response0: GetTransactionDescriptorsResponse = {\n descriptors: {\n swap: { programId: \"SwapProgram\", accounts: [], data: \"abcd\" } as any,\n },\n } as any;\n\n httpMock.get.mockResolvedValue([response0]);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(Right(response0));\n });\n\n it(\"should return an error when data is undefined\", async () => {\n // given\n httpMock.get.mockResolvedValue(null);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when data array is empty\", async () => {\n // given\n httpMock.get.mockResolvedValue([]);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when first element is falsy\", async () => {\n // given\n httpMock.get.mockResolvedValue([null]);\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${templateId}`,\n ),\n ),\n );\n });\n\n it(\"should return an error when the network client throws\", async () => {\n // given\n httpMock.get.mockRejectedValue(new Error(\"network\"));\n\n // when\n const result = await datasource.getTransactionDescriptorsPayload({\n templateId,\n });\n\n // then\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors\",\n ),\n ),\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "aAGA,IAAAA,EAA4B,qBAC5BC,EAAqD,kBAIrDC,EAAmC,gCAMnC,MAAMC,EAAoB,KAAO,CAC/B,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,EACb,YAAa,CAAC,CAChB,MAEA,YAAS,qBAAsB,IAAM,CACnC,IAAIC,EACAC,EACJ,MAAMC,EAAa,UACbC,EAAqC,CACzC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,KAEA,cAAW,IAAM,CACf,KAAG,cAAc,EACjBF,EAAW,CAAE,IAAK,KAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,qBACfG,EACAJ,EACAE,CACF,CACF,CAAC,KAED,MAAG,kEAAmE,SAAY,CAEhFA,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMD,EAAW,iCAAiC,CAAE,WAAAE,CAAW,CAAC,KAGhE,UAAOD,EAAS,GAAG,EAAE,sBAAsB,CAAC,KAC5C,UAAOA,EAAS,GAAG,EAAE,qBACnB,iEACA,CACE,OAAQ,CACN,YAAaC,EACb,OAAQ,sCACV,CACF,CACF,CACF,CAAC,KAED,MAAG,uFAAwF,SAAY,CAErG,MAAME,EAA+C,CACnD,YAAa,CACX,KAAM,CAAE,UAAW,cAAe,SAAU,CAAC,EAAG,KAAM,MAAO,CAC/D,CACF,EAEAH,EAAS,IAAI,kBAAkB,CAACG,CAAS,CAAC,EAG1C,MAAMC,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WAAQ,SAAMD,CAAS,CAAC,CACzC,CAAC,KAED,MAAG,gDAAiD,SAAY,CAE9DH,EAAS,IAAI,kBAAkB,IAAI,EAGnC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,yEAAyEH,CAAU,EACrF,CACF,CACF,CACF,CAAC,KAED,MAAG,kDAAmD,SAAY,CAEhED,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,yEAAyEH,CAAU,EACrF,CACF,CACF,CACF,CAAC,KAED,MAAG,qDAAsD,SAAY,CAEnED,EAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAGrC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,yEAAyEH,CAAU,EACrF,CACF,CACF,CACF,CAAC,KAED,MAAG,wDAAyD,SAAY,CAEtED,EAAS,IAAI,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGnD,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,KAGD,UAAOG,CAAM,EAAE,WACb,QACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
|
|
6
6
|
"names": ["import_purify_ts", "import_vitest", "import_HttpLifiDataSource", "mockLoggerFactory", "datasource", "httpMock", "templateId", "config", "response0", "result"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var a=Object.create;var d=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var y=Object.getPrototypeOf,A=Object.prototype.hasOwnProperty;var U=(e,r)=>{for(var t in r)d(e,t,{get:r[t],enumerable:!0})},i=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of g(r))!A.call(e,n)&&n!==t&&d(e,n,{get:()=>r[n],enumerable:!(o=s(r,n))||o.enumerable});return e};var f=(e,r,t)=>(t=e!=null?a(y(e)):{},i(r||!e||!e.__esModule?d(t,"default",{value:e,enumerable:!0}):t,e)),p=e=>i(d({},"__esModule",{value:!0}),e);var l={};U(l,{DefaultBs58Encoder:()=>u});module.exports=p(l);var c=f(require("bs58"));class u{static encode(r){return c.default.encode(r)}static decode(r){return c.default.decode(r)}}0&&(module.exports={DefaultBs58Encoder});
|
|
2
|
+
//# sourceMappingURL=bs58Encoder.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/shared/utils/bs58Encoder.ts"],
|
|
4
|
+
"sourcesContent": ["import bs58 from \"bs58\";\n\nexport interface Bs58Encoder {\n encode(data: Uint8Array): string;\n decode(encoded: string): Uint8Array;\n}\n\nexport class DefaultBs58Encoder {\n static encode(data: Uint8Array): string {\n return bs58.encode(data);\n }\n static decode(encoded: string): Uint8Array {\n return bs58.decode(encoded);\n }\n}\n"],
|
|
5
|
+
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAiB,mBAOV,MAAMF,CAAmB,CAC9B,OAAO,OAAOG,EAA0B,CACtC,OAAO,EAAAC,QAAK,OAAOD,CAAI,CACzB,CACA,OAAO,OAAOE,EAA6B,CACzC,OAAO,EAAAD,QAAK,OAAOC,CAAO,CAC5B,CACF",
|
|
6
|
+
"names": ["bs58Encoder_exports", "__export", "DefaultBs58Encoder", "__toCommonJS", "import_bs58", "data", "bs58", "encoded"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var n=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var a=Object.getOwnPropertyNames;var y=Object.prototype.hasOwnProperty;var A=(t,r)=>{for(var c in r)n(t,c,{get:r[c],enumerable:!0})},f=(t,r,c,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of a(r))!y.call(t,o)&&o!==c&&n(t,o,{get:()=>r[o],enumerable:!(i=d(r,o))||i.enumerable});return t};var m=t=>f(n({},"__esModule",{value:!0}),t);var s={};A(s,{uint8ArrayCodec:()=>p});module.exports=m(s);var e=require("purify-ts");const p=e.Codec.custom({decode:t=>t instanceof Uint8Array?(0,e.Right)(t):(0,e.Left)("Expected a Uint8Array"),encode:t=>t});0&&(module.exports={uint8ArrayCodec});
|
|
2
|
+
//# sourceMappingURL=uint8ArrayCodec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/shared/utils/uint8ArrayCodec.ts"],
|
|
4
|
+
"sourcesContent": ["import { Codec, Left, Right } from \"purify-ts\";\n\nexport const uint8ArrayCodec = Codec.custom<Uint8Array>({\n decode: (value) =>\n value instanceof Uint8Array ? Right(value) : Left(\"Expected a Uint8Array\"),\n encode: (value) => value,\n});\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAmC,qBAE5B,MAAMF,EAAkB,QAAM,OAAmB,CACtD,OAASG,GACPA,aAAiB,cAAa,SAAMA,CAAK,KAAI,QAAK,uBAAuB,EAC3E,OAASA,GAAUA,CACrB,CAAC",
|
|
6
|
+
"names": ["uint8ArrayCodec_exports", "__export", "uint8ArrayCodec", "__toCommonJS", "import_purify_ts", "value"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t=require("purify-ts"),e=require("./uint8ArrayCodec");describe("uint8ArrayCodec",()=>{it("decodes a Uint8Array as Right",()=>{const r=new Uint8Array([1,2,3]);expect(e.uint8ArrayCodec.decode(r)).toEqual((0,t.Right)(r))}),it("decodes a non-Uint8Array value as Left",()=>{expect(e.uint8ArrayCodec.decode("not bytes")).toEqual((0,t.Left)("Expected a Uint8Array")),expect(e.uint8ArrayCodec.decode([1,2,3])).toEqual((0,t.Left)("Expected a Uint8Array")),expect(e.uint8ArrayCodec.decode(void 0)).toEqual((0,t.Left)("Expected a Uint8Array"))}),it("encodes a Uint8Array as itself",()=>{const r=new Uint8Array([4,5,6]);expect(e.uint8ArrayCodec.encode(r)).toBe(r)})});
|
|
2
|
+
//# sourceMappingURL=uint8ArrayCodec.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/shared/utils/uint8ArrayCodec.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { Left, Right } from \"purify-ts\";\n\nimport { uint8ArrayCodec } from \"./uint8ArrayCodec\";\n\ndescribe(\"uint8ArrayCodec\", () => {\n it(\"decodes a Uint8Array as Right\", () => {\n const bytes = new Uint8Array([1, 2, 3]);\n expect(uint8ArrayCodec.decode(bytes)).toEqual(Right(bytes));\n });\n\n it(\"decodes a non-Uint8Array value as Left\", () => {\n expect(uint8ArrayCodec.decode(\"not bytes\")).toEqual(\n Left(\"Expected a Uint8Array\"),\n );\n expect(uint8ArrayCodec.decode([1, 2, 3])).toEqual(\n Left(\"Expected a Uint8Array\"),\n );\n expect(uint8ArrayCodec.decode(undefined)).toEqual(\n Left(\"Expected a Uint8Array\"),\n );\n });\n\n it(\"encodes a Uint8Array as itself\", () => {\n const bytes = new Uint8Array([4, 5, 6]);\n expect(uint8ArrayCodec.encode(bytes)).toBe(bytes);\n });\n});\n"],
|
|
5
|
+
"mappings": "aAAA,IAAAA,EAA4B,qBAE5BC,EAAgC,6BAEhC,SAAS,kBAAmB,IAAM,CAChC,GAAG,gCAAiC,IAAM,CACxC,MAAMC,EAAQ,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACtC,OAAO,kBAAgB,OAAOA,CAAK,CAAC,EAAE,WAAQ,SAAMA,CAAK,CAAC,CAC5D,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,OAAO,kBAAgB,OAAO,WAAW,CAAC,EAAE,WAC1C,QAAK,uBAAuB,CAC9B,EACA,OAAO,kBAAgB,OAAO,CAAC,EAAG,EAAG,CAAC,CAAC,CAAC,EAAE,WACxC,QAAK,uBAAuB,CAC9B,EACA,OAAO,kBAAgB,OAAO,MAAS,CAAC,EAAE,WACxC,QAAK,uBAAuB,CAC9B,CACF,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,MAAMA,EAAQ,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACtC,OAAO,kBAAgB,OAAOA,CAAK,CAAC,EAAE,KAAKA,CAAK,CAClD,CAAC,CACH,CAAC",
|
|
6
|
+
"names": ["import_purify_ts", "import_uint8ArrayCodec", "bytes"]
|
|
7
|
+
}
|
package/lib/esm/package.json
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
+
"bs58": "catalog:",
|
|
3
4
|
"crypto-js": "catalog:",
|
|
4
5
|
"ethers": "catalog:",
|
|
5
6
|
"inversify": "catalog:",
|
|
@@ -57,5 +58,5 @@
|
|
|
57
58
|
"watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
|
|
58
59
|
"watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
|
|
59
60
|
},
|
|
60
|
-
"version": "2.
|
|
61
|
+
"version": "2.1.0"
|
|
61
62
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{noopLoggerFactory as o}from"@ledgerhq/device-management-kit";import{DefaultContextModule as r}from"./DefaultContextModule";const i="https://crypto-assets-service.api.ledger.com/v1",n="https://web3checks-backend.api.ledger.com/v3",a="https://nft.api.live.ledger.com",s="https://
|
|
1
|
+
import{noopLoggerFactory as o}from"@ledgerhq/device-management-kit";import{DefaultContextModule as r}from"./DefaultContextModule";const i="https://crypto-assets-service.api.ledger.com/v1",n="https://web3checks-backend.api.ledger.com/v3",a="https://nft.api.live.ledger.com",s="https://blind-signing.api.ledger.com/ingest/v1",d=Object.freeze({cal:Object.freeze({url:i,mode:"prod",branch:"main"}),web3checks:Object.freeze({url:n}),metadataServiceDomain:Object.freeze({url:a}),reporter:Object.freeze({url:s}),datasource:Object.freeze({proxy:"default"}),appSource:"third-party"}),u={defaultLoaders:!0,defaultFieldLoaders:!0,customLoaders:[],customFieldLoaders:[],customTypedDataLoader:void 0,customBlindSigningReporter:void 0,customTrustedNameDataSource:void 0};class l{config;constructor({originToken:e,loggerFactory:t}){this.config={...d,...u,customLoaders:[],customFieldLoaders:[],originToken:e??"",loggerFactory:t??o}}removeDefaultLoaders(){return this.config.defaultLoaders=!1,this}addLoader(e){return this.config.customLoaders.push(e),this}addTypedDataLoader(e){return this.config.customTypedDataLoader=e,this}setCalConfig(e){return this.config.cal=e,this}setMetadataServiceConfig(e){return this.config.metadataServiceDomain=e,this}setWeb3ChecksConfig(e){return this.config.web3checks=e,this}setDatasourceConfig(e){return this.config.datasource=e,this}setReporterConfig(e){return this.config.reporter=e,this}setAppSource(e){return this.config.appSource=e,this}setBlindSigningReporter(e){return this.config.customBlindSigningReporter=e,this}setTrustedNameDataSource(e){return this.config.customTrustedNameDataSource=e,this}setLoggerFactory(e){return this.config.loggerFactory=e,this}setChain(e){return this.config.chain=e,this}build(){if(!this.config.chain)throw new Error("[ContextModuleBuilder] setChain() must be called before build()");return new r(this.config)}}export{l as ContextModuleBuilder,d as DEFAULT_CONFIG};
|
|
2
2
|
//# sourceMappingURL=ContextModuleBuilder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/ContextModuleBuilder.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n type LoggerPublisherService,\n noopLoggerFactory,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ContextModuleConstructorArgs } from \"./config/model/ContextModuleBuildArgs\";\nimport {\n type ContextModuleCalConfig,\n type ContextModuleConfig,\n type ContextModuleDatasourceConfig,\n type ContextModuleLoaderConfig,\n type ContextModuleMetadataServiceConfig,\n type ContextModuleReporterConfig,\n type ContextModuleServiceConfig,\n type ContextModuleWeb3ChecksConfig,\n} from \"./config/model/ContextModuleConfig\";\nimport { type TrustedNameDataSource } from \"./modules/ethereum/trusted-name/data/TrustedNameDataSource\";\nimport { type TypedDataContextLoader } from \"./modules/ethereum/typed-data/domain/TypedDataContextLoader\";\nimport { type BlindSigningReporter } from \"./modules/multichain/reporter/domain/BlindSigningReporter\";\nimport { type ContextLoader } from \"./shared/domain/ContextLoader\";\nimport { type ContextModuleChainID } from \"./shared/domain/ContextModuleChainID\";\nimport { type ContextModule } from \"./ContextModule\";\nimport { DefaultContextModule } from \"./DefaultContextModule\";\n\nconst DEFAULT_CAL_URL = \"https://crypto-assets-service.api.ledger.com/v1\";\nconst DEFAULT_WEB3_CHECKS_URL = \"https://web3checks-backend.api.ledger.com/v3\";\nconst DEFAULT_METADATA_SERVICE_DOMAIN = \"https://nft.api.live.ledger.com\";\nconst DEFAULT_REPORTER_URL = \"https://
|
|
5
|
-
"mappings": "AAAA,OAEE,qBAAAA,MACK,kCAmBP,OAAS,wBAAAC,MAA4B,yBAErC,MAAMC,EAAkB,kDAClBC,EAA0B,+CAC1BC,EAAkC,kCAClCC,EAAuB,
|
|
4
|
+
"sourcesContent": ["import {\n type LoggerPublisherService,\n noopLoggerFactory,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type ContextModuleConstructorArgs } from \"./config/model/ContextModuleBuildArgs\";\nimport {\n type ContextModuleCalConfig,\n type ContextModuleConfig,\n type ContextModuleDatasourceConfig,\n type ContextModuleLoaderConfig,\n type ContextModuleMetadataServiceConfig,\n type ContextModuleReporterConfig,\n type ContextModuleServiceConfig,\n type ContextModuleWeb3ChecksConfig,\n} from \"./config/model/ContextModuleConfig\";\nimport { type TrustedNameDataSource } from \"./modules/ethereum/trusted-name/data/TrustedNameDataSource\";\nimport { type TypedDataContextLoader } from \"./modules/ethereum/typed-data/domain/TypedDataContextLoader\";\nimport { type BlindSigningReporter } from \"./modules/multichain/reporter/domain/BlindSigningReporter\";\nimport { type ContextLoader } from \"./shared/domain/ContextLoader\";\nimport { type ContextModuleChainID } from \"./shared/domain/ContextModuleChainID\";\nimport { type ContextModule } from \"./ContextModule\";\nimport { DefaultContextModule } from \"./DefaultContextModule\";\n\nconst DEFAULT_CAL_URL = \"https://crypto-assets-service.api.ledger.com/v1\";\nconst DEFAULT_WEB3_CHECKS_URL = \"https://web3checks-backend.api.ledger.com/v3\";\nconst DEFAULT_METADATA_SERVICE_DOMAIN = \"https://nft.api.live.ledger.com\";\nconst DEFAULT_REPORTER_URL = \"https://blind-signing.api.ledger.com/ingest/v1\";\n\n/**\n * Default configuration for the context module\n *\n * @note This configuration is frozen to prevent modifications after construction\n * and can be used by external packages to get a default configuration.\n */\nexport const DEFAULT_CONFIG: Readonly<ContextModuleConfig> = Object.freeze({\n cal: Object.freeze({\n url: DEFAULT_CAL_URL,\n mode: \"prod\",\n branch: \"main\",\n }),\n web3checks: Object.freeze({\n url: DEFAULT_WEB3_CHECKS_URL,\n }),\n metadataServiceDomain: Object.freeze({\n url: DEFAULT_METADATA_SERVICE_DOMAIN,\n }),\n reporter: Object.freeze({\n url: DEFAULT_REPORTER_URL,\n }),\n datasource: Object.freeze({ proxy: \"default\" }),\n appSource: \"third-party\",\n});\n\n/**\n * Default loader configuration for the context module\n *\n * @note This configuration is internal and will be the default configuration for the context module.\n */\nconst DEFAULT_LOADER_CONFIG: ContextModuleLoaderConfig = {\n defaultLoaders: true,\n defaultFieldLoaders: true,\n customLoaders: [],\n customFieldLoaders: [],\n customTypedDataLoader: undefined,\n customBlindSigningReporter: undefined,\n customTrustedNameDataSource: undefined,\n};\n\n// Internal config type: all ServiceConfig fields except chain (set later via setChain)\ntype BuilderConfig = Omit<ContextModuleServiceConfig, \"chain\"> &\n Partial<Pick<ContextModuleServiceConfig, \"chain\">> &\n ContextModuleLoaderConfig;\n\nexport class ContextModuleBuilder {\n private config: BuilderConfig;\n\n constructor({ originToken, loggerFactory }: ContextModuleConstructorArgs) {\n this.config = {\n ...DEFAULT_CONFIG,\n ...DEFAULT_LOADER_CONFIG,\n customLoaders: [],\n customFieldLoaders: [],\n originToken: originToken ?? \"\",\n loggerFactory: loggerFactory ?? noopLoggerFactory,\n };\n }\n\n /**\n * Remove default loaders from the list of loaders\n *\n * @returns this\n */\n removeDefaultLoaders() {\n this.config.defaultLoaders = false;\n return this;\n }\n\n /**\n * Add a custom loader to the list of loaders\n *\n * @param loader loader to add to the list of loaders\n * @returns this\n */\n addLoader(loader: ContextLoader) {\n this.config.customLoaders.push(loader);\n return this;\n }\n\n /**\n * Replace the default loader for typed data clear signing contexts\n *\n * @param loader loader to use for typed data clear signing contexts\n * @returns this\n */\n addTypedDataLoader(loader: TypedDataContextLoader) {\n this.config.customTypedDataLoader = loader;\n return this;\n }\n\n /**\n * Add a custom CAL configuration\n *\n * @param calConfig\n * @returns this\n */\n setCalConfig(calConfig: ContextModuleCalConfig) {\n this.config.cal = calConfig;\n return this;\n }\n\n /**\n * Add a custom metadata service configuration\n *\n * @param metadataServiceConfig\n * @returns this\n */\n setMetadataServiceConfig(\n metadataServiceConfig: ContextModuleMetadataServiceConfig,\n ) {\n this.config.metadataServiceDomain = metadataServiceConfig;\n return this;\n }\n\n /**\n * Add a custom web3 checks configuration\n *\n * @param web3ChecksConfig\n * @returns this\n */\n setWeb3ChecksConfig(web3ChecksConfig: ContextModuleWeb3ChecksConfig) {\n this.config.web3checks = web3ChecksConfig;\n return this;\n }\n\n /**\n * Add datasource configuration\n *\n * @param datasourceConfig\n * @returns this\n */\n setDatasourceConfig(datasourceConfig: ContextModuleDatasourceConfig) {\n this.config.datasource = datasourceConfig;\n return this;\n }\n\n /**\n * Set a custom reporter configuration\n *\n * @param reporterConfig\n * @returns this\n */\n setReporterConfig(reporterConfig: ContextModuleReporterConfig) {\n this.config.reporter = reporterConfig;\n return this;\n }\n\n /**\n * Set the app source identifier included in blind signing reports\n *\n * @param appSource\n * @returns this\n */\n setAppSource(appSource: string) {\n this.config.appSource = appSource;\n return this;\n }\n\n /**\n * Set a custom blind signing reporter\n *\n * @param reporter reporter to use for blind signing events\n * @returns this\n */\n setBlindSigningReporter(reporter: BlindSigningReporter) {\n this.config.customBlindSigningReporter = reporter;\n return this;\n }\n\n /**\n * Set a custom trusted name data source\n *\n * @param dataSource data source to use for trusted name resolution\n * @returns this\n */\n setTrustedNameDataSource(dataSource: TrustedNameDataSource) {\n this.config.customTrustedNameDataSource = dataSource;\n return this;\n }\n\n /**\n * Set a custom logger factory\n *\n * @param loggerFactory\n * @returns this\n */\n setLoggerFactory(loggerFactory: (tag: string) => LoggerPublisherService) {\n this.config.loggerFactory = loggerFactory;\n return this;\n }\n\n /**\n * Set the chain for which this context module is built\n *\n * @param chain\n * @returns this\n */\n setChain(chain: ContextModuleChainID) {\n this.config.chain = chain;\n return this;\n }\n\n /**\n * Build the context module\n *\n * @returns the context module\n */\n build(): ContextModule {\n if (!this.config.chain) {\n throw new Error(\n \"[ContextModuleBuilder] setChain() must be called before build()\",\n );\n }\n return new DefaultContextModule(\n this.config as ContextModuleServiceConfig & ContextModuleLoaderConfig,\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAEE,qBAAAA,MACK,kCAmBP,OAAS,wBAAAC,MAA4B,yBAErC,MAAMC,EAAkB,kDAClBC,EAA0B,+CAC1BC,EAAkC,kCAClCC,EAAuB,iDAQhBC,EAAgD,OAAO,OAAO,CACzE,IAAK,OAAO,OAAO,CACjB,IAAKJ,EACL,KAAM,OACN,OAAQ,MACV,CAAC,EACD,WAAY,OAAO,OAAO,CACxB,IAAKC,CACP,CAAC,EACD,sBAAuB,OAAO,OAAO,CACnC,IAAKC,CACP,CAAC,EACD,SAAU,OAAO,OAAO,CACtB,IAAKC,CACP,CAAC,EACD,WAAY,OAAO,OAAO,CAAE,MAAO,SAAU,CAAC,EAC9C,UAAW,aACb,CAAC,EAOKE,EAAmD,CACvD,eAAgB,GAChB,oBAAqB,GACrB,cAAe,CAAC,EAChB,mBAAoB,CAAC,EACrB,sBAAuB,OACvB,2BAA4B,OAC5B,4BAA6B,MAC/B,EAOO,MAAMC,CAAqB,CACxB,OAER,YAAY,CAAE,YAAAC,EAAa,cAAAC,CAAc,EAAiC,CACxE,KAAK,OAAS,CACZ,GAAGJ,EACH,GAAGC,EACH,cAAe,CAAC,EAChB,mBAAoB,CAAC,EACrB,YAAaE,GAAe,GAC5B,cAAeC,GAAiBV,CAClC,CACF,CAOA,sBAAuB,CACrB,YAAK,OAAO,eAAiB,GACtB,IACT,CAQA,UAAUW,EAAuB,CAC/B,YAAK,OAAO,cAAc,KAAKA,CAAM,EAC9B,IACT,CAQA,mBAAmBA,EAAgC,CACjD,YAAK,OAAO,sBAAwBA,EAC7B,IACT,CAQA,aAAaC,EAAmC,CAC9C,YAAK,OAAO,IAAMA,EACX,IACT,CAQA,yBACEC,EACA,CACA,YAAK,OAAO,sBAAwBA,EAC7B,IACT,CAQA,oBAAoBC,EAAiD,CACnE,YAAK,OAAO,WAAaA,EAClB,IACT,CAQA,oBAAoBC,EAAiD,CACnE,YAAK,OAAO,WAAaA,EAClB,IACT,CAQA,kBAAkBC,EAA6C,CAC7D,YAAK,OAAO,SAAWA,EAChB,IACT,CAQA,aAAaC,EAAmB,CAC9B,YAAK,OAAO,UAAYA,EACjB,IACT,CAQA,wBAAwBC,EAAgC,CACtD,YAAK,OAAO,2BAA6BA,EAClC,IACT,CAQA,yBAAyBC,EAAmC,CAC1D,YAAK,OAAO,4BAA8BA,EACnC,IACT,CAQA,iBAAiBT,EAAwD,CACvE,YAAK,OAAO,cAAgBA,EACrB,IACT,CAQA,SAASU,EAA6B,CACpC,YAAK,OAAO,MAAQA,EACb,IACT,CAOA,OAAuB,CACrB,GAAI,CAAC,KAAK,OAAO,MACf,MAAM,IAAI,MACR,iEACF,EAEF,OAAO,IAAInB,EACT,KAAK,MACP,CACF,CACF",
|
|
6
6
|
"names": ["noopLoggerFactory", "DefaultContextModule", "DEFAULT_CAL_URL", "DEFAULT_WEB3_CHECKS_URL", "DEFAULT_METADATA_SERVICE_DOMAIN", "DEFAULT_REPORTER_URL", "DEFAULT_CONFIG", "DEFAULT_LOADER_CONFIG", "ContextModuleBuilder", "originToken", "loggerFactory", "loader", "calConfig", "metadataServiceConfig", "web3ChecksConfig", "datasourceConfig", "reporterConfig", "appSource", "reporter", "dataSource", "chain"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var _=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var u=(i,e,r,t)=>{for(var o=t>1?void 0:t?T(e,r):e,s=i.length-1,n;s>=0;s--)(n=i[s])&&(o=(t?n(e,r,o):n(o))||o);return t&&o&&_(e,r,o),o},c=(i,e)=>(r,t)=>e(r,t,i);import{isHexaString as E}from"@ledgerhq/device-management-kit";import{inject as g,injectable as I}from"inversify";import{configTypes as h}from"../../../../config/di/configTypes";import{gatedSigningTypes as P}from"../../../../modules/ethereum/gated-signing/di/gatedSigningTypes";import{proxyTypes as R}from"../../../../modules/ethereum/proxy/di/proxyTypes";import{pkiTypes as v}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyId as H}from"../../../../modules/multichain/pki/model/KeyId";import{KeyUsage as N}from"../../../../modules/multichain/pki/model/KeyUsage";import{ClearSignContextType as a}from"../../../../shared/model/ClearSignContext";const L=[a.ETHEREUM_GATED_SIGNING];function A(i){const e=i.toLowerCase();return e.startsWith("0x")?e:`0x${e}`}let l=class{constructor(e,r,t,o){this._dataSource=e;this._certificateLoader=r;this._proxyDataSource=t;this.logger=o("GatedSigningContextLoader")}logger;canHandle(e,r){return L.every(t=>r.includes(t))&&typeof e=="object"&&e!==null&&"to"in e&&E(e.to)&&e.to!=="0x"&&"selector"in e&&E(e.selector)&&"chainId"in e&&typeof e.chainId=="number"&&"deviceModelId"in e&&e.deviceModelId!==void 0}async load({to:e,selector:r,chainId:t,deviceModelId:o}){const s=await this._dataSource.getGatedDescriptor({contractAddress:e,selector:r,chainId:t});if(s.isRight()){const{signedDescriptor:d}=s.unsafeCoerce(),G=await this._loadGatedCertificate(o);return this.logger.debug("load result",{data:{path:"direct",to:e,selector:r,chainId:t,contextTypes:[a.ETHEREUM_GATED_SIGNING]}}),[{type:a.ETHEREUM_GATED_SIGNING,payload:d,certificate:G}]}const n=s.extract(),f={type:a.ERROR,error:n},y=await this._proxyDataSource.getProxyImplementationAddress({proxyAddress:e,chainId:t,challenge:"",calldata:"0x"});if(y.isLeft()){const d=y.extract();return this.logger.warn("No gated descriptor found and proxy resolution failed",{data:{to:e,selector:r,chainId:t,directError:n.message,proxyError:d.message}}),[f]}const p=y.unsafeCoerce(),m=A(p.implementationAddress),x=await this._dataSource.getGatedDescriptor({contractAddress:m,selector:r,chainId:t});if(x.isLeft()){const d=x.extract();return this.logger.warn("No gated descriptor found for proxy implementation address",{data:{to:e,implementationAddress:m,selector:r,chainId:t,directError:n.message,implError:d.message}}),[f]}const{signedDescriptor:S}=x.unsafeCoerce(),[C,D]=await Promise.all([this._certificateLoader.loadCertificate({keyId:p.keyId,keyUsage:p.keyUsage,targetDevice:o}),this._loadGatedCertificate(o)]);return this.logger.debug("load result",{data:{path:"proxy",to:e,implementationAddress:m,selector:r,chainId:t,contextTypes:[a.ETHEREUM_PROXY_INFO,a.ETHEREUM_GATED_SIGNING]}}),[{type:a.ETHEREUM_PROXY_INFO,payload:p.signedDescriptor,certificate:C},{type:a.ETHEREUM_GATED_SIGNING,payload:S,certificate:D}]}_loadGatedCertificate(e){return this._certificateLoader.loadCertificate({keyId:H.CalGatedSigning,keyUsage:N.GatedSigning,targetDevice:e})}};l=u([I(),c(0,g(P.GatedDescriptorDataSource)),c(1,g(v.PkiCertificateLoader)),c(2,g(R.ProxyDataSource)),c(3,g(h.ContextModuleLoggerFactory))],l);export{l as GatedSigningContextLoader};
|
|
2
2
|
//# sourceMappingURL=GatedSigningContextLoader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n DeviceModelId,\n HexaString,\n isHexaString,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport { gatedSigningTypes } from \"@/modules/ethereum/gated-signing/di/gatedSigningTypes\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/modules/ethereum/proxy/di/proxyTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nexport type GatedSigningContextInput = {\n to: HexaString;\n selector: HexaString;\n chainId: number;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n];\n\nfunction normalizeAddress(address: string): HexaString {\n const lower = address.toLowerCase();\n return (lower.startsWith(\"0x\") ? lower : `0x${lower}`) as HexaString;\n}\n\n@injectable()\nexport class GatedSigningContextLoader\n implements ContextLoader<GatedSigningContextInput>\n{\n constructor(\n @inject(gatedSigningTypes.GatedDescriptorDataSource)\n private readonly _dataSource: GatedDescriptorDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(proxyTypes.ProxyDataSource)\n private readonly _proxyDataSource: ProxyDataSource,\n ) {}\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is GatedSigningContextInput {\n return (\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type)) &&\n typeof input === \"object\" &&\n input !== null &&\n \"to\" in input &&\n isHexaString(input.to) &&\n input.to !== \"0x\" &&\n \"selector\" in input &&\n isHexaString(input.selector) &&\n \"chainId\" in input &&\n typeof input.chainId === \"number\" &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined\n );\n }\n\n async load({\n to,\n selector,\n chainId,\n deviceModelId,\n }: GatedSigningContextInput): Promise<ClearSignContext[]> {\n const directResult = await this._dataSource.getGatedDescriptor({\n contractAddress: to,\n selector,\n chainId,\n });\n\n if (directResult.isRight()) {\n const { signedDescriptor } = directResult.unsafeCoerce();\n const certificate = await this._loadGatedCertificate(deviceModelId);\n return [\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate,\n },\n ];\n }\n\n const errorContext: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error:
|
|
5
|
-
"mappings": "iOAAA,OAGE,gBAAAA,
|
|
6
|
-
"names": ["isHexaString", "inject", "injectable", "gatedSigningTypes", "proxyTypes", "pkiTypes", "KeyId", "KeyUsage", "ClearSignContextType", "SUPPORTED_TYPES", "ClearSignContextType", "normalizeAddress", "address", "lower", "GatedSigningContextLoader", "_dataSource", "_certificateLoader", "_proxyDataSource", "input", "expectedTypes", "type", "isHexaString", "to", "selector", "chainId", "deviceModelId", "directResult", "signedDescriptor", "certificate", "errorContext", "proxyResult", "proxyData", "implementationAddress", "implGatedResult", "proxyCertificate", "gatedCertificate", "KeyId", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "gatedSigningTypes", "pkiTypes", "proxyTypes"]
|
|
4
|
+
"sourcesContent": ["import {\n DeviceModelId,\n HexaString,\n isHexaString,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport { gatedSigningTypes } from \"@/modules/ethereum/gated-signing/di/gatedSigningTypes\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/modules/ethereum/proxy/di/proxyTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nexport type GatedSigningContextInput = {\n to: HexaString;\n selector: HexaString;\n chainId: number;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n];\n\nfunction normalizeAddress(address: string): HexaString {\n const lower = address.toLowerCase();\n return (lower.startsWith(\"0x\") ? lower : `0x${lower}`) as HexaString;\n}\n\n@injectable()\nexport class GatedSigningContextLoader\n implements ContextLoader<GatedSigningContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(gatedSigningTypes.GatedDescriptorDataSource)\n private readonly _dataSource: GatedDescriptorDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly _certificateLoader: PkiCertificateLoader,\n @inject(proxyTypes.ProxyDataSource)\n private readonly _proxyDataSource: ProxyDataSource,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"GatedSigningContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is GatedSigningContextInput {\n return (\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type)) &&\n typeof input === \"object\" &&\n input !== null &&\n \"to\" in input &&\n isHexaString(input.to) &&\n input.to !== \"0x\" &&\n \"selector\" in input &&\n isHexaString(input.selector) &&\n \"chainId\" in input &&\n typeof input.chainId === \"number\" &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined\n );\n }\n\n async load({\n to,\n selector,\n chainId,\n deviceModelId,\n }: GatedSigningContextInput): Promise<ClearSignContext[]> {\n const directResult = await this._dataSource.getGatedDescriptor({\n contractAddress: to,\n selector,\n chainId,\n });\n\n if (directResult.isRight()) {\n const { signedDescriptor } = directResult.unsafeCoerce();\n const certificate = await this._loadGatedCertificate(deviceModelId);\n this.logger.debug(\"load result\", {\n data: {\n path: \"direct\",\n to,\n selector,\n chainId,\n contextTypes: [ClearSignContextType.ETHEREUM_GATED_SIGNING],\n },\n });\n return [\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate,\n },\n ];\n }\n\n const directError = directResult.extract() as Error;\n const errorContext: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: directError,\n };\n\n const proxyResult =\n await this._proxyDataSource.getProxyImplementationAddress({\n proxyAddress: to,\n chainId,\n challenge: \"\",\n calldata: \"0x\",\n });\n\n if (proxyResult.isLeft()) {\n const proxyError = proxyResult.extract() as Error;\n this.logger.warn(\n \"No gated descriptor found and proxy resolution failed\",\n {\n data: {\n to,\n selector,\n chainId,\n directError: directError.message,\n proxyError: proxyError.message,\n },\n },\n );\n return [errorContext];\n }\n\n const proxyData = proxyResult.unsafeCoerce();\n const implementationAddress = normalizeAddress(\n proxyData.implementationAddress,\n );\n\n const implGatedResult = await this._dataSource.getGatedDescriptor({\n contractAddress: implementationAddress,\n selector,\n chainId,\n });\n\n if (implGatedResult.isLeft()) {\n const implError = implGatedResult.extract() as Error;\n this.logger.warn(\n \"No gated descriptor found for proxy implementation address\",\n {\n data: {\n to,\n implementationAddress,\n selector,\n chainId,\n directError: directError.message,\n implError: implError.message,\n },\n },\n );\n return [errorContext];\n }\n\n const { signedDescriptor } = implGatedResult.unsafeCoerce();\n const [proxyCertificate, gatedCertificate] = await Promise.all([\n this._certificateLoader.loadCertificate({\n keyId: proxyData.keyId,\n keyUsage: proxyData.keyUsage,\n targetDevice: deviceModelId,\n }),\n this._loadGatedCertificate(deviceModelId),\n ]);\n\n this.logger.debug(\"load result\", {\n data: {\n path: \"proxy\",\n to,\n implementationAddress,\n selector,\n chainId,\n contextTypes: [\n ClearSignContextType.ETHEREUM_PROXY_INFO,\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ],\n },\n });\n return [\n {\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxyData.signedDescriptor,\n certificate: proxyCertificate,\n },\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: gatedCertificate,\n },\n ];\n }\n\n private _loadGatedCertificate(deviceModelId: DeviceModelId) {\n return this._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isHexaString", "inject", "injectable", "configTypes", "gatedSigningTypes", "proxyTypes", "pkiTypes", "KeyId", "KeyUsage", "ClearSignContextType", "SUPPORTED_TYPES", "ClearSignContextType", "normalizeAddress", "address", "lower", "GatedSigningContextLoader", "_dataSource", "_certificateLoader", "_proxyDataSource", "loggerFactory", "input", "expectedTypes", "type", "isHexaString", "to", "selector", "chainId", "deviceModelId", "directResult", "signedDescriptor", "certificate", "directError", "errorContext", "proxyResult", "proxyError", "proxyData", "implementationAddress", "implGatedResult", "implError", "proxyCertificate", "gatedCertificate", "KeyId", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "gatedSigningTypes", "pkiTypes", "proxyTypes", "configTypes"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{DeviceModelId as p}from"@ledgerhq/device-management-kit";import{Left as f,Right as
|
|
1
|
+
import{DeviceModelId as p}from"@ledgerhq/device-management-kit";import{Left as f,Right as c}from"purify-ts";import{GatedSigningContextLoader as y}from"../../../../modules/ethereum/gated-signing/domain/GatedSigningContextLoader";import{KeyId as x}from"../../../../modules/multichain/pki/model/KeyId";import{KeyUsage as m}from"../../../../modules/multichain/pki/model/KeyUsage";import{ClearSignContextType as i}from"../../../../shared/model/ClearSignContext";describe("GatedSigningContextLoader",()=>{const o={getGatedDescriptor:vi.fn(),getGatedDescriptorForTypedData:vi.fn()},n={loadCertificate:vi.fn()},d={getProxyImplementationAddress:vi.fn()},h=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}),r=new y(o,n,d,h),g={keyUsageNumber:1,payload:new Uint8Array([1,2,3])},s=[i.ETHEREUM_GATED_SIGNING];beforeEach(()=>{vi.resetAllMocks(),vi.spyOn(n,"loadCertificate").mockResolvedValue(g)}),describe("canHandle function",()=>{const e={to:"0x1111111254fb6c44bac0bed2854e76f90643097d",selector:"0xa1251d75",chainId:1,deviceModelId:p.STAX};it("should return true for valid input",()=>{expect(r.canHandle(e,s)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(r.canHandle(e,[i.ETHEREUM_TOKEN])).toBe(!1),expect(r.canHandle(e,[i.ETHEREUM_DYNAMIC_NETWORK])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(a,t)=>{expect(r.canHandle(a,s)).toBe(!1)}),it.each([[{...e,to:void 0},"missing to"],[{...e,selector:void 0},"missing selector"],[{...e,chainId:void 0},"missing chainId"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(a,t)=>{expect(r.canHandle(a,s)).toBe(!1)}),it.each([[{...e,to:"0x"},"empty to (0x)"],[{...e,to:"not-hex"},"non-hex to"],[{...e,selector:"not-hex"},"non-hex selector"],[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"]])("should return false for %s",(a,t)=>{expect(r.canHandle(a,s)).toBe(!1)})}),describe("load function",()=>{const e={to:"0x1111111254fb6c44bac0bed2854e76f90643097d",selector:"0xa1251d75",chainId:1,deviceModelId:p.STAX},a="010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100";it("should return error context when getGatedDescriptor returns Left and proxy resolution fails",async()=>{const t=new Error("Failed to fetch gated descriptors");vi.spyOn(o,"getGatedDescriptor").mockResolvedValue(f(t)),vi.spyOn(d,"getProxyImplementationAddress").mockResolvedValue(f(new Error("Not a proxy")));const l=await r.load(e);expect(l).toEqual([{type:i.ERROR,error:t}]),expect(o.getGatedDescriptor).toHaveBeenCalledWith({contractAddress:e.to,selector:e.selector,chainId:e.chainId}),expect(d.getProxyImplementationAddress).toHaveBeenCalledWith({proxyAddress:e.to,chainId:e.chainId,challenge:"",calldata:"0x"}),expect(n.loadCertificate).not.toHaveBeenCalled()}),it("should return gated signing context when getGatedDescriptor succeeds",async()=>{vi.spyOn(o,"getGatedDescriptor").mockResolvedValue(c({signedDescriptor:a}));const t=await r.load(e);expect(t).toHaveLength(1),expect(t[0]).toMatchObject({type:i.ETHEREUM_GATED_SIGNING,payload:a,certificate:g}),expect(o.getGatedDescriptor).toHaveBeenCalledWith({contractAddress:e.to,selector:e.selector,chainId:e.chainId}),expect(n.loadCertificate).toHaveBeenCalledWith({keyId:x.CalGatedSigning,keyUsage:m.GatedSigning,targetDevice:e.deviceModelId})}),it("should pass to as contractAddress to getGatedDescriptor",async()=>{const t="0xabcdef1234567890abcdef1234567890abcdef12";vi.spyOn(o,"getGatedDescriptor").mockResolvedValue(c({signedDescriptor:a})),await r.load({...e,to:t}),expect(o.getGatedDescriptor).toHaveBeenCalledWith(expect.objectContaining({contractAddress:t}))}),it("should request certificate for correct device model",async()=>{vi.spyOn(o,"getGatedDescriptor").mockResolvedValue(c({signedDescriptor:a})),await r.load({...e,deviceModelId:p.FLEX}),expect(n.loadCertificate).toHaveBeenCalledWith({keyId:x.CalGatedSigning,keyUsage:m.GatedSigning,targetDevice:p.FLEX})}),it("should reject when certificate loading fails",async()=>{const t=new Error("Certificate loading failed");vi.spyOn(o,"getGatedDescriptor").mockResolvedValue(c({signedDescriptor:a})),vi.spyOn(n,"loadCertificate").mockRejectedValue(t),await expect(r.load(e)).rejects.toThrow(t)}),it("should return PROXY_INFO and GATED_SIGNING when to is proxy and gated descriptor exists for implementation",async()=>{const t="0xabcdef1234567890abcdef1234567890abcdef12",l="0xproxy-descriptor";vi.spyOn(o,"getGatedDescriptor").mockResolvedValueOnce(f(new Error("No gated descriptor"))).mockResolvedValueOnce(c({signedDescriptor:a})),vi.spyOn(d,"getProxyImplementationAddress").mockResolvedValue(c({implementationAddress:t,signedDescriptor:l,keyId:"domain-metadata",keyUsage:"trusted-name"}));const u=await r.load(e);expect(u).toHaveLength(2),expect(u[0]).toMatchObject({type:i.ETHEREUM_PROXY_INFO,payload:l}),expect(u[1]).toMatchObject({type:i.ETHEREUM_GATED_SIGNING,payload:a}),expect(o.getGatedDescriptor).toHaveBeenCalledTimes(2),expect(o.getGatedDescriptor).toHaveBeenNthCalledWith(1,{contractAddress:e.to,selector:e.selector,chainId:e.chainId}),expect(o.getGatedDescriptor).toHaveBeenNthCalledWith(2,{contractAddress:t.toLowerCase(),selector:e.selector,chainId:e.chainId})})})});
|
|
2
2
|
//# sourceMappingURL=GatedSigningContextLoader.test.js.map
|
package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport {\n type GatedSigningContextInput,\n GatedSigningContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningContextLoader\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"GatedSigningContextLoader\", () => {\n const mockGatedDescriptorDataSource: GatedDescriptorDataSource = {\n getGatedDescriptor: vi.fn(),\n getGatedDescriptorForTypedData: vi.fn(),\n };\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockProxyDataSource: ProxyDataSource = {\n getProxyImplementationAddress: vi.fn(),\n };\n\n const loader = new GatedSigningContextLoader(\n mockGatedDescriptorDataSource,\n mockCertificateLoader,\n mockProxyDataSource,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.ETHEREUM_TOKEN]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.ETHEREUM_DYNAMIC_NETWORK,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: undefined }, \"missing to\"],\n [{ ...validInput, selector: undefined }, \"missing selector\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: \"0x\" }, \"empty to (0x)\"],\n [{ ...validInput, to: \"not-hex\" }, \"non-hex to\"],\n [{ ...validInput, selector: \"not-hex\" }, \"non-hex selector\"],\n [{ ...validInput, chainId: \"1\" as unknown as number }, \"string chainId\"],\n [{ ...validInput, chainId: null as unknown as number }, \"null chainId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n });\n\n describe(\"load function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptor returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"Failed to fetch gated descriptors\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Left(error));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(Left(new Error(\"Not a proxy\")));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.to,\n chainId: validInput.chainId,\n challenge: \"\",\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptor succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: mockCertificate,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: validInput.deviceModelId,\n });\n });\n\n it(\"should pass to as contractAddress to getGatedDescriptor\", async () => {\n const customTo = \"0xabcdef1234567890abcdef1234567890abcdef12\";\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n to: customTo,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: customTo,\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n deviceModelId: DeviceModelId.FLEX,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: DeviceModelId.FLEX,\n });\n });\n\n it(\"should reject when certificate loading fails\", async () => {\n const certificateError = new Error(\"Certificate loading failed\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should return PROXY_INFO and GATED_SIGNING when to is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptor\")\n .mockResolvedValueOnce(Left(new Error(\"No gated descriptor\")))\n .mockResolvedValueOnce(Right({ signedDescriptor }));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(\n Right({\n implementationAddress,\n signedDescriptor: proxySignedDescriptor,\n keyId: \"domain-metadata\",\n keyUsage: \"trusted-name\",\n }),\n );\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxySignedDescriptor,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,iBAAAA,MAAqB,kCAC9B,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAG5B,OAEE,6BAAAC,MACK,oEAGP,OAAS,SAAAC,MAAa,uCACtB,OAAS,YAAAC,MAAgB,0CAEzB,OAAS,wBAAAC,MAA4B,kCAErC,SAAS,4BAA6B,IAAM,CAC1C,MAAMC,EAA2D,CAC/D,mBAAoB,GAAG,GAAG,EAC1B,+BAAgC,GAAG,GAAG,CACxC,EAEMC,EAA8C,CAClD,gBAAiB,GAAG,GAAG,CACzB,EAEMC,EAAuC,CAC3C,8BAA+B,GAAG,GAAG,CACvC,EAEMC,EAAS,
|
|
6
|
-
"names": ["DeviceModelId", "Left", "Right", "GatedSigningContextLoader", "KeyId", "KeyUsage", "ClearSignContextType", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "signedDescriptor", "error", "result", "customTo", "certificateError", "implementationAddress", "proxySignedDescriptor"]
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type GatedDescriptorDataSource } from \"@/modules/ethereum/gated-signing/data/GatedDescriptorDataSource\";\nimport {\n type GatedSigningContextInput,\n GatedSigningContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningContextLoader\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"GatedSigningContextLoader\", () => {\n const mockGatedDescriptorDataSource: GatedDescriptorDataSource = {\n getGatedDescriptor: vi.fn(),\n getGatedDescriptorForTypedData: vi.fn(),\n };\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockProxyDataSource: ProxyDataSource = {\n getProxyImplementationAddress: vi.fn(),\n };\n\n const mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n });\n\n const loader = new GatedSigningContextLoader(\n mockGatedDescriptorDataSource,\n mockCertificateLoader,\n mockProxyDataSource,\n mockLoggerFactory,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.ETHEREUM_TOKEN]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.ETHEREUM_DYNAMIC_NETWORK,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: undefined }, \"missing to\"],\n [{ ...validInput, selector: undefined }, \"missing selector\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, to: \"0x\" }, \"empty to (0x)\"],\n [{ ...validInput, to: \"not-hex\" }, \"non-hex to\"],\n [{ ...validInput, selector: \"not-hex\" }, \"non-hex selector\"],\n [{ ...validInput, chainId: \"1\" as unknown as number }, \"string chainId\"],\n [{ ...validInput, chainId: null as unknown as number }, \"null chainId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n });\n\n describe(\"load function\", () => {\n const validInput: GatedSigningContextInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptor returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"Failed to fetch gated descriptors\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Left(error));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(Left(new Error(\"Not a proxy\")));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.to,\n chainId: validInput.chainId,\n challenge: \"\",\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptor succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate: mockCertificate,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith({\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: validInput.deviceModelId,\n });\n });\n\n it(\"should pass to as contractAddress to getGatedDescriptor\", async () => {\n const customTo = \"0xabcdef1234567890abcdef1234567890abcdef12\";\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n to: customTo,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: customTo,\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n ...validInput,\n deviceModelId: DeviceModelId.FLEX,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: DeviceModelId.FLEX,\n });\n });\n\n it(\"should reject when certificate loading fails\", async () => {\n const certificateError = new Error(\"Certificate loading failed\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptor\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should return PROXY_INFO and GATED_SIGNING when to is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptor\")\n .mockResolvedValueOnce(Left(new Error(\"No gated descriptor\")))\n .mockResolvedValueOnce(Right({ signedDescriptor }));\n vi.spyOn(\n mockProxyDataSource,\n \"getProxyImplementationAddress\",\n ).mockResolvedValue(\n Right({\n implementationAddress,\n signedDescriptor: proxySignedDescriptor,\n keyId: \"domain-metadata\",\n keyUsage: \"trusted-name\",\n }),\n );\n\n const result = await loader.load(validInput);\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_PROXY_INFO,\n payload: proxySignedDescriptor,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress: validInput.to,\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptor,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n selector: validInput.selector,\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "Left", "Right", "GatedSigningContextLoader", "KeyId", "KeyUsage", "ClearSignContextType", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "mockLoggerFactory", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "signedDescriptor", "error", "result", "customTo", "certificateError", "implementationAddress", "proxySignedDescriptor"]
|
|
7
7
|
}
|