@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.
Files changed (67) hide show
  1. package/lib/cjs/package.json +2 -1
  2. package/lib/cjs/src/ContextModuleBuilder.js +1 -1
  3. package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
  4. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
  5. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
  6. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
  7. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
  8. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
  9. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
  10. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
  11. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
  12. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  13. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  14. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
  15. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
  16. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
  17. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
  18. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
  19. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
  20. package/lib/cjs/src/shared/utils/bs58Encoder.js +2 -0
  21. package/lib/cjs/src/shared/utils/bs58Encoder.js.map +7 -0
  22. package/lib/cjs/src/shared/utils/uint8ArrayCodec.js +2 -0
  23. package/lib/cjs/src/shared/utils/uint8ArrayCodec.js.map +7 -0
  24. package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js +2 -0
  25. package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
  26. package/lib/esm/package.json +2 -1
  27. package/lib/esm/src/ContextModuleBuilder.js +1 -1
  28. package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
  29. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
  30. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
  31. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
  32. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
  33. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
  34. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
  35. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
  36. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
  37. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  38. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  39. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
  40. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
  41. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
  42. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
  43. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
  44. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
  45. package/lib/esm/src/shared/utils/bs58Encoder.js +2 -0
  46. package/lib/esm/src/shared/utils/bs58Encoder.js.map +7 -0
  47. package/lib/esm/src/shared/utils/uint8ArrayCodec.js +2 -0
  48. package/lib/esm/src/shared/utils/uint8ArrayCodec.js.map +7 -0
  49. package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js +2 -0
  50. package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
  51. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts +3 -2
  52. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts.map +1 -1
  53. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts +3 -2
  54. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts.map +1 -1
  55. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts +16 -2
  56. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
  57. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts +2 -0
  58. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts.map +1 -0
  59. package/lib/types/src/modules/solana/lifi/data/HttpLifiDataSource.d.ts.map +1 -1
  60. package/lib/types/src/shared/utils/bs58Encoder.d.ts +9 -0
  61. package/lib/types/src/shared/utils/bs58Encoder.d.ts.map +1 -0
  62. package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts +3 -0
  63. package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts.map +1 -0
  64. package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts +2 -0
  65. package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts.map +1 -0
  66. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  67. package/package.json +5 -4
@@ -1,2 +1,2 @@
1
- var k=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var D=(i,e,r,t)=>{for(var a=t>1?void 0:t?_(e,r):e,o=i.length-1,n;o>=0;o--)(n=i[o])&&(a=(t?n(e,r,a):n(a))||a);return t&&a&&k(e,r,a),a},p=(i,e)=>(r,t)=>e(r,t,i);import{inject as m,injectable as w}from"inversify";import{gatedSigningTypes as v}from"../../../../modules/ethereum/gated-signing/di/gatedSigningTypes";import{proxyTypes as A}from"../../../../modules/ethereum/proxy/di/proxyTypes";import{getSchemaHash as H}from"../../../../modules/ethereum/typed-data/utils/getSchemaHash";import{pkiTypes as P}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyId as C}from"../../../../modules/multichain/pki/model/KeyId";import{KeyUsage as T}from"../../../../modules/multichain/pki/model/KeyUsage";import{ClearSignContextType as s}from"../../../../shared/model/ClearSignContext";const L="0x0000000000000000000000000000000000000000",U=[s.ETHEREUM_GATED_SIGNING];function b(i){if(!i||typeof i!="object")return!1;const e=i;if(!e.types||typeof e.types!="object"||Array.isArray(e.types))return!1;const r=e.types;for(const t of Object.keys(r)){if(typeof t!="string")return!1;const a=r[t];if(!Array.isArray(a))return!1;for(const o of a)if(!o||typeof o!="object"||typeof o.name!="string"||typeof o.type!="string")return!1}return!0}let d=class{constructor(e,r,t){this._dataSource=e;this._certificateLoader=r;this._proxyDataSource=t}canHandle(e,r){return U.every(t=>r.includes(t))&&typeof e=="object"&&e!==null&&"data"in e&&b(e.data)&&"chainId"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&"challenge"in e&&typeof e.challenge=="string"}async load({data:e,chainId:r,deviceModelId:t,challenge:a}){const o=e.domain?.verifyingContract?.toLowerCase()??L,n=o.startsWith("0x")?o:`0x${o}`,l=H(e.types),y=await this._dataSource.getGatedDescriptorForTypedData({contractAddress:n,schemaHash:l,chainId:r});if(y.isRight()){const{signedDescriptor:g}=y.unsafeCoerce(),R=await this._certificateLoader.loadCertificate({keyId:C.CalGatedSigning,keyUsage:T.GatedSigning,targetDevice:t});return[{type:s.ETHEREUM_GATED_SIGNING,payload:g,certificate:R}]}const u=y.caseOf({Left:g=>g,Right:()=>new Error("unreachable")}),S=await this._proxyDataSource.getProxyImplementationAddress({proxyAddress:n,chainId:r,challenge:a,calldata:"0x"});if(S.isLeft())return[{type:s.ERROR,error:u}];const c=S.unsafeCoerce(),f=c.implementationAddress.toLowerCase(),h=f.startsWith("0x")?f:`0x${f}`,x=await this._dataSource.getGatedDescriptorForTypedData({contractAddress:h,schemaHash:l,chainId:r});if(x.isLeft())return[{type:s.ERROR,error:u}];const{signedDescriptor:E}=x.unsafeCoerce(),[G,I]=await Promise.all([this._certificateLoader.loadCertificate({keyId:c.keyId,keyUsage:c.keyUsage,targetDevice:t}),this._certificateLoader.loadCertificate({keyId:C.CalGatedSigning,keyUsage:T.GatedSigning,targetDevice:t})]);return[{type:s.ETHEREUM_PROXY_INFO,payload:c.signedDescriptor,certificate:G},{type:s.ETHEREUM_GATED_SIGNING,payload:E,certificate:I}]}};d=D([w(),p(0,m(v.GatedDescriptorDataSource)),p(1,m(P.PkiCertificateLoader)),p(2,m(A.ProxyDataSource))],d);export{d as GatedSigningTypedDataContextLoader};
1
+ var I=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var E=(n,e,t,r)=>{for(var a=r>1?void 0:r?k(e,t):e,o=n.length-1,i;o>=0;o--)(i=n[o])&&(a=(r?i(e,t,a):i(a))||a);return r&&a&&I(e,t,a),a},p=(n,e)=>(t,r)=>e(t,r,n);import{inject as l,injectable as v}from"inversify";import{configTypes as w}from"../../../../config/di/configTypes";import{gatedSigningTypes as P}from"../../../../modules/ethereum/gated-signing/di/gatedSigningTypes";import{proxyTypes as H}from"../../../../modules/ethereum/proxy/di/proxyTypes";import{getSchemaHash as A}from"../../../../modules/ethereum/typed-data/utils/getSchemaHash";import{pkiTypes as L}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyId as C}from"../../../../modules/multichain/pki/model/KeyId";import{KeyUsage as T}from"../../../../modules/multichain/pki/model/KeyUsage";import{ClearSignContextType as s}from"../../../../shared/model/ClearSignContext";const b="0x0000000000000000000000000000000000000000",N=[s.ETHEREUM_GATED_SIGNING];function U(n){if(!n||typeof n!="object")return!1;const e=n;if(!e.types||typeof e.types!="object"||Array.isArray(e.types))return!1;const t=e.types;for(const r of Object.keys(t)){if(typeof r!="string")return!1;const a=t[r];if(!Array.isArray(a))return!1;for(const o of a)if(!o||typeof o!="object"||typeof o.name!="string"||typeof o.type!="string")return!1}return!0}let f=class{constructor(e,t,r,a){this._dataSource=e;this._certificateLoader=t;this._proxyDataSource=r;this.logger=a("GatedSigningTypedDataContextLoader")}logger;canHandle(e,t){return N.every(r=>t.includes(r))&&typeof e=="object"&&e!==null&&"data"in e&&U(e.data)&&"chainId"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&"challenge"in e&&typeof e.challenge=="string"}async load({data:e,chainId:t,deviceModelId:r,challenge:a}){const o=e.domain?.verifyingContract?.toLowerCase()??b,i=o.startsWith("0x")?o:`0x${o}`,d=A(e.types),m=await this._dataSource.getGatedDescriptorForTypedData({contractAddress:i,schemaHash:d,chainId:t});if(m.isRight()){const{signedDescriptor:c}=m.unsafeCoerce(),_=await this._certificateLoader.loadCertificate({keyId:C.CalGatedSigning,keyUsage:T.GatedSigning,targetDevice:r});return this.logger.debug("load result",{data:{path:"direct",verifyingContract:i,schemaHash:d,chainId:t,contextTypes:[s.ETHEREUM_GATED_SIGNING]}}),[{type:s.ETHEREUM_GATED_SIGNING,payload:c,certificate:_}]}const g=m.caseOf({Left:c=>c,Right:()=>new Error("unreachable")}),u=await this._proxyDataSource.getProxyImplementationAddress({proxyAddress:i,chainId:t,challenge:a,calldata:"0x"});if(u.isLeft()){const c=u.extract();return this.logger.warn("Direct gated descriptor lookup failed and proxy resolution failed",{data:{verifyingContract:i,schemaHash:d,chainId:t,directError:g.message,proxyError:c.message}}),[{type:s.ERROR,error:g}]}const y=u.unsafeCoerce(),x=y.implementationAddress.toLowerCase(),S=x.startsWith("0x")?x:`0x${x}`,D=await this._dataSource.getGatedDescriptorForTypedData({contractAddress:S,schemaHash:d,chainId:t});if(D.isLeft()){const c=D.extract();return this.logger.warn("No gated descriptor found for proxy implementation address",{data:{verifyingContract:i,implementationAddress:S,schemaHash:d,chainId:t,directError:g.message,implError:c.message}}),[{type:s.ERROR,error:g}]}const{signedDescriptor:h}=D.unsafeCoerce(),[G,R]=await Promise.all([this._certificateLoader.loadCertificate({keyId:y.keyId,keyUsage:y.keyUsage,targetDevice:r}),this._certificateLoader.loadCertificate({keyId:C.CalGatedSigning,keyUsage:T.GatedSigning,targetDevice:r})]);return this.logger.debug("load result",{data:{path:"proxy",verifyingContract:i,implementationAddress:S,schemaHash:d,chainId:t,contextTypes:[s.ETHEREUM_PROXY_INFO,s.ETHEREUM_GATED_SIGNING]}}),[{type:s.ETHEREUM_PROXY_INFO,payload:y.signedDescriptor,certificate:G},{type:s.ETHEREUM_GATED_SIGNING,payload:h,certificate:R}]}};f=E([v(),p(0,l(P.GatedDescriptorDataSource)),p(1,l(L.PkiCertificateLoader)),p(2,l(H.ProxyDataSource)),p(3,l(w.ContextModuleLoggerFactory))],f);export{f as GatedSigningTypedDataContextLoader};
2
2
  //# sourceMappingURL=GatedSigningTypedDataContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.ts"],
4
- "sourcesContent": ["import {\n DeviceModelId,\n type HexaString,\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 { TypedDataSchema } from \"@/modules/ethereum/model/TypedDataContext\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/modules/ethereum/proxy/di/proxyTypes\";\nimport { getSchemaHash } from \"@/modules/ethereum/typed-data/utils/getSchemaHash\";\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\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type GatedSigningTypedDataContextInput = {\n data: {\n types: TypedDataSchema;\n domain?: { verifyingContract?: string };\n };\n chainId: number;\n deviceModelId: DeviceModelId;\n challenge: string;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n];\n\nfunction hasTypedDataShape(\n data: unknown,\n): data is { types: TypedDataSchema; domain?: { verifyingContract?: string } } {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n if (\n !obj[\"types\"] ||\n typeof obj[\"types\"] !== \"object\" ||\n Array.isArray(obj[\"types\"])\n ) {\n return false;\n }\n const types = obj[\"types\"] as Record<string, unknown>;\n for (const key of Object.keys(types)) {\n if (typeof key !== \"string\") return false;\n const value = types[key];\n if (!Array.isArray(value)) return false;\n for (const item of value) {\n if (\n !item ||\n typeof item !== \"object\" ||\n typeof (item as { name?: unknown }).name !== \"string\" ||\n typeof (item as { type?: unknown }).type !== \"string\"\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n@injectable()\nexport class GatedSigningTypedDataContextLoader\n implements ContextLoader<GatedSigningTypedDataContextInput>\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 GatedSigningTypedDataContextInput {\n return (\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type)) &&\n typeof input === \"object\" &&\n input !== null &&\n \"data\" in input &&\n hasTypedDataShape((input as GatedSigningTypedDataContextInput).data) &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n (input as GatedSigningTypedDataContextInput).deviceModelId !==\n undefined &&\n \"challenge\" in input &&\n typeof (input as GatedSigningTypedDataContextInput).challenge === \"string\"\n );\n }\n\n async load({\n data,\n chainId,\n deviceModelId,\n challenge,\n }: GatedSigningTypedDataContextInput): Promise<ClearSignContext[]> {\n const raw = data.domain?.verifyingContract?.toLowerCase() ?? ZERO_ADDRESS;\n const verifyingContract: HexaString = raw.startsWith(\"0x\")\n ? (raw as HexaString)\n : (`0x${raw}` as HexaString);\n const schemaHash = getSchemaHash(data.types);\n\n const directResult = await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: verifyingContract,\n schemaHash,\n chainId,\n });\n\n if (directResult.isRight()) {\n const { signedDescriptor } = directResult.unsafeCoerce();\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n });\n return [\n {\n type: ClearSignContextType.ETHEREUM_GATED_SIGNING,\n payload: signedDescriptor,\n certificate,\n },\n ];\n }\n\n const firstError: Error = directResult.caseOf({\n Left: (error) => error,\n Right: () => new Error(\"unreachable\"),\n });\n\n const proxyResult =\n await this._proxyDataSource.getProxyImplementationAddress({\n proxyAddress: verifyingContract,\n chainId,\n challenge,\n calldata: \"0x\",\n });\n\n if (proxyResult.isLeft()) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\n }\n\n const proxyData = proxyResult.unsafeCoerce();\n const implRaw = proxyData.implementationAddress.toLowerCase();\n const implementationAddress: HexaString = implRaw.startsWith(\"0x\")\n ? (implRaw as HexaString)\n : (`0x${implRaw}` as HexaString);\n\n const implGatedResult =\n await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: implementationAddress,\n schemaHash,\n chainId,\n });\n\n if (implGatedResult.isLeft()) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\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._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\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"],
5
- "mappings": "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",
6
- "names": ["inject", "injectable", "gatedSigningTypes", "proxyTypes", "getSchemaHash", "pkiTypes", "KeyId", "KeyUsage", "ClearSignContextType", "ZERO_ADDRESS", "SUPPORTED_TYPES", "ClearSignContextType", "hasTypedDataShape", "data", "obj", "types", "key", "value", "item", "GatedSigningTypedDataContextLoader", "_dataSource", "_certificateLoader", "_proxyDataSource", "input", "expectedTypes", "type", "chainId", "deviceModelId", "challenge", "raw", "verifyingContract", "schemaHash", "getSchemaHash", "directResult", "signedDescriptor", "certificate", "KeyId", "KeyUsage", "firstError", "error", "proxyResult", "proxyData", "implRaw", "implementationAddress", "implGatedResult", "proxyCertificate", "gatedCertificate", "__decorateClass", "injectable", "__decorateParam", "inject", "gatedSigningTypes", "pkiTypes", "proxyTypes"]
4
+ "sourcesContent": ["import {\n DeviceModelId,\n type HexaString,\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 { TypedDataSchema } from \"@/modules/ethereum/model/TypedDataContext\";\nimport type { ProxyDataSource } from \"@/modules/ethereum/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/modules/ethereum/proxy/di/proxyTypes\";\nimport { getSchemaHash } from \"@/modules/ethereum/typed-data/utils/getSchemaHash\";\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\nconst ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport type GatedSigningTypedDataContextInput = {\n data: {\n types: TypedDataSchema;\n domain?: { verifyingContract?: string };\n };\n chainId: number;\n deviceModelId: DeviceModelId;\n challenge: string;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.ETHEREUM_GATED_SIGNING,\n];\n\nfunction hasTypedDataShape(\n data: unknown,\n): data is { types: TypedDataSchema; domain?: { verifyingContract?: string } } {\n if (!data || typeof data !== \"object\") return false;\n const obj = data as Record<string, unknown>;\n if (\n !obj[\"types\"] ||\n typeof obj[\"types\"] !== \"object\" ||\n Array.isArray(obj[\"types\"])\n ) {\n return false;\n }\n const types = obj[\"types\"] as Record<string, unknown>;\n for (const key of Object.keys(types)) {\n if (typeof key !== \"string\") return false;\n const value = types[key];\n if (!Array.isArray(value)) return false;\n for (const item of value) {\n if (\n !item ||\n typeof item !== \"object\" ||\n typeof (item as { name?: unknown }).name !== \"string\" ||\n typeof (item as { type?: unknown }).type !== \"string\"\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n@injectable()\nexport class GatedSigningTypedDataContextLoader\n implements ContextLoader<GatedSigningTypedDataContextInput>\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(\"GatedSigningTypedDataContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is GatedSigningTypedDataContextInput {\n return (\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type)) &&\n typeof input === \"object\" &&\n input !== null &&\n \"data\" in input &&\n hasTypedDataShape((input as GatedSigningTypedDataContextInput).data) &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n (input as GatedSigningTypedDataContextInput).deviceModelId !==\n undefined &&\n \"challenge\" in input &&\n typeof (input as GatedSigningTypedDataContextInput).challenge === \"string\"\n );\n }\n\n async load({\n data,\n chainId,\n deviceModelId,\n challenge,\n }: GatedSigningTypedDataContextInput): Promise<ClearSignContext[]> {\n const raw = data.domain?.verifyingContract?.toLowerCase() ?? ZERO_ADDRESS;\n const verifyingContract: HexaString = raw.startsWith(\"0x\")\n ? (raw as HexaString)\n : (`0x${raw}` as HexaString);\n const schemaHash = getSchemaHash(data.types);\n\n const directResult = await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: verifyingContract,\n schemaHash,\n chainId,\n });\n\n if (directResult.isRight()) {\n const { signedDescriptor } = directResult.unsafeCoerce();\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n });\n this.logger.debug(\"load result\", {\n data: {\n path: \"direct\",\n verifyingContract,\n schemaHash,\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 firstError: Error = directResult.caseOf({\n Left: (error) => error,\n Right: () => new Error(\"unreachable\"),\n });\n\n const proxyResult =\n await this._proxyDataSource.getProxyImplementationAddress({\n proxyAddress: verifyingContract,\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 \"Direct gated descriptor lookup failed and proxy resolution failed\",\n {\n data: {\n verifyingContract,\n schemaHash,\n chainId,\n directError: firstError.message,\n proxyError: proxyError.message,\n },\n },\n );\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\n }\n\n const proxyData = proxyResult.unsafeCoerce();\n const implRaw = proxyData.implementationAddress.toLowerCase();\n const implementationAddress: HexaString = implRaw.startsWith(\"0x\")\n ? (implRaw as HexaString)\n : (`0x${implRaw}` as HexaString);\n\n const implGatedResult =\n await this._dataSource.getGatedDescriptorForTypedData({\n contractAddress: implementationAddress,\n schemaHash,\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 verifyingContract,\n implementationAddress,\n schemaHash,\n chainId,\n directError: firstError.message,\n implError: implError.message,\n },\n },\n );\n return [\n {\n type: ClearSignContextType.ERROR,\n error: firstError,\n },\n ];\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._certificateLoader.loadCertificate({\n keyId: KeyId.CalGatedSigning,\n keyUsage: KeyUsage.GatedSigning,\n targetDevice: deviceModelId,\n }),\n ]);\n\n this.logger.debug(\"load result\", {\n data: {\n path: \"proxy\",\n verifyingContract,\n implementationAddress,\n schemaHash,\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"],
5
+ "mappings": "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",
6
+ "names": ["inject", "injectable", "configTypes", "gatedSigningTypes", "proxyTypes", "getSchemaHash", "pkiTypes", "KeyId", "KeyUsage", "ClearSignContextType", "ZERO_ADDRESS", "SUPPORTED_TYPES", "ClearSignContextType", "hasTypedDataShape", "data", "obj", "types", "key", "value", "item", "GatedSigningTypedDataContextLoader", "_dataSource", "_certificateLoader", "_proxyDataSource", "loggerFactory", "input", "expectedTypes", "type", "chainId", "deviceModelId", "challenge", "raw", "verifyingContract", "schemaHash", "getSchemaHash", "directResult", "signedDescriptor", "certificate", "KeyId", "KeyUsage", "firstError", "error", "proxyResult", "proxyError", "proxyData", "implRaw", "implementationAddress", "implGatedResult", "implError", "proxyCertificate", "gatedCertificate", "__decorateClass", "injectable", "__decorateParam", "inject", "gatedSigningTypes", "pkiTypes", "proxyTypes", "configTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as i}from"@ledgerhq/device-management-kit";import{Left as g,Right as s}from"purify-ts";import{GatedSigningTypedDataContextLoader as u}from"../../../../modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader";import{KeyId as m}from"../../../../modules/multichain/pki/model/KeyId";import{KeyUsage as f}from"../../../../modules/multichain/pki/model/KeyUsage";import{ClearSignContextType as r}from"../../../../shared/model/ClearSignContext";describe("GatedSigningTypedDataContextLoader",()=>{const a={getGatedDescriptor:vi.fn(),getGatedDescriptorForTypedData:vi.fn()},c={loadCertificate:vi.fn()},l={getProxyImplementationAddress:vi.fn()},t=new u(a,c,l),h={keyUsageNumber:1,payload:new Uint8Array([1,2,3])},n=[r.ETHEREUM_GATED_SIGNING],e={data:{types:{EIP712Domain:[{name:"name",type:"string"},{name:"chainId",type:"uint256"}],Mail:[{name:"subject",type:"string"}]},domain:{verifyingContract:"0x1111111254fb6c44bac0bed2854e76f90643097d"}},chainId:1,deviceModelId:i.STAX,challenge:"test-challenge"};beforeEach(()=>{vi.resetAllMocks(),vi.spyOn(c,"loadCertificate").mockResolvedValue(h)}),describe("canHandle",()=>{it("should return true for valid typed data input",()=>{expect(t.canHandle(e,n)).toBe(!0)}),it("should return false when expected types do not include GATED_SIGNING",()=>{expect(t.canHandle(e,[r.ETHEREUM_TOKEN])).toBe(!1),expect(t.canHandle(e,[r.ETHEREUM_DYNAMIC_NETWORK])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"]])("should return false for %s",(d,o)=>{expect(t.canHandle(d,n)).toBe(!1)}),it("should return false for transaction-style input (selector, to)",()=>{const d={to:"0x1111111254fb6c44bac0bed2854e76f90643097d",selector:"0xa1251d75",chainId:1,deviceModelId:i.STAX};expect(t.canHandle(d,n)).toBe(!1)}),it("should return false when data is missing",()=>{expect(t.canHandle({chainId:1,deviceModelId:i.STAX},n)).toBe(!1)}),it("should return false when data.types is not a valid schema",()=>{expect(t.canHandle({data:{types:"not-an-object"},chainId:1,deviceModelId:i.STAX,challenge:e.challenge},n)).toBe(!1),expect(t.canHandle({data:{types:{}},chainId:1,deviceModelId:i.STAX,challenge:e.challenge},n)).toBe(!0)}),it("should return false when chainId or deviceModelId is missing",()=>{expect(t.canHandle({data:e.data,deviceModelId:i.STAX,challenge:e.challenge},n)).toBe(!1),expect(t.canHandle({data:e.data,chainId:1,challenge:e.challenge},n)).toBe(!1)}),it("should return false when challenge is missing",()=>{expect(t.canHandle({data:e.data,chainId:1,deviceModelId:i.STAX},n)).toBe(!1)})}),describe("load",()=>{const d="010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100";it("should return error context when getGatedDescriptorForTypedData returns Left and proxy resolution fails",async()=>{const o=new Error("No gated descriptor for schema hash");vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(g(o)),vi.spyOn(l,"getProxyImplementationAddress").mockResolvedValue(g(new Error("Not a proxy")));const p=await t.load(e);expect(p).toEqual([{type:r.ERROR,error:o}]),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith({contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(l.getProxyImplementationAddress).toHaveBeenCalledWith({proxyAddress:e.data.domain.verifyingContract.toLowerCase(),chainId:e.chainId,challenge:e.challenge,calldata:"0x"}),expect(c.loadCertificate).not.toHaveBeenCalled()}),it("should return gated signing context when getGatedDescriptorForTypedData succeeds",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d}));const o=await t.load(e);expect(o).toHaveLength(1),expect(o[0]).toMatchObject({type:r.ETHEREUM_GATED_SIGNING,payload:d,certificate:h}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith({contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(c.loadCertificate).toHaveBeenCalledWith({keyId:m.CalGatedSigning,keyUsage:f.GatedSigning,targetDevice:e.deviceModelId})}),it("should use zero address when domain.verifyingContract is missing",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d})),await t.load({data:{types:e.data.types},chainId:e.chainId,deviceModelId:e.deviceModelId,challenge:e.challenge}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith(expect.objectContaining({contractAddress:"0x0000000000000000000000000000000000000000"}))}),it("should request certificate for correct device model",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d})),await t.load({...e,deviceModelId:i.FLEX}),expect(c.loadCertificate).toHaveBeenCalledWith({keyId:m.CalGatedSigning,keyUsage:f.GatedSigning,targetDevice:i.FLEX})}),it("should reject when certificate loading fails",async()=>{const o=new Error("Certificate loading failed");vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d})),vi.spyOn(c,"loadCertificate").mockRejectedValue(o),await expect(t.load(e)).rejects.toThrow(o)}),it("should return PROXY_INFO and GATED_SIGNING when verifying contract is proxy and gated descriptor exists for implementation",async()=>{const o="0xabcdef1234567890abcdef1234567890abcdef12",p="0xproxy-descriptor";vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValueOnce(g(new Error("No gated descriptor"))).mockResolvedValueOnce(s({signedDescriptor:d})),vi.spyOn(l,"getProxyImplementationAddress").mockResolvedValue(s({implementationAddress:o,signedDescriptor:p,keyId:"domain-metadata",keyUsage:"trusted-name"}));const y=await t.load(e);expect(y).toHaveLength(2),expect(y[0]).toMatchObject({type:r.ETHEREUM_PROXY_INFO,payload:p}),expect(y[1]).toMatchObject({type:r.ETHEREUM_GATED_SIGNING,payload:d}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledTimes(2),expect(a.getGatedDescriptorForTypedData).toHaveBeenNthCalledWith(1,{contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(a.getGatedDescriptorForTypedData).toHaveBeenNthCalledWith(2,{contractAddress:o.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId})})})});
1
+ import{DeviceModelId as r}from"@ledgerhq/device-management-kit";import{Left as g,Right as s}from"purify-ts";import{GatedSigningTypedDataContextLoader as x}from"../../../../modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader";import{KeyId as f}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("GatedSigningTypedDataContextLoader",()=>{const a={getGatedDescriptor:vi.fn(),getGatedDescriptorForTypedData:vi.fn()},c={loadCertificate:vi.fn()},l={getProxyImplementationAddress:vi.fn()},u=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}),t=new x(a,c,l,u),h={keyUsageNumber:1,payload:new Uint8Array([1,2,3])},n=[i.ETHEREUM_GATED_SIGNING],e={data:{types:{EIP712Domain:[{name:"name",type:"string"},{name:"chainId",type:"uint256"}],Mail:[{name:"subject",type:"string"}]},domain:{verifyingContract:"0x1111111254fb6c44bac0bed2854e76f90643097d"}},chainId:1,deviceModelId:r.STAX,challenge:"test-challenge"};beforeEach(()=>{vi.resetAllMocks(),vi.spyOn(c,"loadCertificate").mockResolvedValue(h)}),describe("canHandle",()=>{it("should return true for valid typed data input",()=>{expect(t.canHandle(e,n)).toBe(!0)}),it("should return false when expected types do not include GATED_SIGNING",()=>{expect(t.canHandle(e,[i.ETHEREUM_TOKEN])).toBe(!1),expect(t.canHandle(e,[i.ETHEREUM_DYNAMIC_NETWORK])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"]])("should return false for %s",(d,o)=>{expect(t.canHandle(d,n)).toBe(!1)}),it("should return false for transaction-style input (selector, to)",()=>{const d={to:"0x1111111254fb6c44bac0bed2854e76f90643097d",selector:"0xa1251d75",chainId:1,deviceModelId:r.STAX};expect(t.canHandle(d,n)).toBe(!1)}),it("should return false when data is missing",()=>{expect(t.canHandle({chainId:1,deviceModelId:r.STAX},n)).toBe(!1)}),it("should return false when data.types is not a valid schema",()=>{expect(t.canHandle({data:{types:"not-an-object"},chainId:1,deviceModelId:r.STAX,challenge:e.challenge},n)).toBe(!1),expect(t.canHandle({data:{types:{}},chainId:1,deviceModelId:r.STAX,challenge:e.challenge},n)).toBe(!0)}),it("should return false when chainId or deviceModelId is missing",()=>{expect(t.canHandle({data:e.data,deviceModelId:r.STAX,challenge:e.challenge},n)).toBe(!1),expect(t.canHandle({data:e.data,chainId:1,challenge:e.challenge},n)).toBe(!1)}),it("should return false when challenge is missing",()=>{expect(t.canHandle({data:e.data,chainId:1,deviceModelId:r.STAX},n)).toBe(!1)})}),describe("load",()=>{const d="010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100";it("should return error context when getGatedDescriptorForTypedData returns Left and proxy resolution fails",async()=>{const o=new Error("No gated descriptor for schema hash");vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(g(o)),vi.spyOn(l,"getProxyImplementationAddress").mockResolvedValue(g(new Error("Not a proxy")));const p=await t.load(e);expect(p).toEqual([{type:i.ERROR,error:o}]),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith({contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(l.getProxyImplementationAddress).toHaveBeenCalledWith({proxyAddress:e.data.domain.verifyingContract.toLowerCase(),chainId:e.chainId,challenge:e.challenge,calldata:"0x"}),expect(c.loadCertificate).not.toHaveBeenCalled()}),it("should return gated signing context when getGatedDescriptorForTypedData succeeds",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d}));const o=await t.load(e);expect(o).toHaveLength(1),expect(o[0]).toMatchObject({type:i.ETHEREUM_GATED_SIGNING,payload:d,certificate:h}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith({contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(c.loadCertificate).toHaveBeenCalledWith({keyId:f.CalGatedSigning,keyUsage:m.GatedSigning,targetDevice:e.deviceModelId})}),it("should use zero address when domain.verifyingContract is missing",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d})),await t.load({data:{types:e.data.types},chainId:e.chainId,deviceModelId:e.deviceModelId,challenge:e.challenge}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledWith(expect.objectContaining({contractAddress:"0x0000000000000000000000000000000000000000"}))}),it("should request certificate for correct device model",async()=>{vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d})),await t.load({...e,deviceModelId:r.FLEX}),expect(c.loadCertificate).toHaveBeenCalledWith({keyId:f.CalGatedSigning,keyUsage:m.GatedSigning,targetDevice:r.FLEX})}),it("should reject when certificate loading fails",async()=>{const o=new Error("Certificate loading failed");vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValue(s({signedDescriptor:d})),vi.spyOn(c,"loadCertificate").mockRejectedValue(o),await expect(t.load(e)).rejects.toThrow(o)}),it("should return PROXY_INFO and GATED_SIGNING when verifying contract is proxy and gated descriptor exists for implementation",async()=>{const o="0xabcdef1234567890abcdef1234567890abcdef12",p="0xproxy-descriptor";vi.spyOn(a,"getGatedDescriptorForTypedData").mockResolvedValueOnce(g(new Error("No gated descriptor"))).mockResolvedValueOnce(s({signedDescriptor:d})),vi.spyOn(l,"getProxyImplementationAddress").mockResolvedValue(s({implementationAddress:o,signedDescriptor:p,keyId:"domain-metadata",keyUsage:"trusted-name"}));const y=await t.load(e);expect(y).toHaveLength(2),expect(y[0]).toMatchObject({type:i.ETHEREUM_PROXY_INFO,payload:p}),expect(y[1]).toMatchObject({type:i.ETHEREUM_GATED_SIGNING,payload:d}),expect(a.getGatedDescriptorForTypedData).toHaveBeenCalledTimes(2),expect(a.getGatedDescriptorForTypedData).toHaveBeenNthCalledWith(1,{contractAddress:e.data.domain.verifyingContract.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId}),expect(a.getGatedDescriptorForTypedData).toHaveBeenNthCalledWith(2,{contractAddress:o.toLowerCase(),schemaHash:expect.any(String),chainId:e.chainId})})})});
2
2
  //# sourceMappingURL=GatedSigningTypedDataContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.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 GatedSigningTypedDataContextInput,\n GatedSigningTypedDataContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader\";\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(\"GatedSigningTypedDataContextLoader\", () => {\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 GatedSigningTypedDataContextLoader(\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 const validInput: GatedSigningTypedDataContextInput = {\n data: {\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n ],\n Mail: [{ name: \"subject\", type: \"string\" }],\n },\n domain: {\n verifyingContract: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n },\n },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: \"test-challenge\",\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle\", () => {\n it(\"should return true for valid typed data input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false when expected types do not include GATED_SIGNING\", () => {\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 ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for transaction-style input (selector, to)\", () => {\n const transactionInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n expect(loader.canHandle(transactionInput, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false when data is missing\", () => {\n expect(\n loader.canHandle(\n { chainId: 1, deviceModelId: DeviceModelId.STAX },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when data.types is not a valid schema\", () => {\n expect(\n loader.canHandle(\n {\n data: { types: \"not-an-object\" },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: { types: {} },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(true);\n });\n\n it(\"should return false when chainId or deviceModelId is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when challenge is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptorForTypedData returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"No gated descriptor for schema hash\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\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.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.data.domain!.verifyingContract!.toLowerCase(),\n chainId: validInput.chainId,\n challenge: validInput.challenge,\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptorForTypedData succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\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.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\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 use zero address when domain.verifyingContract is missing\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n data: { types: validInput.data.types },\n chainId: validInput.chainId,\n deviceModelId: validInput.deviceModelId,\n challenge: validInput.challenge,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: \"0x0000000000000000000000000000000000000000\",\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\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 \"getGatedDescriptorForTypedData\",\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 verifying contract is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptorForTypedData\")\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.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "Left", "Right", "GatedSigningTypedDataContextLoader", "KeyId", "KeyUsage", "ClearSignContextType", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "transactionInput", "signedDescriptor", "error", "result", "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 GatedSigningTypedDataContextInput,\n GatedSigningTypedDataContextLoader,\n} from \"@/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader\";\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(\"GatedSigningTypedDataContextLoader\", () => {\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 GatedSigningTypedDataContextLoader(\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 const validInput: GatedSigningTypedDataContextInput = {\n data: {\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n ],\n Mail: [{ name: \"subject\", type: \"string\" }],\n },\n domain: {\n verifyingContract: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n },\n },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: \"test-challenge\",\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle\", () => {\n it(\"should return true for valid typed data input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false when expected types do not include GATED_SIGNING\", () => {\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 ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for transaction-style input (selector, to)\", () => {\n const transactionInput = {\n to: \"0x1111111254fb6c44bac0bed2854e76f90643097d\",\n selector: \"0xa1251d75\",\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n expect(loader.canHandle(transactionInput, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false when data is missing\", () => {\n expect(\n loader.canHandle(\n { chainId: 1, deviceModelId: DeviceModelId.STAX },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when data.types is not a valid schema\", () => {\n expect(\n loader.canHandle(\n {\n data: { types: \"not-an-object\" },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: { types: {} },\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(true);\n });\n\n it(\"should return false when chainId or deviceModelId is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n deviceModelId: DeviceModelId.STAX,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n challenge: validInput.challenge,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n\n it(\"should return false when challenge is missing\", () => {\n expect(\n loader.canHandle(\n {\n data: validInput.data,\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n },\n SUPPORTED_TYPES,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n const signedDescriptor =\n \"010122020101222a30783131313131313235346662366334346261633062656432383534653736663930363433303937642308000000000000000140086131323531643735150100\";\n\n it(\"should return error context when getGatedDescriptorForTypedData returns Left and proxy resolution fails\", async () => {\n const error = new Error(\"No gated descriptor for schema hash\");\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\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.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockProxyDataSource.getProxyImplementationAddress,\n ).toHaveBeenCalledWith({\n proxyAddress: validInput.data.domain!.verifyingContract!.toLowerCase(),\n chainId: validInput.chainId,\n challenge: validInput.challenge,\n calldata: \"0x\",\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"should return gated signing context when getGatedDescriptorForTypedData succeeds\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\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.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith({\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\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 use zero address when domain.verifyingContract is missing\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\n ).mockResolvedValue(Right({ signedDescriptor }));\n\n await loader.load({\n data: { types: validInput.data.types },\n chainId: validInput.chainId,\n deviceModelId: validInput.deviceModelId,\n challenge: validInput.challenge,\n });\n\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledWith(\n expect.objectContaining({\n contractAddress: \"0x0000000000000000000000000000000000000000\",\n }),\n );\n });\n\n it(\"should request certificate for correct device model\", async () => {\n vi.spyOn(\n mockGatedDescriptorDataSource,\n \"getGatedDescriptorForTypedData\",\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 \"getGatedDescriptorForTypedData\",\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 verifying contract is proxy and gated descriptor exists for implementation\", async () => {\n const implementationAddress =\n \"0xabcdef1234567890abcdef1234567890abcdef12\";\n const proxySignedDescriptor = \"0xproxy-descriptor\";\n vi.spyOn(mockGatedDescriptorDataSource, \"getGatedDescriptorForTypedData\")\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.getGatedDescriptorForTypedData,\n ).toHaveBeenCalledTimes(2);\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(1, {\n contractAddress:\n validInput.data.domain!.verifyingContract!.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n expect(\n mockGatedDescriptorDataSource.getGatedDescriptorForTypedData,\n ).toHaveBeenNthCalledWith(2, {\n contractAddress: implementationAddress.toLowerCase(),\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n schemaHash: expect.any(String),\n chainId: validInput.chainId,\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "GatedSigningTypedDataContextLoader", "KeyId", "KeyUsage", "ClearSignContextType", "mockGatedDescriptorDataSource", "mockCertificateLoader", "mockProxyDataSource", "mockLoggerFactory", "loader", "mockCertificate", "SUPPORTED_TYPES", "validInput", "input", "_description", "transactionInput", "signedDescriptor", "error", "result", "certificateError", "implementationAddress", "proxySignedDescriptor"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var T=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var m=(a,t,o,e)=>{for(var r=e>1?void 0:e?k(t,o):t,n=a.length-1,i;n>=0;n--)(i=a[n])&&(r=(e?i(t,o,r):i(r))||r);return e&&r&&T(t,o,r),r},s=(a,t)=>(o,e)=>t(o,e,a);import{DeviceModelId as C}from"@ledgerhq/device-management-kit";import{inject as d,injectable as y}from"inversify";import{Codec as f,exactly as l,number as x,oneOf as A,string as u}from"purify-ts";import{configTypes as I}from"../../../../config/di/configTypes";import{pkiTypes as L}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyUsage as v}from"../../../../modules/multichain/pki/model/KeyUsage";import{transactionCheckTypes as P}from"../../../../modules/multichain/transaction-check/di/transactionCheckTypes";import{TransactionCheckPaths as N}from"../../../../modules/multichain/transaction-check/utils/constants";import{ClearSignContextType as h}from"../../../../shared/model/ClearSignContext";const O=[h.SOLANA_TRANSACTION_CHECK],R=f.interface({deviceModelId:A([l(C.NANO_X),l(C.NANO_SP),l(C.STAX),l(C.FLEX)]),transactionCheck:f.interface({from:u,rawTx:u,chain:x})});let p=class{constructor(t,o,e){this.transactionCheckDataSource=t;this.certificateLoader=o;this.logger=e("SolanaTransactionCheckLoader")}logger;canHandle(t,o){return O.every(e=>o.includes(e))?R.decode(t).caseOf({Left:()=>!1,Right:({transactionCheck:{from:e,rawTx:r}})=>e.length>0&&r.length>0}):!1}async load(t){const{from:o,rawTx:e,chain:r}=t.transactionCheck,g=[await(await this.transactionCheckDataSource.check({path:N.SOLANA_TRANSACTION,body:{tx:{from:o,raw:e},chain:r}})).caseOf({Left:c=>Promise.resolve({type:h.ERROR,error:c}),Right:async c=>{const S=await this.certificateLoader.loadCertificate({keyId:c.publicKeyId,keyUsage:v.TxSimulationSigner,targetDevice:t.deviceModelId});return{type:h.SOLANA_TRANSACTION_CHECK,payload:{descriptor:c.descriptor},certificate:S}}})];return this.logger.debug("load result",{data:{result:g}}),g}};p=m([y(),s(0,d(P.TransactionCheckDataSource)),s(1,d(L.PkiCertificateLoader)),s(2,d(I.ContextModuleLoggerFactory))],p);export{p as SolanaTransactionCheckLoader};
1
+ var y=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var g=(i,t,r,e)=>{for(var n=e>1?void 0:e?T(t,r):t,o=i.length-1,c;o>=0;o--)(c=i[o])&&(n=(e?c(t,r,n):c(n))||n);return e&&n&&y(t,r,n),n},d=(i,t)=>(r,e)=>t(r,e,i);import{DeviceModelId as l}from"@ledgerhq/device-management-kit";import{inject as p,injectable as A}from"inversify";import{Codec as m,exactly as u,number as k,oneOf as x,string as E}from"purify-ts";import{configTypes as R}from"../../../../config/di/configTypes";import{pkiTypes as N}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyUsage as I}from"../../../../modules/multichain/pki/model/KeyUsage";import{transactionCheckTypes as O}from"../../../../modules/multichain/transaction-check/di/transactionCheckTypes";import{TransactionCheckPaths as L}from"../../../../modules/multichain/transaction-check/utils/constants";import{ClearSignContextType as h}from"../../../../shared/model/ClearSignContext";import{DefaultBs58Encoder as _}from"../../../../shared/utils/bs58Encoder";import{uint8ArrayCodec as w}from"../../../../shared/utils/uint8ArrayCodec";const b=[h.SOLANA_TRANSACTION_CHECK],v=64,f=64,M=128,P=128,U=127,D=7,B=m.interface({deviceModelId:x([u(l.NANO_X),u(l.NANO_SP),u(l.STAX),u(l.FLEX)]),transactionCheck:m.interface({from:E,transactionBytes:w,chain:k})});let C=class{constructor(t,r,e,n=_){this.transactionCheckDataSource=t;this.certificateLoader=r;this.bs58Encoder=n;this.logger=e("SolanaTransactionCheckLoader")}logger;canHandle(t,r){return b.every(e=>r.includes(e))?B.decode(t).caseOf({Left:()=>!1,Right:({transactionCheck:{from:e,transactionBytes:n}})=>e.length>0&&n.length>0}):!1}async load(t){const{from:r,transactionBytes:e,chain:n}=t.transactionCheck;let o;try{o=this.bs58Encoder.encode(this.wrapMessageAsTransaction(e))}catch(a){const s=[{type:h.ERROR,error:a instanceof Error?a:new Error(String(a))}];return this.logger.debug("load result",{data:{result:s}}),s}const S=[await(await this.transactionCheckDataSource.check({path:L.SOLANA_TRANSACTION,body:{tx:{from:r,raw:o},chain:n}})).caseOf({Left:a=>Promise.resolve({type:h.ERROR,error:a}),Right:async a=>{const s=await this.certificateLoader.loadCertificate({keyId:a.publicKeyId,keyUsage:I.TxSimulationSigner,targetDevice:t.deviceModelId});return{type:h.SOLANA_TRANSACTION_CHECK,payload:{descriptor:a.descriptor},certificate:s}}})];return this.logger.debug("load result",{data:{result:S}}),S}wrapMessageAsTransaction(t){const r=this.readNumRequiredSignatures(t),e=this.encodeShortVec(r),n=r*v,o=new Uint8Array(e.length+n+t.length);return o.set(e,0),o.set(t,e.length+n),o}readNumRequiredSignatures(t){const r=t[0];if(r===void 0)throw new Error("[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes");const n=(r&M)!==0?1:0,o=t[n];if(o===void 0)throw new Error("[ContextModule] SolanaTransactionCheckLoader: malformed message header");if(o>f)throw new Error(`[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${o}) exceeds SOLANA_MAX_SIGNATURES (${f})`);return o}encodeShortVec(t){const r=[];let e=t;for(;;){const n=e&U;if(e>>>=D,e===0){r.push(n);break}r.push(n|P)}return Uint8Array.from(r)}};C=g([A(),d(0,p(O.TransactionCheckDataSource)),d(1,p(N.PkiCertificateLoader)),d(2,p(R.ContextModuleLoggerFactory))],C);export{C as SolanaTransactionCheckLoader};
2
2
  //# sourceMappingURL=SolanaTransactionCheckLoader.js.map
@@ -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 rawTx: string;\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 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 rawTx: string,\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 ) {\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, rawTx } }) =>\n from.length > 0 && rawTx.length > 0,\n });\n }\n\n async load(\n ctx: SolanaTransactionCheckContextInput,\n ): Promise<ClearSignContext[]> {\n const { from, rawTx, chain } = ctx.transactionCheck;\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"],
5
- "mappings": "iOAAA,OACE,iBAAAA,MAEK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAS,SAAAC,EAAO,WAAAC,EAAS,UAAAC,EAAQ,SAAAC,EAAO,UAAAC,MAAc,YAEtD,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,uCAEzB,OAAS,YAAAC,MAAgB,0CAEzB,OAAS,yBAAAC,MAA6B,kEAEtC,OAAS,yBAAAC,MAA6B,yDACtC,OAEE,wBAAAC,MACK,kCAaP,MAAMC,EAA0C,CAC9CC,EAAqB,wBACvB,EAEMC,EAAmCC,EAAM,UAAU,CACvD,cAAeC,EAAM,CACnBC,EAAQC,EAAc,MAAM,EAC5BD,EAAQC,EAAc,OAAO,EAC7BD,EAAQC,EAAc,IAAI,EAC1BD,EAAQC,EAAc,IAAI,CAC5B,CAAC,EACD,iBAAkBH,EAAM,UAAU,CAChC,KAAMI,EACN,MAAOA,EACP,MAAOC,CACT,CAAC,CACH,CAAC,EAGM,IAAMC,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gCAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,8BAA8B,CAC5D,CAXiB,OAajB,UACEC,EACAC,EAC6C,CAC7C,OAAKd,EAAgB,MAAOe,GAASD,EAAa,SAASC,CAAI,CAAC,EAEzDb,EAAiC,OAAOW,CAAK,EAAE,OAAO,CAC3D,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,iBAAkB,CAAE,KAAAG,EAAM,MAAAC,CAAM,CAAE,IAC1CD,EAAK,OAAS,GAAKC,EAAM,OAAS,CACtC,CAAC,EALQ,EAMX,CAEA,MAAM,KACJC,EAC6B,CAC7B,KAAM,CAAE,KAAAF,EAAM,MAAAC,EAAO,MAAAE,CAAM,EAAID,EAAI,iBA4B7BE,EAAS,CArBC,MALA,MAAM,KAAK,2BAA2B,MAAM,CAC1D,KAAMC,EAAsB,mBAC5B,KAAM,CAAE,GAAI,CAAE,KAAAL,EAAM,IAAKC,CAAM,EAAG,MAAAE,CAAM,CAC1C,CAAC,GAE6B,OAAkC,CAC9D,KAAOG,GACL,QAAQ,QAAQ,CACd,KAAMrB,EAAqB,MAC3B,MAAAqB,CACF,CAAC,EACH,MAAO,MAAOC,GAAS,CACrB,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAK,YACZ,SAAUE,EAAS,mBACnB,aAAcP,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMjB,EAAqB,yBAC3B,QAAS,CAAE,WAAYsB,EAAK,UAAW,EACvC,YAAAC,CACF,CACF,CACF,CAAC,CAEsB,EACvB,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAAJ,CAAO,CAAE,CAAC,EAC9CA,CACT,CACF,EAhEaX,EAANiB,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAsB,0BAA0B,GAEvDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAVrCvB",
6
- "names": ["DeviceModelId", "inject", "injectable", "Codec", "exactly", "number", "oneOf", "string", "configTypes", "pkiTypes", "KeyUsage", "transactionCheckTypes", "TransactionCheckPaths", "ClearSignContextType", "SUPPORTED_TYPES", "ClearSignContextType", "solanaTransactionCheckInputCodec", "Codec", "oneOf", "exactly", "DeviceModelId", "string", "number", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "input", "expectedType", "type", "from", "rawTx", "ctx", "chain", "result", "TransactionCheckPaths", "error", "data", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes", "configTypes"]
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": ["DeviceModelId", "inject", "injectable", "Codec", "exactly", "number", "oneOf", "string", "configTypes", "pkiTypes", "KeyUsage", "transactionCheckTypes", "TransactionCheckPaths", "ClearSignContextType", "DefaultBs58Encoder", "uint8ArrayCodec", "SUPPORTED_TYPES", "ClearSignContextType", "SOLANA_SIGNATURE_LENGTH", "SOLANA_MAX_SIGNATURES", "VERSIONED_MESSAGE_PREFIX_MASK", "SHORTVEC_CONTINUATION_BIT", "SHORTVEC_DATA_MASK", "SHORTVEC_DATA_BITS", "solanaTransactionCheckInputCodec", "Codec", "oneOf", "exactly", "DeviceModelId", "string", "uint8ArrayCodec", "number", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "bs58Encoder", "DefaultBs58Encoder", "input", "expectedType", "type", "from", "transactionBytes", "ctx", "chain", "rawTx", "error", "result", "TransactionCheckPaths", "data", "certificate", "KeyUsage", "message", "numRequiredSignatures", "sigCount", "placeholdersLength", "wrapped", "firstByte", "headerOffset", "value", "bytes", "remaining", "lowBits", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes", "configTypes"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{DeviceModelId as o}from"@ledgerhq/device-management-kit";import d from"bs58";import{Left as p,Right as l}from"purify-ts";import{TransactionCheckPaths as A}from"../../../../modules/multichain/transaction-check/utils/constants";import{ClearSignContextType as r}from"../../../../shared/model/ClearSignContext";import{SolanaTransactionCheckLoader as f}from"./SolanaTransactionCheckLoader";const n=64,y={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},h=()=>y,s={loadCertificate:vi.fn()};let c,t;beforeEach(()=>{vi.resetAllMocks(),c={check:vi.fn()},t=new f(c,s,h)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:o.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,[r.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(t.canHandle(e,[r.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[r.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[r.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[r.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(t.canHandle({...e,deviceModelId:o.NANO_S},[r.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{c.check.mockResolvedValue(l({publicKeyId:"pk",descriptor:"aabb"})),s.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.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=c.check.mock.calls[0][0],i=d.decode(a.body.tx.raw);expect(a.path).toBe(A.SOLANA_TRANSACTION),expect(a.body.tx.from).toBe("signer"),expect(a.body.chain).toBe(1),expect(i.length).toBe(1+2*n+e.length),expect(i[0]).toBe(2),expect(Array.from(i.slice(1,1+2*n))).toEqual(new Array(2*n).fill(0)),expect(Array.from(i.slice(1+2*n))).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.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=d.decode(c.check.mock.calls[0][0].body.tx.raw);expect(a.length).toBe(1+n+e.length),expect(a[0]).toBe(1),expect(Array.from(a.slice(1,1+n))).toEqual(new Array(n).fill(0)),expect(Array.from(a.slice(1+n))).toEqual(Array.from(e))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{c.check.mockResolvedValue(l({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};s.loadCertificate.mockResolvedValue(e);const[a]=await t.load({deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:r.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");c.check.mockResolvedValue(p(e));const[a]=await t.load({deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:r.ERROR,error:e}),expect(s.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.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});expect(a).toMatchObject({type:r.ERROR,error:expect.any(Error)}),expect(a.error.message).toContain("numRequiredSignatures (65)"),expect(c.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": ["DeviceModelId", "bs58", "Left", "Right", "TransactionCheckPaths", "ClearSignContextType", "SolanaTransactionCheckLoader", "SIG_LENGTH", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "sent", "wrapped", "cert", "ctx", "error"]
7
+ }
@@ -1,2 +1,2 @@
1
- var f=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var p=(s,t,r,e)=>{for(var o=e>1?void 0:e?h(t,r):t,n=s.length-1,c;n>=0;n--)(c=s[n])&&(o=(e?c(t,r,o):c(o))||o);return e&&o&&f(t,r,o),o},i=(s,t)=>(r,e)=>t(r,e,s);import{inject as g,injectable as u}from"inversify";import{Left as l,Right as m}from"purify-ts";import{configTypes as d}from"../../../../config/di/configTypes";import{networkTypes as D}from"../../../../shared/network/di/networkTypes";let a=class{constructor(t,r,e){this.config=t;this.http=e;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",ref:"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784"}});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}}),l(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}}),m(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)}}),l(new Error("[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors"))}}};a=p([u(),i(0,g(d.Config)),i(1,g(d.ContextModuleLoggerFactory)),i(2,g(D.NetworkClient))],a);export{a as HttpLifiDataSource};
1
+ var h=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var p=(s,t,r,e)=>{for(var o=e>1?void 0:e?f(t,r):t,n=s.length-1,c;n>=0;n--)(c=s[n])&&(o=(e?c(t,r,o):c(o))||o);return e&&o&&h(t,r,o),o},i=(s,t)=>(r,e)=>t(r,e,s);import{inject as g,injectable as u}from"inversify";import{Left as l,Right as m}from"purify-ts";import{configTypes as d}from"../../../../config/di/configTypes";import{networkTypes as D}from"../../../../shared/network/di/networkTypes";let a=class{constructor(t,r,e){this.config=t;this.http=e;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}}),l(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}}),m(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)}}),l(new Error("[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors"))}}};a=p([u(),i(0,g(d.Config)),i(1,g(d.ContextModuleLoggerFactory)),i(2,g(D.NetworkClient))],a);export{a as 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 // TODO LIFI\n // REVERT WHEN CAL SUPPORTS IT\n ref: \"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784\",\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": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,gBAAAC,MAAoB,mCAStB,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,uCAGR,IAAK,qDACP,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,EACOC,EACL,IAAI,MACF,yEAAyEF,CAAU,EACrF,CACF,IAGF,KAAK,OAAO,KACV,kFACA,CACE,KAAM,CACJ,WAAAA,EACA,iBAAkBC,EAAK,CAAC,EAAE,aAAa,QAAU,CACnD,CACF,CACF,EAEOE,EAAMF,EAAK,CAAC,CAAC,EACtB,OAASG,EAAO,CACd,YAAK,OAAO,MACV,6EACA,CACE,KAAM,CACJ,WAAAJ,EACA,MAAOI,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAC9D,CACF,CACF,EACOF,EACL,IAAI,MACF,6EACF,CACF,CACF,CACF,CACF,EA7FaN,EAANS,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOC,EAAY,0BAA0B,GAE7CF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IARzBd",
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": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,gBAAAC,MAAoB,mCAStB,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,EACOC,EACL,IAAI,MACF,yEAAyEF,CAAU,EACrF,CACF,IAGF,KAAK,OAAO,KACV,kFACA,CACE,KAAM,CACJ,WAAAA,EACA,iBAAkBC,EAAK,CAAC,EAAE,aAAa,QAAU,CACnD,CACF,CACF,EAEOE,EAAMF,EAAK,CAAC,CAAC,EACtB,OAASG,EAAO,CACd,YAAK,OAAO,MACV,6EACA,CACE,KAAM,CACJ,WAAAJ,EACA,MAAOI,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,CAC9D,CACF,CACF,EACOF,EACL,IAAI,MACF,6EACF,CACF,CACF,CACF,CACF,EA1FaN,EAANS,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOC,EAAY,0BAA0B,GAE7CF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IARzBd",
6
6
  "names": ["inject", "injectable", "Left", "Right", "configTypes", "networkTypes", "HttpLifiDataSource", "config", "loggerFactory", "http", "templateId", "data", "Left", "Right", "error", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes", "networkTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Left as i,Right as d}from"purify-ts";import{beforeEach as p,describe as u,expect as a,it as n,vi as s}from"vitest";import{HttpLifiDataSource as f}from"./HttpLifiDataSource";const m=()=>({debug:s.fn(),info:s.fn(),warn:s.fn(),error:s.fn(),subscribers:[]});u("HttpLifiDataSource",()=>{let r,e;const t="tpl-123",c={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}};p(()=>{s.clearAllMocks(),e={get:s.fn()},r=new f(c,m,e)}),n("should call the network client with the expected URL and params",async()=>{e.get.mockResolvedValue([]),await r.getTransactionDescriptorsPayload({templateId:t}),a(e.get).toHaveBeenCalledTimes(1),a(e.get).toHaveBeenCalledWith("https://crypto-assets-service.api.ledger.com/v1/swap_templates",{params:{template_id:t,output:"id,chain_id,instructions,descriptors",ref:"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784"}})}),n("should return Right(data[0]) when the network client responds with a non-empty array",async()=>{const o={descriptors:{swap:{programId:"SwapProgram",accounts:[],data:"abcd"}}};e.get.mockResolvedValue([o]);const l=await r.getTransactionDescriptorsPayload({templateId:t});a(l).toEqual(d(o))}),n("should return an error when data is undefined",async()=>{e.get.mockResolvedValue(null);const o=await r.getTransactionDescriptorsPayload({templateId:t});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${t}`)))}),n("should return an error when data array is empty",async()=>{e.get.mockResolvedValue([]);const o=await r.getTransactionDescriptorsPayload({templateId:t});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${t}`)))}),n("should return an error when first element is falsy",async()=>{e.get.mockResolvedValue([null]);const o=await r.getTransactionDescriptorsPayload({templateId:t});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${t}`)))}),n("should return an error when the network client throws",async()=>{e.get.mockRejectedValue(new Error("network"));const o=await r.getTransactionDescriptorsPayload({templateId:t});a(o).toEqual(i(new Error("[ContextModule] HttpLifiDataSource: Failed to fetch transaction descriptors")))})});
1
+ import{Left as i,Right as d}from"purify-ts";import{beforeEach as p,describe as u,expect as a,it as n,vi as s}from"vitest";import{HttpLifiDataSource as m}from"./HttpLifiDataSource";const f=()=>({debug:s.fn(),info:s.fn(),warn:s.fn(),error:s.fn(),subscribers:[]});u("HttpLifiDataSource",()=>{let r,t;const e="tpl-123",c={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}};p(()=>{s.clearAllMocks(),t={get:s.fn()},r=new m(c,f,t)}),n("should call the network client with the expected URL and params",async()=>{t.get.mockResolvedValue([]),await r.getTransactionDescriptorsPayload({templateId:e}),a(t.get).toHaveBeenCalledTimes(1),a(t.get).toHaveBeenCalledWith("https://crypto-assets-service.api.ledger.com/v1/swap_templates",{params:{template_id:e,output:"id,chain_id,instructions,descriptors"}})}),n("should return Right(data[0]) when the network client responds with a non-empty array",async()=>{const o={descriptors:{swap:{programId:"SwapProgram",accounts:[],data:"abcd"}}};t.get.mockResolvedValue([o]);const l=await r.getTransactionDescriptorsPayload({templateId:e});a(l).toEqual(d(o))}),n("should return an error when data is undefined",async()=>{t.get.mockResolvedValue(null);const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${e}`)))}),n("should return an error when data array is empty",async()=>{t.get.mockResolvedValue([]);const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${e}`)))}),n("should return an error when first element is falsy",async()=>{t.get.mockResolvedValue([null]);const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(new Error(`[ContextModule] HttpLifiDataSource: no transaction descriptors for id ${e}`)))}),n("should return an error when the network client throws",async()=>{t.get.mockRejectedValue(new Error("network"));const o=await r.getTransactionDescriptorsPayload({templateId:e});a(o).toEqual(i(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 ref: \"ref=commit:866b6e7633a7a806fab7f9941bcc3df7ee640784\",\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,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,sBAAAC,MAA0B,uBAMnC,MAAMC,EAAoB,KAAO,CAC/B,MAAOF,EAAG,GAAG,EACb,KAAMA,EAAG,GAAG,EACZ,KAAMA,EAAG,GAAG,EACZ,MAAOA,EAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEAH,EAAS,qBAAsB,IAAM,CACnC,IAAIM,EACAC,EACJ,MAAMC,EAAa,UACbC,EAAqC,CACzC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,EAEAV,EAAW,IAAM,CACfI,EAAG,cAAc,EACjBI,EAAW,CAAE,IAAKJ,EAAG,GAAG,CAAE,EAC1BG,EAAa,IAAIF,EACfK,EACAJ,EACAE,CACF,CACF,CAAC,EAEDL,EAAG,kEAAmE,SAAY,CAEhFK,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMD,EAAW,iCAAiC,CAAE,WAAAE,CAAW,CAAC,EAGhEP,EAAOM,EAAS,GAAG,EAAE,sBAAsB,CAAC,EAC5CN,EAAOM,EAAS,GAAG,EAAE,qBACnB,iEACA,CACE,OAAQ,CACN,YAAaC,EACb,OAAQ,uCACR,IAAK,qDACP,CACF,CACF,CACF,CAAC,EAEDN,EAAG,uFAAwF,SAAY,CAErG,MAAMQ,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,EAGDP,EAAOU,CAAM,EAAE,QAAQb,EAAMY,CAAS,CAAC,CACzC,CAAC,EAEDR,EAAG,gDAAiD,SAAY,CAE9DK,EAAS,IAAI,kBAAkB,IAAI,EAGnC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,kDAAmD,SAAY,CAEhEK,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,qDAAsD,SAAY,CAEnEK,EAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAGrC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,wDAAyD,SAAY,CAEtEK,EAAS,IAAI,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGnD,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
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,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,sBAAAC,MAA0B,uBAMnC,MAAMC,EAAoB,KAAO,CAC/B,MAAOF,EAAG,GAAG,EACb,KAAMA,EAAG,GAAG,EACZ,KAAMA,EAAG,GAAG,EACZ,MAAOA,EAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEAH,EAAS,qBAAsB,IAAM,CACnC,IAAIM,EACAC,EACJ,MAAMC,EAAa,UACbC,EAAqC,CACzC,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,CACF,EAEAV,EAAW,IAAM,CACfI,EAAG,cAAc,EACjBI,EAAW,CAAE,IAAKJ,EAAG,GAAG,CAAE,EAC1BG,EAAa,IAAIF,EACfK,EACAJ,EACAE,CACF,CACF,CAAC,EAEDL,EAAG,kEAAmE,SAAY,CAEhFK,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMD,EAAW,iCAAiC,CAAE,WAAAE,CAAW,CAAC,EAGhEP,EAAOM,EAAS,GAAG,EAAE,sBAAsB,CAAC,EAC5CN,EAAOM,EAAS,GAAG,EAAE,qBACnB,iEACA,CACE,OAAQ,CACN,YAAaC,EACb,OAAQ,sCACV,CACF,CACF,CACF,CAAC,EAEDN,EAAG,uFAAwF,SAAY,CAErG,MAAMQ,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,EAGDP,EAAOU,CAAM,EAAE,QAAQb,EAAMY,CAAS,CAAC,CACzC,CAAC,EAEDR,EAAG,gDAAiD,SAAY,CAE9DK,EAAS,IAAI,kBAAkB,IAAI,EAGnC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,kDAAmD,SAAY,CAEhEK,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAGjC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,qDAAsD,SAAY,CAEnEK,EAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAGrC,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEAAyEW,CAAU,EACrF,CACF,CACF,CACF,CAAC,EAEDN,EAAG,wDAAyD,SAAY,CAEtEK,EAAS,IAAI,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAGnD,MAAMI,EAAS,MAAML,EAAW,iCAAiC,CAC/D,WAAAE,CACF,CAAC,EAGDP,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
6
  "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "HttpLifiDataSource", "mockLoggerFactory", "datasource", "httpMock", "templateId", "config", "response0", "result"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import r from"bs58";class d{static encode(e){return r.encode(e)}static decode(e){return r.decode(e)}}export{d as 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": "AAAA,OAAOA,MAAU,OAOV,MAAMC,CAAmB,CAC9B,OAAO,OAAOC,EAA0B,CACtC,OAAOF,EAAK,OAAOE,CAAI,CACzB,CACA,OAAO,OAAOC,EAA6B,CACzC,OAAOH,EAAK,OAAOG,CAAO,CAC5B,CACF",
6
+ "names": ["bs58", "DefaultBs58Encoder", "data", "encoded"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Codec as r,Left as e,Right as o}from"purify-ts";const n=r.custom({decode:t=>t instanceof Uint8Array?o(t):e("Expected a Uint8Array"),encode:t=>t});export{n as 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": "AAAA,OAAS,SAAAA,EAAO,QAAAC,EAAM,SAAAC,MAAa,YAE5B,MAAMC,EAAkBH,EAAM,OAAmB,CACtD,OAASI,GACPA,aAAiB,WAAaF,EAAME,CAAK,EAAIH,EAAK,uBAAuB,EAC3E,OAASG,GAAUA,CACrB,CAAC",
6
+ "names": ["Codec", "Left", "Right", "uint8ArrayCodec", "value"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Left as r,Right as a}from"purify-ts";import{uint8ArrayCodec as t}from"./uint8ArrayCodec";describe("uint8ArrayCodec",()=>{it("decodes a Uint8Array as Right",()=>{const e=new Uint8Array([1,2,3]);expect(t.decode(e)).toEqual(a(e))}),it("decodes a non-Uint8Array value as Left",()=>{expect(t.decode("not bytes")).toEqual(r("Expected a Uint8Array")),expect(t.decode([1,2,3])).toEqual(r("Expected a Uint8Array")),expect(t.decode(void 0)).toEqual(r("Expected a Uint8Array"))}),it("encodes a Uint8Array as itself",()=>{const e=new Uint8Array([4,5,6]);expect(t.encode(e)).toBe(e)})});
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,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAE5B,OAAS,mBAAAC,MAAuB,oBAEhC,SAAS,kBAAmB,IAAM,CAChC,GAAG,gCAAiC,IAAM,CACxC,MAAMC,EAAQ,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACtC,OAAOD,EAAgB,OAAOC,CAAK,CAAC,EAAE,QAAQF,EAAME,CAAK,CAAC,CAC5D,CAAC,EAED,GAAG,yCAA0C,IAAM,CACjD,OAAOD,EAAgB,OAAO,WAAW,CAAC,EAAE,QAC1CF,EAAK,uBAAuB,CAC9B,EACA,OAAOE,EAAgB,OAAO,CAAC,EAAG,EAAG,CAAC,CAAC,CAAC,EAAE,QACxCF,EAAK,uBAAuB,CAC9B,EACA,OAAOE,EAAgB,OAAO,MAAS,CAAC,EAAE,QACxCF,EAAK,uBAAuB,CAC9B,CACF,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,MAAMG,EAAQ,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACtC,OAAOD,EAAgB,OAAOC,CAAK,CAAC,EAAE,KAAKA,CAAK,CAClD,CAAC,CACH,CAAC",
6
+ "names": ["Left", "Right", "uint8ArrayCodec", "bytes"]
7
+ }
@@ -1,4 +1,4 @@
1
- import { DeviceModelId, HexaString } from "@ledgerhq/device-management-kit";
1
+ import { DeviceModelId, HexaString, LoggerPublisherService } from "@ledgerhq/device-management-kit";
2
2
  import { type GatedDescriptorDataSource } from "../../../../modules/ethereum/gated-signing/data/GatedDescriptorDataSource";
3
3
  import type { ProxyDataSource } from "../../../../modules/ethereum/proxy/data/ProxyDataSource";
4
4
  import { type PkiCertificateLoader } from "../../../../modules/multichain/pki/domain/PkiCertificateLoader";
@@ -14,7 +14,8 @@ export declare class GatedSigningContextLoader implements ContextLoader<GatedSig
14
14
  private readonly _dataSource;
15
15
  private readonly _certificateLoader;
16
16
  private readonly _proxyDataSource;
17
- constructor(_dataSource: GatedDescriptorDataSource, _certificateLoader: PkiCertificateLoader, _proxyDataSource: ProxyDataSource);
17
+ private readonly logger;
18
+ constructor(_dataSource: GatedDescriptorDataSource, _certificateLoader: PkiCertificateLoader, _proxyDataSource: ProxyDataSource, loggerFactory: (tag: string) => LoggerPublisherService);
18
19
  canHandle(input: unknown, expectedTypes: ClearSignContextType[]): input is GatedSigningContextInput;
19
20
  load({ to, selector, chainId, deviceModelId, }: GatedSigningContextInput): Promise<ClearSignContext[]>;
20
21
  private _loadGatedCertificate;
@@ -1 +1 @@
1
- {"version":3,"file":"GatedSigningContextLoader.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,UAAU,EAEX,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,iEAAiE,CAAC;AAEjH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAGrF,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,sDAAsD,CAAC;AAGjG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,UAAU,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAWF,qBACa,yBACX,YAAW,aAAa,CAAC,wBAAwB,CAAC;IAIhD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAJhB,WAAW,EAAE,yBAAyB,EAEtC,kBAAkB,EAAE,oBAAoB,EAExC,gBAAgB,EAAE,eAAe;IAGpD,SAAS,CACP,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,oBAAoB,EAAE,GACpC,KAAK,IAAI,wBAAwB;IAiB9B,IAAI,CAAC,EACT,EAAE,EACF,QAAQ,EACR,OAAO,EACP,aAAa,GACd,EAAE,wBAAwB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA2EzD,OAAO,CAAC,qBAAqB;CAO9B"}
1
+ {"version":3,"file":"GatedSigningContextLoader.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,UAAU,EAEV,sBAAsB,EACvB,MAAM,iCAAiC,CAAC;AAIzC,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,iEAAiE,CAAC;AAEjH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+CAA+C,CAAC;AAGrF,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,sDAAsD,CAAC;AAGjG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,UAAU,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAWF,qBACa,yBACX,YAAW,aAAa,CAAC,wBAAwB,CAAC;IAMhD,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IARnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;gBAI7B,WAAW,EAAE,yBAAyB,EAEtC,kBAAkB,EAAE,oBAAoB,EAExC,gBAAgB,EAAE,eAAe,EAElD,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,sBAAsB;IAKxD,SAAS,CACP,KAAK,EAAE,OAAO,EACd,aAAa,EAAE,oBAAoB,EAAE,GACpC,KAAK,IAAI,wBAAwB;IAiB9B,IAAI,CAAC,EACT,EAAE,EACF,QAAQ,EACR,OAAO,EACP,aAAa,GACd,EAAE,wBAAwB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA6HzD,OAAO,CAAC,qBAAqB;CAO9B"}
@@ -1,4 +1,4 @@
1
- import { DeviceModelId } from "@ledgerhq/device-management-kit";
1
+ import { DeviceModelId, LoggerPublisherService } from "@ledgerhq/device-management-kit";
2
2
  import { type GatedDescriptorDataSource } from "../../../../modules/ethereum/gated-signing/data/GatedDescriptorDataSource";
3
3
  import type { TypedDataSchema } from "../../../../modules/ethereum/model/TypedDataContext";
4
4
  import type { ProxyDataSource } from "../../../../modules/ethereum/proxy/data/ProxyDataSource";
@@ -20,7 +20,8 @@ export declare class GatedSigningTypedDataContextLoader implements ContextLoader
20
20
  private readonly _dataSource;
21
21
  private readonly _certificateLoader;
22
22
  private readonly _proxyDataSource;
23
- constructor(_dataSource: GatedDescriptorDataSource, _certificateLoader: PkiCertificateLoader, _proxyDataSource: ProxyDataSource);
23
+ private readonly logger;
24
+ constructor(_dataSource: GatedDescriptorDataSource, _certificateLoader: PkiCertificateLoader, _proxyDataSource: ProxyDataSource, loggerFactory: (tag: string) => LoggerPublisherService);
24
25
  canHandle(input: unknown, expectedTypes: ClearSignContextType[]): input is GatedSigningTypedDataContextInput;
25
26
  load({ data, chainId, deviceModelId, challenge, }: GatedSigningTypedDataContextInput): Promise<ClearSignContext[]>;
26
27
  }