@ledgerhq/context-module 0.0.0-develop-20250925001206 → 0.0.0-develop-20250927001139
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/src/ContextModule.js +1 -1
- package/lib/cjs/src/ContextModule.js.map +1 -1
- package/lib/cjs/src/ContextModuleBuilder.test.js +1 -1
- package/lib/cjs/src/ContextModuleBuilder.test.js.map +2 -2
- package/lib/cjs/src/DefaultContextModule.js +1 -1
- package/lib/cjs/src/DefaultContextModule.js.map +3 -3
- package/lib/cjs/src/DefaultContextModule.test.js +1 -1
- package/lib/cjs/src/DefaultContextModule.test.js.map +3 -3
- package/lib/cjs/src/calldata/domain/CalldataContextLoader.js +1 -1
- package/lib/cjs/src/calldata/domain/CalldataContextLoader.js.map +3 -3
- package/lib/cjs/src/calldata/domain/CalldataContextLoader.test.js +1 -1
- package/lib/cjs/src/calldata/domain/CalldataContextLoader.test.js.map +3 -3
- package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
- package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +3 -3
- package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
- package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +3 -3
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
- package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
- package/lib/cjs/src/index.js +1 -1
- package/lib/cjs/src/index.js.map +2 -2
- package/lib/cjs/src/nft/domain/NftContextLoader.js +1 -1
- package/lib/cjs/src/nft/domain/NftContextLoader.js.map +3 -3
- package/lib/cjs/src/nft/domain/NftContextLoader.test.js +1 -1
- package/lib/cjs/src/nft/domain/NftContextLoader.test.js.map +3 -3
- package/lib/cjs/src/pki/model/PkiCertificateInfo.js +1 -1
- package/lib/cjs/src/pki/model/PkiCertificateInfo.js.map +1 -1
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.js +1 -1
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.js.map +3 -3
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.test.js +1 -1
- package/lib/cjs/src/proxy/data/HttpProxyDataSource.test.js.map +3 -3
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.js +1 -1
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.js.map +2 -2
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.test.js +1 -1
- package/lib/cjs/src/proxy/data/HttpSafeProxyDataSource.test.js.map +2 -2
- package/lib/cjs/src/proxy/data/ProxyDataSource.js +1 -1
- package/lib/cjs/src/proxy/data/ProxyDataSource.js.map +1 -1
- package/lib/cjs/src/proxy/data/dto/SafeProxyImplementationAddressDto.js +1 -1
- package/lib/cjs/src/proxy/data/dto/SafeProxyImplementationAddressDto.js.map +1 -1
- package/lib/cjs/src/proxy/domain/ProxyContextFieldLoader.js +1 -1
- package/lib/cjs/src/proxy/domain/ProxyContextFieldLoader.js.map +3 -3
- package/lib/cjs/src/proxy/domain/ProxyContextFieldLoader.test.js +1 -1
- package/lib/cjs/src/proxy/domain/ProxyContextFieldLoader.test.js.map +2 -2
- package/lib/cjs/src/proxy/model/ProxyDelegateCall.js +1 -1
- package/lib/cjs/src/proxy/model/ProxyDelegateCall.js.map +1 -1
- package/lib/cjs/src/shared/domain/ContextLoader.js +1 -1
- package/lib/cjs/src/shared/domain/ContextLoader.js.map +1 -1
- package/lib/cjs/src/shared/utils/KeyUsageMapper.js +1 -1
- package/lib/cjs/src/shared/utils/KeyUsageMapper.js.map +2 -2
- package/lib/cjs/src/token/domain/TokenContextLoader.js +1 -1
- package/lib/cjs/src/token/domain/TokenContextLoader.js.map +3 -3
- package/lib/cjs/src/token/domain/TokenContextLoader.test.js +1 -1
- package/lib/cjs/src/token/domain/TokenContextLoader.test.js.map +3 -3
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
- package/lib/cjs/src/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
- package/lib/cjs/src/trusted-name/data/TrustedNameDataSource.js +1 -1
- package/lib/cjs/src/trusted-name/data/TrustedNameDataSource.js.map +1 -1
- package/lib/cjs/src/trusted-name/data/TrustedNameDto.js +1 -1
- package/lib/cjs/src/trusted-name/data/TrustedNameDto.js.map +1 -1
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextFieldLoader.js +1 -1
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextFieldLoader.js.map +3 -3
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextFieldLoader.test.js +1 -1
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextFieldLoader.test.js.map +3 -3
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.js +1 -1
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
- package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
- package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.js +1 -1
- package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.js.map +3 -3
- package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.test.js +1 -1
- package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.test.js.map +2 -2
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js +1 -1
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
- package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js.map +3 -3
- package/lib/esm/src/ContextModuleBuilder.test.js +1 -1
- package/lib/esm/src/ContextModuleBuilder.test.js.map +2 -2
- package/lib/esm/src/DefaultContextModule.js +1 -1
- package/lib/esm/src/DefaultContextModule.js.map +3 -3
- package/lib/esm/src/DefaultContextModule.test.js +1 -1
- package/lib/esm/src/DefaultContextModule.test.js.map +3 -3
- package/lib/esm/src/calldata/domain/CalldataContextLoader.js +1 -1
- package/lib/esm/src/calldata/domain/CalldataContextLoader.js.map +3 -3
- package/lib/esm/src/calldata/domain/CalldataContextLoader.test.js +1 -1
- package/lib/esm/src/calldata/domain/CalldataContextLoader.test.js.map +3 -3
- package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
- package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +3 -3
- package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
- package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +3 -3
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
- package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
- package/lib/esm/src/index.js +1 -1
- package/lib/esm/src/index.js.map +2 -2
- package/lib/esm/src/nft/domain/NftContextLoader.js +1 -1
- package/lib/esm/src/nft/domain/NftContextLoader.js.map +3 -3
- package/lib/esm/src/nft/domain/NftContextLoader.test.js +1 -1
- package/lib/esm/src/nft/domain/NftContextLoader.test.js.map +3 -3
- package/lib/esm/src/proxy/data/HttpProxyDataSource.js +1 -1
- package/lib/esm/src/proxy/data/HttpProxyDataSource.js.map +3 -3
- package/lib/esm/src/proxy/data/HttpProxyDataSource.test.js +1 -1
- package/lib/esm/src/proxy/data/HttpProxyDataSource.test.js.map +3 -3
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.js +1 -1
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.js.map +2 -2
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.test.js +1 -1
- package/lib/esm/src/proxy/data/HttpSafeProxyDataSource.test.js.map +2 -2
- package/lib/esm/src/proxy/domain/ProxyContextFieldLoader.js +1 -1
- package/lib/esm/src/proxy/domain/ProxyContextFieldLoader.js.map +3 -3
- package/lib/esm/src/proxy/domain/ProxyContextFieldLoader.test.js +1 -1
- package/lib/esm/src/proxy/domain/ProxyContextFieldLoader.test.js.map +2 -2
- package/lib/esm/src/shared/utils/KeyUsageMapper.js +1 -1
- package/lib/esm/src/shared/utils/KeyUsageMapper.js.map +2 -2
- package/lib/esm/src/token/domain/TokenContextLoader.js +1 -1
- package/lib/esm/src/token/domain/TokenContextLoader.js.map +3 -3
- package/lib/esm/src/token/domain/TokenContextLoader.test.js +1 -1
- package/lib/esm/src/token/domain/TokenContextLoader.test.js.map +3 -3
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
- package/lib/esm/src/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
- package/lib/esm/src/trusted-name/domain/TrustedNameContextFieldLoader.js +1 -1
- package/lib/esm/src/trusted-name/domain/TrustedNameContextFieldLoader.js.map +3 -3
- package/lib/esm/src/trusted-name/domain/TrustedNameContextFieldLoader.test.js +1 -1
- package/lib/esm/src/trusted-name/domain/TrustedNameContextFieldLoader.test.js.map +3 -3
- package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.js +1 -1
- package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
- package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
- package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
- package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.js +1 -1
- package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.js.map +3 -3
- package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.test.js +1 -1
- package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.test.js.map +2 -2
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.js +1 -1
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
- package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js.map +3 -3
- package/lib/types/src/ContextModule.d.ts +1 -2
- package/lib/types/src/ContextModule.d.ts.map +1 -1
- package/lib/types/src/DefaultContextModule.d.ts +1 -2
- package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
- package/lib/types/src/calldata/domain/CalldataContextLoader.d.ts +12 -4
- package/lib/types/src/calldata/domain/CalldataContextLoader.d.ts.map +1 -1
- package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts +9 -4
- package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts.map +1 -1
- package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts +11 -4
- package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts.map +1 -1
- package/lib/types/src/index.d.ts +0 -1
- package/lib/types/src/index.d.ts.map +1 -1
- package/lib/types/src/nft/domain/NftContextLoader.d.ts +10 -4
- package/lib/types/src/nft/domain/NftContextLoader.d.ts.map +1 -1
- package/lib/types/src/pki/model/PkiCertificateInfo.d.ts +1 -2
- package/lib/types/src/pki/model/PkiCertificateInfo.d.ts.map +1 -1
- package/lib/types/src/proxy/data/HttpProxyDataSource.d.ts.map +1 -1
- package/lib/types/src/proxy/data/HttpSafeProxyDataSource.d.ts.map +1 -1
- package/lib/types/src/proxy/data/ProxyDataSource.d.ts +2 -0
- package/lib/types/src/proxy/data/ProxyDataSource.d.ts.map +1 -1
- package/lib/types/src/proxy/data/dto/SafeProxyImplementationAddressDto.d.ts +2 -0
- package/lib/types/src/proxy/data/dto/SafeProxyImplementationAddressDto.d.ts.map +1 -1
- package/lib/types/src/proxy/domain/ProxyContextFieldLoader.d.ts.map +1 -1
- package/lib/types/src/proxy/model/ProxyDelegateCall.d.ts +2 -0
- package/lib/types/src/proxy/model/ProxyDelegateCall.d.ts.map +1 -1
- package/lib/types/src/shared/domain/ContextLoader.d.ts +13 -4
- package/lib/types/src/shared/domain/ContextLoader.d.ts.map +1 -1
- package/lib/types/src/shared/utils/KeyUsageMapper.d.ts +1 -2
- package/lib/types/src/shared/utils/KeyUsageMapper.d.ts.map +1 -1
- package/lib/types/src/token/domain/TokenContextLoader.d.ts +10 -4
- package/lib/types/src/token/domain/TokenContextLoader.d.ts.map +1 -1
- package/lib/types/src/trusted-name/data/HttpTrustedNameDataSource.d.ts +7 -3
- package/lib/types/src/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -1
- package/lib/types/src/trusted-name/data/TrustedNameDataSource.d.ts +7 -2
- package/lib/types/src/trusted-name/data/TrustedNameDataSource.d.ts.map +1 -1
- package/lib/types/src/trusted-name/data/TrustedNameDto.d.ts +4 -5
- package/lib/types/src/trusted-name/data/TrustedNameDto.d.ts.map +1 -1
- package/lib/types/src/trusted-name/domain/TrustedNameContextFieldLoader.d.ts +5 -1
- package/lib/types/src/trusted-name/domain/TrustedNameContextFieldLoader.d.ts.map +1 -1
- package/lib/types/src/trusted-name/domain/TrustedNameContextLoader.d.ts +14 -5
- package/lib/types/src/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -1
- package/lib/types/src/typed-data/domain/DefaultTypedDataContextLoader.d.ts.map +1 -1
- package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts +11 -4
- package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +5 -5
- package/lib/cjs/src/shared/model/TransactionContext.js +0 -2
- package/lib/cjs/src/shared/model/TransactionContext.js.map +0 -7
- package/lib/esm/src/shared/model/TransactionContext.js +0 -1
- package/lib/esm/src/shared/model/TransactionContext.js.map +0 -7
- package/lib/types/src/shared/model/TransactionContext.d.ts +0 -8
- package/lib/types/src/shared/model/TransactionContext.d.ts.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import o from"axios";import{Left as
|
|
1
|
+
import o from"axios";import{Left as s,Right as r}from"purify-ts";import{LEDGER_CLIENT_VERSION_HEADER as d,LEDGER_ORIGIN_TOKEN_HEADER as l}from"../../shared/constant/HttpHeaders";import{HttpTrustedNameDataSource as c}from"../../trusted-name/data/HttpTrustedNameDataSource";import i from"../../../package.json";vi.mock("axios");const n={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"},metadataServiceDomain:{url:"https://nft.api.live.ledger.com"},originToken:"originToken"};describe("HttpTrustedNameDataSource",()=>{let t;beforeAll(()=>{t=new c(n),vi.clearAllMocks()}),describe("getDomainNamePayload",()=>{it("should call axios with the correct url and ledger client version header",async()=>{const e=`context-module/${i.version}`,a=vi.fn(()=>Promise.resolve({data:[]}));vi.spyOn(o,"request").mockImplementation(a),await t.getDomainNamePayload({chainId:137,challenge:"9876",domain:"hello.eth"}),expect(a).toHaveBeenCalledWith(expect.objectContaining({url:"https://nft.api.live.ledger.com/v2/names/ethereum/137/forward/hello.eth?types=eoa&sources=ens&challenge=9876",headers:{[d]:e,[l]:n.originToken}}))}),it("should throw an error when axios throws an error",async()=>{vi.spyOn(o,"request").mockRejectedValue(new Error);const e=await t.getDomainNamePayload({chainId:137,challenge:"",domain:"hello.eth"});expect(e).toEqual(s(new Error("[ContextModule] HttpTrustedNameDataSource: Failed to fetch domain name")))}),it("should return an error when no payload is returned",async()=>{const e={data:{test:""}};vi.spyOn(o,"request").mockResolvedValue(e);const a=await t.getDomainNamePayload({chainId:137,challenge:"",domain:"hello.eth"});expect(a).toEqual(s(new Error("[ContextModule] HttpTrustedNameDataSource: Invalid trusted name response format for domain hello.eth on chain 137")))}),it("should return a payload",async()=>{const e={data:{signedDescriptor:{data:"payload",signatures:{}},keyId:"testKeyId",keyUsage:"testKeyUsage"}};vi.spyOn(o,"request").mockResolvedValue(e);const a=await t.getDomainNamePayload({chainId:137,challenge:"challenge",domain:"hello.eth"});expect(a).toEqual(r({data:"payload",keyId:"testKeyId",keyUsage:"testKeyUsage"}))})}),describe("getTrustedNamePayload",()=>{it("should call axios with the correct url and ledger client version header",async()=>{const e=`context-module/${i.version}`,a=vi.fn(()=>Promise.resolve({data:[]}));vi.spyOn(o,"request").mockImplementation(a),await t.getTrustedNamePayload({chainId:137,address:"0x1234",challenge:"5678",sources:["ens","crypto_asset_list"],types:["eoa"]}),expect(a).toHaveBeenCalledWith(expect.objectContaining({url:"https://nft.api.live.ledger.com/v2/names/ethereum/137/reverse/0x1234?types=eoa&sources=ens,crypto_asset_list&challenge=5678",headers:{[d]:e,[l]:n.originToken}}))}),it("should throw an error when axios throws an error",async()=>{vi.spyOn(o,"request").mockRejectedValue(new Error);const e=await t.getTrustedNamePayload({chainId:137,address:"0x1234",challenge:"",sources:["ens"],types:["eoa"]});expect(e).toEqual(s(new Error("[ContextModule] HttpTrustedNameDataSource: Failed to fetch trusted name")))}),it("should return an error when no payload is returned",async()=>{const e={data:{test:""}};vi.spyOn(o,"request").mockResolvedValue(e);const a=await t.getTrustedNamePayload({chainId:137,address:"0x1234",challenge:"",sources:["ens"],types:["eoa"]});expect(a).toEqual(s(new Error("[ContextModule] HttpTrustedNameDataSource: Invalid trusted name response format for address 0x1234 on chain 137")))}),it("should return an error when no keys are returned",async()=>{const e={data:{signedDescriptor:{data:"payload",signatures:{prod:"12345"}}}};vi.spyOn(o,"request").mockResolvedValue(e);const a=await t.getTrustedNamePayload({chainId:137,address:"0x1234",challenge:"",sources:["ens"],types:["eoa"]});expect(a).toEqual(s(new Error("[ContextModule] HttpTrustedNameDataSource: Invalid trusted name response format for address 0x1234 on chain 137")))}),it("should return a payload",async()=>{const e={data:{signedDescriptor:{data:"payload",signatures:{}},keyId:"testKeyId",keyUsage:"testKeyUsage"}};vi.spyOn(o,"request").mockResolvedValue(e);const a=await t.getTrustedNamePayload({chainId:137,address:"0x1234",challenge:"",sources:["ens"],types:["eoa"]});expect(a).toEqual(r({data:"payload",keyId:"testKeyId",keyUsage:"testKeyUsage"}))}),it("should return a payload with a signature",async()=>{const e={data:{signedDescriptor:{data:"payload",signatures:{prod:"12345"}},keyId:"testKeyId",keyUsage:"testKeyUsage"}};vi.spyOn(o,"request").mockResolvedValue(e);const a=await t.getTrustedNamePayload({chainId:137,address:"0x1234",challenge:"",sources:["ens"],types:["eoa"]});expect(a).toEqual(r({data:"payload153012345",keyId:"testKeyId",keyUsage:"testKeyUsage"}))})})});
|
|
2
2
|
//# sourceMappingURL=HttpTrustedNameDataSource.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/trusted-name/data/HttpTrustedNameDataSource.test.ts"],
|
|
4
|
-
"sourcesContent": ["import axios from \"axios\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n LEDGER_CLIENT_VERSION_HEADER,\n LEDGER_ORIGIN_TOKEN_HEADER,\n} from \"@/shared/constant/HttpHeaders\";\nimport { HttpTrustedNameDataSource } from \"@/trusted-name/data/HttpTrustedNameDataSource\";\nimport { type TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport PACKAGE from \"@root/package.json\";\n\nvi.mock(\"axios\");\n\nconst config = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n metadataServiceDomain: {\n url: \"https://nft.api.live.ledger.com\",\n },\n originToken: \"originToken\",\n} as ContextModuleConfig;\ndescribe(\"HttpTrustedNameDataSource\", () => {\n let datasource: TrustedNameDataSource;\n\n beforeAll(() => {\n datasource = new HttpTrustedNameDataSource(config);\n vi.clearAllMocks();\n });\n\n describe(\"getDomainNamePayload\", () => {\n it(\"should call axios with the correct url and ledger client version header\", async () => {\n // GIVEN\n const version = `context-module/${PACKAGE.version}`;\n const requestSpy = vi.fn(() => Promise.resolve({ data: [] }));\n vi.spyOn(axios, \"request\").mockImplementation(requestSpy);\n\n // WHEN\n await datasource.getDomainNamePayload({\n chainId: 137,\n challenge: \"9876\",\n domain: \"hello.eth\",\n });\n\n // THEN\n expect(requestSpy).toHaveBeenCalledWith(\n expect.objectContaining({\n url: `https://nft.api.live.ledger.com/v2/names/ethereum/137/forward/hello.eth?types=eoa&sources=ens&challenge=9876`,\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: version,\n [LEDGER_ORIGIN_TOKEN_HEADER]: config.originToken,\n },\n }),\n );\n });\n\n it(\"should throw an error when axios throws an error\", async () => {\n // GIVEN\n vi.spyOn(axios, \"request\").mockRejectedValue(new Error());\n\n // WHEN\n const result = await datasource.getDomainNamePayload({\n chainId: 137,\n challenge: \"\",\n domain: \"hello.eth\",\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTrustedNameDataSource: Failed to fetch domain name\",\n ),\n ),\n );\n });\n\n it(\"should return an error when no payload is returned\", async () => {\n // GIVEN\n const response = { data: { test: \"\" } };\n vi.spyOn(axios, \"request\").mockResolvedValue(response);\n\n // WHEN\n const result = await datasource.getDomainNamePayload({\n chainId: 137,\n challenge: \"\",\n domain: \"hello.eth\",\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTrustedNameDataSource:
|
|
5
|
-
"mappings": "AAAA,OAAOA,MAAW,QAClB,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAG5B,OACE,gCAAAC,EACA,8BAAAC,MACK,gCACP,OAAS,6BAAAC,MAAiC,gDAE1C,OAAOC,MAAa,qBAEpB,GAAG,KAAK,OAAO,EAEf,MAAMC,EAAS,CACb,IAAK,CACH,IAAK,kDACL,KAAM,OACN,OAAQ,MACV,EACA,sBAAuB,CACrB,IAAK,iCACP,EACA,YAAa,aACf,EACA,SAAS,4BAA6B,IAAM,CAC1C,IAAIC,EAEJ,UAAU,IAAM,CACdA,EAAa,IAAIH,EAA0BE,CAAM,EACjD,GAAG,cAAc,CACnB,CAAC,EAED,SAAS,uBAAwB,IAAM,CACrC,GAAG,0EAA2E,SAAY,CAExF,MAAME,EAAU,kBAAkBH,EAAQ,OAAO,GAC3CI,EAAa,GAAG,GAAG,IAAM,QAAQ,QAAQ,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EAC5D,GAAG,MAAMV,EAAO,SAAS,EAAE,mBAAmBU,CAAU,EAGxD,MAAMF,EAAW,qBAAqB,CACpC,QAAS,IACT,UAAW,OACX,OAAQ,WACV,CAAC,EAGD,OAAOE,CAAU,EAAE,qBACjB,OAAO,iBAAiB,CACtB,IAAK,+GACL,QAAS,CACP,CAACP,CAA4B,EAAGM,EAChC,CAACL,CAA0B,EAAGG,EAAO,WACvC,CACF,CAAC,CACH,CACF,CAAC,EAED,GAAG,mDAAoD,SAAY,CAEjE,GAAG,MAAMP,EAAO,SAAS,EAAE,kBAAkB,IAAI,KAAO,EAGxD,MAAMW,EAAS,MAAMH,EAAW,qBAAqB,CACnD,QAAS,IACT,UAAW,GACX,OAAQ,WACV,CAAC,EAGD,OAAOG,CAAM,EAAE,QACbV,EACE,IAAI,MACF,wEACF,CACF,CACF,CACF,CAAC,EAED,GAAG,qDAAsD,SAAY,CAEnE,MAAMW,EAAW,CAAE,KAAM,CAAE,KAAM,EAAG,CAAE,EACtC,GAAG,MAAMZ,EAAO,SAAS,EAAE,kBAAkBY,CAAQ,EAGrD,MAAMD,EAAS,MAAMH,EAAW,qBAAqB,CACnD,QAAS,IACT,UAAW,GACX,OAAQ,WACV,CAAC,EAGD,OAAOG,CAAM,EAAE,QACbV,EACE,IAAI,MACF,
|
|
4
|
+
"sourcesContent": ["import axios from \"axios\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n LEDGER_CLIENT_VERSION_HEADER,\n LEDGER_ORIGIN_TOKEN_HEADER,\n} from \"@/shared/constant/HttpHeaders\";\nimport { HttpTrustedNameDataSource } from \"@/trusted-name/data/HttpTrustedNameDataSource\";\nimport { type TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport PACKAGE from \"@root/package.json\";\n\nvi.mock(\"axios\");\n\nconst config = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n metadataServiceDomain: {\n url: \"https://nft.api.live.ledger.com\",\n },\n originToken: \"originToken\",\n} as ContextModuleConfig;\ndescribe(\"HttpTrustedNameDataSource\", () => {\n let datasource: TrustedNameDataSource;\n\n beforeAll(() => {\n datasource = new HttpTrustedNameDataSource(config);\n vi.clearAllMocks();\n });\n\n describe(\"getDomainNamePayload\", () => {\n it(\"should call axios with the correct url and ledger client version header\", async () => {\n // GIVEN\n const version = `context-module/${PACKAGE.version}`;\n const requestSpy = vi.fn(() => Promise.resolve({ data: [] }));\n vi.spyOn(axios, \"request\").mockImplementation(requestSpy);\n\n // WHEN\n await datasource.getDomainNamePayload({\n chainId: 137,\n challenge: \"9876\",\n domain: \"hello.eth\",\n });\n\n // THEN\n expect(requestSpy).toHaveBeenCalledWith(\n expect.objectContaining({\n url: `https://nft.api.live.ledger.com/v2/names/ethereum/137/forward/hello.eth?types=eoa&sources=ens&challenge=9876`,\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: version,\n [LEDGER_ORIGIN_TOKEN_HEADER]: config.originToken,\n },\n }),\n );\n });\n\n it(\"should throw an error when axios throws an error\", async () => {\n // GIVEN\n vi.spyOn(axios, \"request\").mockRejectedValue(new Error());\n\n // WHEN\n const result = await datasource.getDomainNamePayload({\n chainId: 137,\n challenge: \"\",\n domain: \"hello.eth\",\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTrustedNameDataSource: Failed to fetch domain name\",\n ),\n ),\n );\n });\n\n it(\"should return an error when no payload is returned\", async () => {\n // GIVEN\n const response = { data: { test: \"\" } };\n vi.spyOn(axios, \"request\").mockResolvedValue(response);\n\n // WHEN\n const result = await datasource.getDomainNamePayload({\n chainId: 137,\n challenge: \"\",\n domain: \"hello.eth\",\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTrustedNameDataSource: Invalid trusted name response format for domain hello.eth on chain 137\",\n ),\n ),\n );\n });\n\n it(\"should return a payload\", async () => {\n // GIVEN\n const response = {\n data: {\n signedDescriptor: { data: \"payload\", signatures: {} },\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n },\n };\n vi.spyOn(axios, \"request\").mockResolvedValue(response);\n\n // WHEN\n const result = await datasource.getDomainNamePayload({\n chainId: 137,\n challenge: \"challenge\",\n domain: \"hello.eth\",\n });\n\n // THEN\n expect(result).toEqual(\n Right({\n data: \"payload\",\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n }),\n );\n });\n });\n\n describe(\"getTrustedNamePayload\", () => {\n it(\"should call axios with the correct url and ledger client version header\", async () => {\n // GIVEN\n const version = `context-module/${PACKAGE.version}`;\n const requestSpy = vi.fn(() => Promise.resolve({ data: [] }));\n vi.spyOn(axios, \"request\").mockImplementation(requestSpy);\n\n // WHEN\n await datasource.getTrustedNamePayload({\n chainId: 137,\n address: \"0x1234\",\n challenge: \"5678\",\n sources: [\"ens\", \"crypto_asset_list\"],\n types: [\"eoa\"],\n });\n\n // THEN\n expect(requestSpy).toHaveBeenCalledWith(\n expect.objectContaining({\n url: `https://nft.api.live.ledger.com/v2/names/ethereum/137/reverse/0x1234?types=eoa&sources=ens,crypto_asset_list&challenge=5678`,\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: version,\n [LEDGER_ORIGIN_TOKEN_HEADER]: config.originToken,\n },\n }),\n );\n });\n\n it(\"should throw an error when axios throws an error\", async () => {\n // GIVEN\n vi.spyOn(axios, \"request\").mockRejectedValue(new Error());\n\n // WHEN\n const result = await datasource.getTrustedNamePayload({\n chainId: 137,\n address: \"0x1234\",\n challenge: \"\",\n sources: [\"ens\"],\n types: [\"eoa\"],\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTrustedNameDataSource: Failed to fetch trusted name\",\n ),\n ),\n );\n });\n\n it(\"should return an error when no payload is returned\", async () => {\n // GIVEN\n const response = { data: { test: \"\" } };\n vi.spyOn(axios, \"request\").mockResolvedValue(response);\n\n // WHEN\n const result = await datasource.getTrustedNamePayload({\n chainId: 137,\n address: \"0x1234\",\n challenge: \"\",\n sources: [\"ens\"],\n types: [\"eoa\"],\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTrustedNameDataSource: Invalid trusted name response format for address 0x1234 on chain 137\",\n ),\n ),\n );\n });\n\n it(\"should return an error when no keys are returned\", async () => {\n // GIVEN\n const response = {\n data: {\n signedDescriptor: { data: \"payload\", signatures: { prod: \"12345\" } },\n },\n };\n vi.spyOn(axios, \"request\").mockResolvedValue(response);\n\n // WHEN\n const result = await datasource.getTrustedNamePayload({\n chainId: 137,\n address: \"0x1234\",\n challenge: \"\",\n sources: [\"ens\"],\n types: [\"eoa\"],\n });\n\n // THEN\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTrustedNameDataSource: Invalid trusted name response format for address 0x1234 on chain 137\",\n ),\n ),\n );\n });\n\n it(\"should return a payload\", async () => {\n // GIVEN\n const response = {\n data: {\n signedDescriptor: { data: \"payload\", signatures: {} },\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n },\n };\n vi.spyOn(axios, \"request\").mockResolvedValue(response);\n\n // WHEN\n const result = await datasource.getTrustedNamePayload({\n chainId: 137,\n address: \"0x1234\",\n challenge: \"\",\n sources: [\"ens\"],\n types: [\"eoa\"],\n });\n\n // THEN\n expect(result).toEqual(\n Right({\n data: \"payload\",\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n }),\n );\n });\n\n it(\"should return a payload with a signature\", async () => {\n // GIVEN\n const response = {\n data: {\n signedDescriptor: { data: \"payload\", signatures: { prod: \"12345\" } },\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n },\n };\n vi.spyOn(axios, \"request\").mockResolvedValue(response);\n\n // WHEN\n const result = await datasource.getTrustedNamePayload({\n chainId: 137,\n address: \"0x1234\",\n challenge: \"\",\n sources: [\"ens\"],\n types: [\"eoa\"],\n });\n\n // THEN\n expect(result).toEqual(\n Right({\n data: \"payload153012345\",\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n }),\n );\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["axios", "Left", "Right", "LEDGER_CLIENT_VERSION_HEADER", "LEDGER_ORIGIN_TOKEN_HEADER", "HttpTrustedNameDataSource", "PACKAGE", "config", "datasource", "version", "requestSpy", "result", "response"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var p=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var l=(i,e,a,r)=>{for(var t=r>1?void 0:r?f(e,a):e,o=i.length-1,d;o>=0;o--)(d=i[o])&&(t=(r?d(e,a,t):d(t))||t);return r&&t&&p(e,a,t),t},c=(i,e)=>(a,r)=>e(a,r,i);import{inject as m,injectable as y}from"inversify";import{pkiTypes as g}from"../../pki/di/pkiTypes";import{ClearSignContextType as n}from"../../shared/model/ClearSignContext";import{trustedNameTypes as u}from"../../trusted-name/di/trustedNameTypes";let s=class{constructor(e,a){this._dataSource=e;this._certificateLoader=a}canHandle(e,a){return a===n.TRUSTED_NAME&&typeof e=="object"&&e!==null&&"chainId"in e&&"address"in e&&"challenge"in e&&"types"in e&&"sources"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0}async loadField(e){return await(await this._dataSource.getTrustedNamePayload({chainId:e.chainId,address:e.address,challenge:e.challenge,types:e.types,sources:e.sources})).caseOf({Left:r=>Promise.resolve({type:n.ERROR,error:r}),Right:async({data:r,keyId:t,keyUsage:o})=>{const d=await this._certificateLoader.loadCertificate({keyId:t,keyUsage:o,targetDevice:e.deviceModelId});return{type:n.TRUSTED_NAME,payload:r,certificate:d}}})}};s=l([y(),c(0,m(u.TrustedNameDataSource)),c(1,m(g.PkiCertificateLoader))],s);export{s as TrustedNameContextFieldLoader};
|
|
2
2
|
//# sourceMappingURL=TrustedNameContextFieldLoader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/trusted-name/domain/TrustedNameContextFieldLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { ContextFieldLoader } from \"@/shared/domain/ContextFieldLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport * as TrustedNameDataSource from \"@/trusted-name/data/TrustedNameDataSource\";\nimport { trustedNameTypes } from \"@/trusted-name/di/trustedNameTypes\";\n\ntype TrustedNameFieldInput = {\n chainId: number;\n address: string;\n challenge: string;\n types: string[];\n sources: string[];\n};\n\n@injectable()\nexport class TrustedNameContextFieldLoader\n implements ContextFieldLoader<TrustedNameFieldInput>\n{\n constructor(\n @inject(trustedNameTypes.TrustedNameDataSource)\n private _dataSource: TrustedNameDataSource.TrustedNameDataSource,\n ) {}\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType,\n ): input is TrustedNameFieldInput {\n return (\n expectedType === ClearSignContextType.TRUSTED_NAME &&\n typeof input === \"object\" &&\n input !== null &&\n \"chainId\" in input &&\n \"address\" in input &&\n \"challenge\" in input &&\n \"types\" in input &&\n \"sources\" in input\n );\n }\n\n async loadField(input: TrustedNameFieldInput): Promise<ClearSignContext> {\n const payload = await this._dataSource.getTrustedNamePayload({\n chainId: input.chainId,\n address: input.address,\n challenge: input.challenge,\n types: input.types,\n sources: input.sources,\n });\n return payload.caseOf({\n Left: (error): ClearSignContext
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["inject", "injectable", "ClearSignContextType", "trustedNameTypes", "TrustedNameContextFieldLoader", "_dataSource", "input", "expectedType", "ClearSignContextType", "error", "
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { ContextFieldLoader } from \"@/shared/domain/ContextFieldLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport * as TrustedNameDataSource from \"@/trusted-name/data/TrustedNameDataSource\";\nimport { trustedNameTypes } from \"@/trusted-name/di/trustedNameTypes\";\n\ntype TrustedNameFieldInput = {\n chainId: number;\n address: string;\n challenge: string;\n types: string[];\n sources: string[];\n deviceModelId: DeviceModelId;\n};\n\n@injectable()\nexport class TrustedNameContextFieldLoader\n implements ContextFieldLoader<TrustedNameFieldInput>\n{\n constructor(\n @inject(trustedNameTypes.TrustedNameDataSource)\n private _dataSource: TrustedNameDataSource.TrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private _certificateLoader: PkiCertificateLoader,\n ) {}\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType,\n ): input is TrustedNameFieldInput {\n return (\n expectedType === ClearSignContextType.TRUSTED_NAME &&\n typeof input === \"object\" &&\n input !== null &&\n \"chainId\" in input &&\n \"address\" in input &&\n \"challenge\" in input &&\n \"types\" in input &&\n \"sources\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined\n );\n }\n\n async loadField(input: TrustedNameFieldInput): Promise<ClearSignContext> {\n const payload = await this._dataSource.getTrustedNamePayload({\n chainId: input.chainId,\n address: input.address,\n challenge: input.challenge,\n types: input.types,\n sources: input.sources,\n });\n return await payload.caseOf({\n Left: (error): Promise<ClearSignContext> =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async ({ data, keyId, keyUsage }): Promise<ClearSignContext> => {\n const certificate = await this._certificateLoader.loadCertificate({\n keyId,\n keyUsage,\n targetDevice: input.deviceModelId,\n });\n return {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: data,\n certificate,\n };\n },\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,oBAGzB,OAEE,wBAAAC,MACK,kCAEP,OAAS,oBAAAC,MAAwB,qCAY1B,IAAMC,EAAN,KAEP,CACE,YAEUC,EAEAC,EACR,CAHQ,iBAAAD,EAEA,wBAAAC,CACP,CAEH,UACEC,EACAC,EACgC,CAChC,OACEA,IAAiBC,EAAqB,cACtC,OAAOF,GAAU,UACjBA,IAAU,MACV,YAAaA,GACb,YAAaA,GACb,cAAeA,GACf,UAAWA,GACX,YAAaA,GACb,kBAAmBA,GACnBA,EAAM,gBAAkB,MAE5B,CAEA,MAAM,UAAUA,EAAyD,CAQvE,OAAO,MAPS,MAAM,KAAK,YAAY,sBAAsB,CAC3D,QAASA,EAAM,QACf,QAASA,EAAM,QACf,UAAWA,EAAM,UACjB,MAAOA,EAAM,MACb,QAASA,EAAM,OACjB,CAAC,GACoB,OAAO,CAC1B,KAAOG,GACL,QAAQ,QAAQ,CACd,KAAMD,EAAqB,MAC3B,MAAAC,CACF,CAAC,EACH,MAAO,MAAO,CAAE,KAAAC,EAAM,MAAAC,EAAO,SAAAC,CAAS,IAAiC,CACrE,MAAMC,EAAc,MAAM,KAAK,mBAAmB,gBAAgB,CAChE,MAAAF,EACA,SAAAC,EACA,aAAcN,EAAM,aACtB,CAAC,EACD,MAAO,CACL,KAAME,EAAqB,aAC3B,QAASE,EACT,YAAAG,CACF,CACF,CACF,CAAC,CACH,CACF,EAxDaV,EAANW,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAiB,qBAAqB,GAE7CF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,IAN5BhB",
|
|
6
|
+
"names": ["inject", "injectable", "pkiTypes", "ClearSignContextType", "trustedNameTypes", "TrustedNameContextFieldLoader", "_dataSource", "_certificateLoader", "input", "expectedType", "ClearSignContextType", "error", "data", "keyId", "keyUsage", "certificate", "__decorateClass", "injectable", "__decorateParam", "inject", "trustedNameTypes", "pkiTypes"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Left as
|
|
1
|
+
import{DeviceModelId as i}from"@ledgerhq/device-management-kit";import{Left as u,Right as n}from"purify-ts";import{ClearSignContextType as o}from"../../shared/model/ClearSignContext";import{TrustedNameContextFieldLoader as y}from"../../trusted-name/domain/TrustedNameContextFieldLoader";describe("TrustedNameContextFieldLoader",()=>{const t={getTrustedNamePayload:vi.fn(),getDomainNamePayload:vi.fn()},c={loadCertificate:vi.fn()},d=new y(t,c),e={chainId:1,address:"0x1234567890abcdef",challenge:"test-challenge",types:["contract","token"],sources:["ledger","ens"],deviceModelId:i.STAX},l={data:"0x123456789abcdef0",keyId:"testKeyId",keyUsage:"testKeyUsage"},r={keyUsageNumber:1,payload:new Uint8Array([1,2,3,4])};beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle",()=>{it("should return true for valid trusted name field",()=>{const a={chainId:1,address:"0x1234567890abcdef",challenge:"test-challenge",types:["contract","token"],sources:["ledger","ens"],deviceModelId:i.STAX};expect(d.canHandle(a,o.TRUSTED_NAME)).toBe(!0)}),describe("should return false for invalid inputs",()=>{const a=[{name:"null",value:null},{name:"undefined",value:void 0},{name:"string",value:"invalid"},{name:"number",value:123},{name:"boolean",value:!0},{name:"array",value:[]},{name:"empty object",value:{}},{name:"object missing chainId",value:{address:"0x123",challenge:"test",types:["contract"],sources:["ledger"]}},{name:"object missing address",value:{chainId:1,challenge:"test",types:["contract"],sources:["ledger"]}},{name:"object missing challenge",value:{chainId:1,address:"0x123",types:["contract"],sources:["ledger"]}},{name:"object missing types",value:{chainId:1,address:"0x123",challenge:"test",sources:["ledger"]}},{name:"object missing sources",value:{chainId:1,address:"0x123",challenge:"test",types:["contract"]}},{name:"object missing device model",value:{chainId:1,address:"0x1234567890abcdef",challenge:"test-challenge",types:["contract","token"],sources:["ledger","ens"]}}];test.each(a)("$name",({value:s})=>{expect(d.canHandle(s,o.TRUSTED_NAME)).toBe(!1)})}),it("should return false for invalid expected type",()=>{expect(d.canHandle(e,o.TOKEN)).toBe(!1)})}),describe("loadField",()=>{it("should return error context when trusted name data source fails",async()=>{const a=new Error("Trusted name data source error");vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(u(a));const s=await d.loadField(e);expect(t.getTrustedNamePayload).toHaveBeenCalledWith({chainId:e.chainId,address:e.address,challenge:e.challenge,types:e.types,sources:e.sources}),expect(c.loadCertificate).not.toHaveBeenCalled(),expect(s).toEqual({type:o.ERROR,error:a})}),it("should return trusted name context when successful",async()=>{vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(n(l)),vi.spyOn(c,"loadCertificate").mockResolvedValue(r);const a=await d.loadField(e);expect(c.loadCertificate).toHaveBeenCalledWith({keyId:"testKeyId",keyUsage:"testKeyUsage",targetDevice:e.deviceModelId}),expect(t.getTrustedNamePayload).toHaveBeenCalledWith({chainId:e.chainId,address:e.address,challenge:e.challenge,types:e.types,sources:e.sources}),expect(a).toEqual({type:o.TRUSTED_NAME,payload:l.data,certificate:r})}),it("should handle different chain IDs and addresses correctly",async()=>{const a={...e,chainId:137,address:"0xdeadbeef",challenge:"custom-challenge"};vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(n(l)),vi.spyOn(c,"loadCertificate").mockResolvedValue(void 0);const s=await d.loadField(a);expect(t.getTrustedNamePayload).toHaveBeenCalledWith({chainId:137,address:"0xdeadbeef",challenge:"custom-challenge",types:e.types,sources:e.sources}),expect(s).toEqual({type:o.TRUSTED_NAME,payload:l.data})}),it("should handle different types and sources correctly",async()=>{const a={...e,types:["wallet","exchange"],sources:["coingecko","1inch"]};vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(n(l)),vi.spyOn(c,"loadCertificate").mockResolvedValue(void 0);const s=await d.loadField(a);expect(t.getTrustedNamePayload).toHaveBeenCalledWith({chainId:e.chainId,address:e.address,challenge:e.challenge,types:["wallet","exchange"],sources:["coingecko","1inch"]}),expect(s).toEqual({type:o.TRUSTED_NAME,payload:l.data})}),it("should preserve error message from trusted name data source",async()=>{const a=new Error("Network timeout error");vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(u(a));const s=await d.loadField(e);expect(s).toEqual({type:o.ERROR,error:a})}),it("should handle empty trusted name payload",async()=>{const a={...l,data:""};vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(n(a)),vi.spyOn(c,"loadCertificate").mockResolvedValue(void 0);const s=await d.loadField(e);expect(s).toEqual({type:o.TRUSTED_NAME,payload:a.data})}),it("should handle empty types and sources arrays",async()=>{const a={...e,types:[],sources:[]};vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(n(l)),vi.spyOn(c,"loadCertificate").mockResolvedValue(void 0);const s=await d.loadField(a);expect(t.getTrustedNamePayload).toHaveBeenCalledWith({chainId:e.chainId,address:e.address,challenge:e.challenge,types:[],sources:[]}),expect(s).toEqual({type:o.TRUSTED_NAME,payload:l.data})}),it("should handle single type and source",async()=>{const a={...e,types:["contract"],sources:["ens"]};vi.spyOn(t,"getTrustedNamePayload").mockResolvedValue(n(l)),vi.spyOn(c,"loadCertificate").mockResolvedValue(void 0);const s=await d.loadField(a);expect(t.getTrustedNamePayload).toHaveBeenCalledWith({chainId:e.chainId,address:e.address,challenge:e.challenge,types:["contract"],sources:["ens"]}),expect(s).toEqual({type:o.TRUSTED_NAME,payload:l.data})})})});
|
|
2
2
|
//# sourceMappingURL=TrustedNameContextFieldLoader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/trusted-name/domain/TrustedNameContextFieldLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { Left, Right } from \"purify-ts\";\n\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport { TrustedNameContextFieldLoader } from \"@/trusted-name/domain/TrustedNameContextFieldLoader\";\n\ndescribe(\"TrustedNameContextFieldLoader\", () => {\n const mockTrustedNameDataSource: TrustedNameDataSource = {\n getTrustedNamePayload: vi.fn(),\n getDomainNamePayload: vi.fn(),\n };\n const trustedNameContextFieldLoader = new TrustedNameContextFieldLoader(\n mockTrustedNameDataSource,\n );\n\n const mockTransactionField = {\n chainId: 1,\n address: \"0x1234567890abcdef\",\n challenge: \"test-challenge\",\n types: [\"contract\", \"token\"],\n sources: [\"ledger\", \"ens\"],\n };\n\n const mockTrustedNamePayload = \"0x123456789abcdef0\";\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle\", () => {\n it(\"should return true for valid trusted name field\", () => {\n // GIVEN\n const validField = {\n chainId: 1,\n address: \"0x1234567890abcdef\",\n challenge: \"test-challenge\",\n types: [\"contract\", \"token\"],\n sources: [\"ledger\", \"ens\"],\n };\n\n // THEN\n expect(\n trustedNameContextFieldLoader.canHandle(\n validField,\n ClearSignContextType.TRUSTED_NAME,\n ),\n ).toBe(true);\n });\n\n describe(\"should return false for invalid inputs\", () => {\n const invalidInputs = [\n { name: \"null\", value: null },\n { name: \"undefined\", value: undefined },\n { name: \"string\", value: \"invalid\" },\n { name: \"number\", value: 123 },\n { name: \"boolean\", value: true },\n { name: \"array\", value: [] },\n { name: \"empty object\", value: {} },\n {\n name: \"object missing chainId\",\n value: {\n address: \"0x123\",\n challenge: \"test\",\n types: [\"contract\"],\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing address\",\n value: {\n chainId: 1,\n challenge: \"test\",\n types: [\"contract\"],\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing challenge\",\n value: {\n chainId: 1,\n address: \"0x123\",\n types: [\"contract\"],\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing types\",\n value: {\n chainId: 1,\n address: \"0x123\",\n challenge: \"test\",\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing sources\",\n value: {\n chainId: 1,\n address: \"0x123\",\n challenge: \"test\",\n types: [\"contract\"],\n },\n },\n ];\n\n test.each(invalidInputs)(\"$name\", ({ value }) => {\n expect(\n trustedNameContextFieldLoader.canHandle(\n value,\n ClearSignContextType.TRUSTED_NAME,\n ),\n ).toBe(false);\n });\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(\n trustedNameContextFieldLoader.canHandle(\n mockTransactionField,\n ClearSignContextType.TOKEN,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"loadField\", () => {\n it(\"should return error context when trusted name data source fails\", async () => {\n // GIVEN\n const error = new Error(\"Trusted name data source error\");\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Left(error));\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: mockTransactionField.types,\n sources: mockTransactionField.sources,\n });\n expect(result).toEqual({\n type: ClearSignContextType.ERROR,\n error: error,\n });\n });\n\n it(\"should return trusted name context when successful\", async () => {\n // GIVEN\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: mockTransactionField.types,\n sources: mockTransactionField.sources,\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload,\n });\n });\n\n it(\"should handle different chain IDs and addresses correctly\", async () => {\n // GIVEN\n const customField = {\n ...mockTransactionField,\n chainId: 137,\n address: \"0xdeadbeef\",\n challenge: \"custom-challenge\",\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n\n // WHEN\n const result = await trustedNameContextFieldLoader.loadField(customField);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: 137,\n address: \"0xdeadbeef\",\n challenge: \"custom-challenge\",\n types: mockTransactionField.types,\n sources: mockTransactionField.sources,\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload,\n });\n });\n\n it(\"should handle different types and sources correctly\", async () => {\n // GIVEN\n const customField = {\n ...mockTransactionField,\n types: [\"wallet\", \"exchange\"],\n sources: [\"coingecko\", \"1inch\"],\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n\n // WHEN\n const result = await trustedNameContextFieldLoader.loadField(customField);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: [\"wallet\", \"exchange\"],\n sources: [\"coingecko\", \"1inch\"],\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload,\n });\n });\n\n it(\"should preserve error message from trusted name data source\", async () => {\n // GIVEN\n const specificError = new Error(\"Network timeout error\");\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Left(specificError));\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(result).toEqual({\n type: ClearSignContextType.ERROR,\n error: specificError,\n });\n });\n\n it(\"should handle empty trusted name payload\", async () => {\n // GIVEN\n const emptyPayload = \"\";\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(emptyPayload));\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: emptyPayload,\n });\n });\n\n it(\"should handle empty types and sources arrays\", async () => {\n // GIVEN\n const fieldWithEmptyArrays = {\n ...mockTransactionField,\n types: [],\n sources: [],\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(fieldWithEmptyArrays);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: [],\n sources: [],\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload,\n });\n });\n\n it(\"should handle single type and source\", async () => {\n // GIVEN\n const fieldWithSingleElements = {\n ...mockTransactionField,\n types: [\"contract\"],\n sources: [\"ens\"],\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n\n // WHEN\n const result = await trustedNameContextFieldLoader.loadField(\n fieldWithSingleElements,\n );\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: [\"contract\"],\n sources: [\"ens\"],\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload,\n });\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,
|
|
6
|
-
"names": ["Left", "Right", "ClearSignContextType", "TrustedNameContextFieldLoader", "mockTrustedNameDataSource", "trustedNameContextFieldLoader", "mockTransactionField", "mockTrustedNamePayload", "validField", "invalidInputs", "value", "error", "result", "customField", "specificError", "emptyPayload", "fieldWithEmptyArrays", "fieldWithSingleElements"]
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport { TrustedNameContextFieldLoader } from \"@/trusted-name/domain/TrustedNameContextFieldLoader\";\n\ndescribe(\"TrustedNameContextFieldLoader\", () => {\n const mockTrustedNameDataSource: TrustedNameDataSource = {\n getTrustedNamePayload: vi.fn(),\n getDomainNamePayload: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const trustedNameContextFieldLoader = new TrustedNameContextFieldLoader(\n mockTrustedNameDataSource,\n mockCertificateLoader,\n );\n\n const mockTransactionField = {\n chainId: 1,\n address: \"0x1234567890abcdef\",\n challenge: \"test-challenge\",\n types: [\"contract\", \"token\"],\n sources: [\"ledger\", \"ens\"],\n deviceModelId: DeviceModelId.STAX,\n };\n\n const mockTrustedNamePayload = {\n data: \"0x123456789abcdef0\",\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n };\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3, 4]),\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle\", () => {\n it(\"should return true for valid trusted name field\", () => {\n // GIVEN\n const validField = {\n chainId: 1,\n address: \"0x1234567890abcdef\",\n challenge: \"test-challenge\",\n types: [\"contract\", \"token\"],\n sources: [\"ledger\", \"ens\"],\n deviceModelId: DeviceModelId.STAX,\n };\n\n // THEN\n expect(\n trustedNameContextFieldLoader.canHandle(\n validField,\n ClearSignContextType.TRUSTED_NAME,\n ),\n ).toBe(true);\n });\n\n describe(\"should return false for invalid inputs\", () => {\n const invalidInputs = [\n { name: \"null\", value: null },\n { name: \"undefined\", value: undefined },\n { name: \"string\", value: \"invalid\" },\n { name: \"number\", value: 123 },\n { name: \"boolean\", value: true },\n { name: \"array\", value: [] },\n { name: \"empty object\", value: {} },\n {\n name: \"object missing chainId\",\n value: {\n address: \"0x123\",\n challenge: \"test\",\n types: [\"contract\"],\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing address\",\n value: {\n chainId: 1,\n challenge: \"test\",\n types: [\"contract\"],\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing challenge\",\n value: {\n chainId: 1,\n address: \"0x123\",\n types: [\"contract\"],\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing types\",\n value: {\n chainId: 1,\n address: \"0x123\",\n challenge: \"test\",\n sources: [\"ledger\"],\n },\n },\n {\n name: \"object missing sources\",\n value: {\n chainId: 1,\n address: \"0x123\",\n challenge: \"test\",\n types: [\"contract\"],\n },\n },\n {\n name: \"object missing device model\",\n value: {\n chainId: 1,\n address: \"0x1234567890abcdef\",\n challenge: \"test-challenge\",\n types: [\"contract\", \"token\"],\n sources: [\"ledger\", \"ens\"],\n },\n },\n ];\n\n test.each(invalidInputs)(\"$name\", ({ value }) => {\n expect(\n trustedNameContextFieldLoader.canHandle(\n value,\n ClearSignContextType.TRUSTED_NAME,\n ),\n ).toBe(false);\n });\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(\n trustedNameContextFieldLoader.canHandle(\n mockTransactionField,\n ClearSignContextType.TOKEN,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"loadField\", () => {\n it(\"should return error context when trusted name data source fails\", async () => {\n // GIVEN\n const error = new Error(\"Trusted name data source error\");\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Left(error));\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: mockTransactionField.types,\n sources: mockTransactionField.sources,\n });\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n expect(result).toEqual({\n type: ClearSignContextType.ERROR,\n error: error,\n });\n });\n\n it(\"should return trusted name context when successful\", async () => {\n // GIVEN\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n targetDevice: mockTransactionField.deviceModelId,\n });\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: mockTransactionField.types,\n sources: mockTransactionField.sources,\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload.data,\n certificate: mockCertificate,\n });\n });\n\n it(\"should handle different chain IDs and addresses correctly\", async () => {\n // GIVEN\n const customField = {\n ...mockTransactionField,\n chainId: 137,\n address: \"0xdeadbeef\",\n challenge: \"custom-challenge\",\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n\n // WHEN\n const result = await trustedNameContextFieldLoader.loadField(customField);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: 137,\n address: \"0xdeadbeef\",\n challenge: \"custom-challenge\",\n types: mockTransactionField.types,\n sources: mockTransactionField.sources,\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload.data,\n });\n });\n\n it(\"should handle different types and sources correctly\", async () => {\n // GIVEN\n const customField = {\n ...mockTransactionField,\n types: [\"wallet\", \"exchange\"],\n sources: [\"coingecko\", \"1inch\"],\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n\n // WHEN\n const result = await trustedNameContextFieldLoader.loadField(customField);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: [\"wallet\", \"exchange\"],\n sources: [\"coingecko\", \"1inch\"],\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload.data,\n });\n });\n\n it(\"should preserve error message from trusted name data source\", async () => {\n // GIVEN\n const specificError = new Error(\"Network timeout error\");\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Left(specificError));\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(result).toEqual({\n type: ClearSignContextType.ERROR,\n error: specificError,\n });\n });\n\n it(\"should handle empty trusted name payload\", async () => {\n // GIVEN\n const emptyPayload = {\n ...mockTrustedNamePayload,\n data: \"\",\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(emptyPayload));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(mockTransactionField);\n\n // THEN\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: emptyPayload.data,\n });\n });\n\n it(\"should handle empty types and sources arrays\", async () => {\n // GIVEN\n const fieldWithEmptyArrays = {\n ...mockTransactionField,\n types: [],\n sources: [],\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n\n // WHEN\n const result =\n await trustedNameContextFieldLoader.loadField(fieldWithEmptyArrays);\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: [],\n sources: [],\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload.data,\n });\n });\n\n it(\"should handle single type and source\", async () => {\n // GIVEN\n const fieldWithSingleElements = {\n ...mockTransactionField,\n types: [\"contract\"],\n sources: [\"ens\"],\n };\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getTrustedNamePayload\",\n ).mockResolvedValue(Right(mockTrustedNamePayload));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n\n // WHEN\n const result = await trustedNameContextFieldLoader.loadField(\n fieldWithSingleElements,\n );\n\n // THEN\n expect(\n mockTrustedNameDataSource.getTrustedNamePayload,\n ).toHaveBeenCalledWith({\n chainId: mockTransactionField.chainId,\n address: mockTransactionField.address,\n challenge: mockTransactionField.challenge,\n types: [\"contract\"],\n sources: [\"ens\"],\n });\n expect(result).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: mockTrustedNamePayload.data,\n });\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "Left", "Right", "ClearSignContextType", "TrustedNameContextFieldLoader", "mockTrustedNameDataSource", "mockCertificateLoader", "trustedNameContextFieldLoader", "mockTransactionField", "mockTrustedNamePayload", "mockCertificate", "validField", "invalidInputs", "value", "error", "result", "customField", "specificError", "emptyPayload", "fieldWithEmptyArrays", "fieldWithSingleElements"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var y=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var m=(o,e,a,t)=>{for(var r=t>1?void 0:t?C(e,a):e,i=o.length-1,n;i>=0;i--)(n=o[i])&&(r=(t?n(e,a,r):n(r))||r);return t&&r&&y(e,a,r),r},l=(o,e)=>(a,t)=>e(a,t,o);import{inject as p,injectable as h}from"inversify";import{pkiTypes as S}from"../../pki/di/pkiTypes";import{ClearSignContextType as c}from"../../shared/model/ClearSignContext";import{trustedNameTypes as T}from"../../trusted-name/di/trustedNameTypes";const I=[c.TRUSTED_NAME];let d=class{constructor(e,a){this.certificateLoader=a;this._dataSource=e}_dataSource;canHandle(e,a){return typeof e=="object"&&e!==null&&"chainId"in e&&"domain"in e&&"challenge"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&typeof e.chainId=="number"&&typeof e.domain=="string"&&e.domain.length>0&&typeof e.challenge=="string"&&e.challenge.length>0&&I.every(t=>a.includes(t))}async load(e){const{chainId:a,domain:t,challenge:r,deviceModelId:i}=e;return this.isDomainValid(t)?[await(await this._dataSource.getDomainNamePayload({chainId:a,domain:t,challenge:r})).caseOf({Left:s=>Promise.resolve({type:c.ERROR,error:s}),Right:async({data:s,keyId:g,keyUsage:u})=>{const f=await this.certificateLoader.loadCertificate({keyId:g,keyUsage:u,targetDevice:i});return{type:c.TRUSTED_NAME,payload:s,certificate:f}}})]:[{type:c.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}]}isDomainValid(e){const a=e.length>0&&Number(e.length)<30,t=new RegExp("^[a-zA-Z0-9\\-\\_\\.]+$").test(e);return a&&t}};d=m([h(),l(0,p(T.TrustedNameDataSource)),l(1,p(S.PkiCertificateLoader))],d);export{d as TrustedNameContextLoader};
|
|
2
2
|
//# sourceMappingURL=TrustedNameContextLoader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/trusted-name/domain/TrustedNameContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport {
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["inject", "injectable", "ClearSignContextType", "trustedNameTypes", "TrustedNameContextLoader", "dataSource", "
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport type { TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport { trustedNameTypes } from \"@/trusted-name/di/trustedNameTypes\";\n\nexport type TrustedNameContextInput = {\n chainId: number;\n domain: string;\n challenge: string;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRUSTED_NAME,\n];\n\n@injectable()\nexport class TrustedNameContextLoader\n implements ContextLoader<TrustedNameContextInput>\n{\n private _dataSource: TrustedNameDataSource;\n\n constructor(\n @inject(trustedNameTypes.TrustedNameDataSource)\n dataSource: TrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n ) {\n this._dataSource = dataSource;\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is TrustedNameContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"chainId\" in input &&\n \"domain\" in input &&\n \"challenge\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n typeof input.chainId === \"number\" &&\n typeof input.domain === \"string\" &&\n input.domain.length > 0 &&\n typeof input.challenge === \"string\" &&\n input.challenge.length > 0 &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: TrustedNameContextInput): Promise<ClearSignContext[]> {\n const { chainId, domain, challenge, deviceModelId } = input;\n\n if (!this.isDomainValid(domain)) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ];\n }\n\n const payload = await this._dataSource.getDomainNamePayload({\n chainId,\n domain,\n challenge,\n });\n const response = await payload.caseOf({\n Left: (error): Promise<ClearSignContext> =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error: error,\n }),\n Right: async ({ data, keyId, keyUsage }): Promise<ClearSignContext> => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId,\n keyUsage,\n targetDevice: deviceModelId,\n });\n return {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: data,\n certificate,\n };\n },\n });\n\n return [response];\n }\n\n private isDomainValid(domain: string) {\n const lengthIsValid = domain.length > 0 && Number(domain.length) < 30;\n const containsOnlyValidChars = new RegExp(\"^[a-zA-Z0-9\\\\-\\\\_\\\\.]+$\").test(\n domain,\n );\n\n return lengthIsValid && containsOnlyValidChars;\n }\n}\n"],
|
|
5
|
+
"mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,oBAGzB,OAEE,wBAAAC,MACK,kCAEP,OAAS,oBAAAC,MAAwB,qCASjC,MAAMC,EAA0C,CAC9CC,EAAqB,YACvB,EAGO,IAAMC,EAAN,KAEP,CAGE,YAEEC,EAEQC,EACR,CADQ,uBAAAA,EAER,KAAK,YAAcD,CACrB,CATQ,YAWR,UACEE,EACAC,EACkC,CAClC,OACE,OAAOD,GAAU,UACjBA,IAAU,MACV,YAAaA,GACb,WAAYA,GACZ,cAAeA,GACf,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxB,OAAOA,EAAM,SAAY,UACzB,OAAOA,EAAM,QAAW,UACxBA,EAAM,OAAO,OAAS,GACtB,OAAOA,EAAM,WAAc,UAC3BA,EAAM,UAAU,OAAS,GACzBL,EAAgB,MAAOO,GAASD,EAAc,SAASC,CAAI,CAAC,CAEhE,CAEA,MAAM,KAAKF,EAA6D,CACtE,KAAM,CAAE,QAAAG,EAAS,OAAAC,EAAQ,UAAAC,EAAW,cAAAC,CAAc,EAAIN,EAEtD,OAAK,KAAK,cAAcI,CAAM,EAkCvB,CApBU,MALD,MAAM,KAAK,YAAY,qBAAqB,CAC1D,QAAAD,EACA,OAAAC,EACA,UAAAC,CACF,CAAC,GAC8B,OAAO,CACpC,KAAOE,GACL,QAAQ,QAAQ,CACd,KAAMX,EAAqB,MAC3B,MAAOW,CACT,CAAC,EACH,MAAO,MAAO,CAAE,KAAAC,EAAM,MAAAC,EAAO,SAAAC,CAAS,IAAiC,CACrE,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAAF,EACA,SAAAC,EACA,aAAcJ,CAChB,CAAC,EACD,MAAO,CACL,KAAMV,EAAqB,aAC3B,QAASY,EACT,YAAAG,CACF,CACF,CACF,CAAC,CAEe,EAjCP,CACL,CACE,KAAMf,EAAqB,MAC3B,MAAO,IAAI,MAAM,mDAAmD,CACtE,CACF,CA6BJ,CAEQ,cAAcQ,EAAgB,CACpC,MAAMQ,EAAgBR,EAAO,OAAS,GAAK,OAAOA,EAAO,MAAM,EAAI,GAC7DS,EAAyB,IAAI,OAAO,yBAAyB,EAAE,KACnET,CACF,EAEA,OAAOQ,GAAiBC,CAC1B,CACF,EAnFahB,EAANiB,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAiB,qBAAqB,GAE7CF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,IAR5BtB",
|
|
6
|
+
"names": ["inject", "injectable", "pkiTypes", "ClearSignContextType", "trustedNameTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TrustedNameContextLoader", "dataSource", "certificateLoader", "input", "expectedTypes", "type", "chainId", "domain", "challenge", "deviceModelId", "error", "data", "keyId", "keyUsage", "certificate", "lengthIsValid", "containsOnlyValidChars", "__decorateClass", "injectable", "__decorateParam", "inject", "trustedNameTypes", "pkiTypes"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Left as
|
|
1
|
+
import{DeviceModelId as o}from"@ledgerhq/device-management-kit";import{Left as c,Right as s}from"purify-ts";import{ClearSignContextType as n}from"../../shared/model/ClearSignContext";import{TrustedNameContextLoader as u}from"../../trusted-name/domain/TrustedNameContextLoader";describe("TrustedNameContextLoader",()=>{const d={getDomainNamePayload:vi.fn(),getTrustedNamePayload:vi.fn()},i={loadCertificate:vi.fn()},a=new u(d,i),l={keyUsageNumber:1,payload:new Uint8Array([1,2,3,4])};beforeEach(()=>{vi.restoreAllMocks(),vi.spyOn(d,"getDomainNamePayload").mockResolvedValue(s({data:"payload",keyId:"testKeyId",keyUsage:"testKeyUsage"}))}),describe("canHandle function",()=>{const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX};it("should return true for valid input",()=>{expect(a.canHandle(e,[n.TRUSTED_NAME])).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(e,[n.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(t,r)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)}),it.each([[{...e,chainId:void 0},"missing chainId"],[{...e,domain:void 0},"missing domain"],[{...e,challenge:void 0},"missing challenge"],[{...e,deviceModelId:void 0},"missing device model"]])("should return false for %s",(t,r)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)}),it.each([[{...e,domain:""},"empty domain"],[{...e,challenge:""},"empty challenge"],[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"],[{...e,domain:123},"numeric domain"],[{...e,challenge:123},"numeric challenge"]])("should return false for %s",(t,r)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)})}),describe("load function",()=>{it("should return an error when domain > max length",async()=>{const e={chainId:1,domain:"maxlength-maxlength-maxlength-maxlength-maxlength-maxlength",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).not.toHaveBeenCalled(),expect(t).toEqual([{type:n.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}])}),it("should return an error when domain is not valid",async()=>{const e={chainId:1,domain:"hello\u{1F44B}",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).not.toHaveBeenCalled(),expect(t).toEqual([{type:n.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}])}),it("should return a payload",async()=>{vi.spyOn(i,"loadCertificate").mockResolvedValue(l);const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).toHaveBeenCalledWith({keyId:"testKeyId",keyUsage:"testKeyUsage",targetDevice:o.STAX}),expect(t).toEqual([{type:n.TRUSTED_NAME,payload:"payload",certificate:l}])}),it("should return an error when unable to fetch the datasource",async()=>{const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX};vi.spyOn(d,"getDomainNamePayload").mockResolvedValue(c(new Error("error")));const t=await a.load(e);expect(t).toEqual([{type:n.ERROR,error:new Error("error")}])})})});
|
|
2
2
|
//# sourceMappingURL=TrustedNameContextLoader.test.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/trusted-name/domain/TrustedNameContextLoader.test.ts"],
|
|
4
|
-
"sourcesContent": ["import { Left, Right } from \"purify-ts\";\n\nimport {
|
|
5
|
-
"mappings": "AAAA,OAAS,
|
|
6
|
-
"names": ["Left", "Right", "ClearSignContextType", "TrustedNameContextLoader", "mockTrustedNameDataSource", "
|
|
4
|
+
"sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport {\n type TrustedNameContextInput,\n TrustedNameContextLoader,\n} from \"@/trusted-name/domain/TrustedNameContextLoader\";\n\ndescribe(\"TrustedNameContextLoader\", () => {\n const mockTrustedNameDataSource: TrustedNameDataSource = {\n getDomainNamePayload: vi.fn(),\n getTrustedNamePayload: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TrustedNameContextLoader(\n mockTrustedNameDataSource,\n mockCertificateLoader,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3, 4]),\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getDomainNamePayload\",\n ).mockResolvedValue(\n Right({\n data: \"payload\",\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n }),\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.TRUSTED_NAME]),\n ).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n\n it.each([\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, domain: undefined }, \"missing domain\"],\n [{ ...validInput, challenge: undefined }, \"missing challenge\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing device model\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n\n it.each([\n [{ ...validInput, domain: \"\" }, \"empty domain\"],\n [{ ...validInput, challenge: \"\" }, \"empty challenge\"],\n [{ ...validInput, chainId: \"1\" }, \"string chainId\"],\n [{ ...validInput, chainId: null }, \"null chainId\"],\n [{ ...validInput, domain: 123 }, \"numeric domain\"],\n [{ ...validInput, challenge: 123 }, \"numeric challenge\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n it(\"should return an error when domain > max length\", async () => {\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"maxlength-maxlength-maxlength-maxlength-maxlength-maxlength\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ]);\n });\n\n it(\"should return an error when domain is not valid\", async () => {\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello\uD83D\uDC4B\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ]);\n });\n\n it(\"should return a payload\", async () => {\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n targetDevice: DeviceModelId.STAX,\n });\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"payload\",\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should return an error when unable to fetch the datasource\", async () => {\n // GIVEN\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n // WHEN\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getDomainNamePayload\",\n ).mockResolvedValue(Left(new Error(\"error\")));\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([\n { type: ClearSignContextType.ERROR, error: new Error(\"error\") },\n ]);\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DeviceModelId", "Left", "Right", "ClearSignContextType", "TrustedNameContextLoader", "mockTrustedNameDataSource", "mockCertificateLoader", "loader", "mockCertificate", "validInput", "input", "_description", "result"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var S=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var
|
|
1
|
+
var S=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var h=(l,e,r,t)=>{for(var a=t>1?void 0:t?D(e,r):e,n=l.length-1,o;n>=0;n--)(o=l[n])&&(a=(t?o(e,r,a):o(a))||a);return t&&a&&S(e,r,a),a},p=(l,e)=>(r,t)=>e(r,t,l);import{bufferToHexaString as m}from"@ledgerhq/device-management-kit";import{inject as y,injectable as I}from"inversify";import{pkiTypes as k}from"../../pki/di/pkiTypes";import{proxyTypes as P}from"../../proxy/di/proxyTypes";import{ClearSignContextType as F}from"../../shared/model/ClearSignContext";import{TypedDataCalldataParamPresence as A,VERIFYING_CONTRACT_TOKEN_INDEX as R}from"../../shared/model/TypedDataClearSignContext";import{tokenTypes as H}from"../../token/di/tokenTypes";import{typedDataTypes as N}from"../../typed-data/di/typedDataTypes";let u=class{constructor(e,r,t,a){this.dataSource=e;this.tokenDataSource=r;this.proxyDataSource=t;this._certificateLoader=a}async load(e){let r,t=await this.dataSource.getTypedDataFilters({address:e.verifyingContract,chainId:e.chainId,version:e.version,schema:e.schema});if(t.isLeft()){const{resolvedAddress:i,context:s}=await this.resolveProxy(e);if(s!==void 0&&(r=s,t=await this.dataSource.getTypedDataFilters({address:i,chainId:e.chainId,version:e.version,schema:e.schema})),t.isLeft())return{type:"error",error:t.extract()}}const{messageInfo:a,filters:n,calldatasInfos:o}=t.unsafeCoerce(),d=n.reduce((i,s)=>(i[s.path]=s,i),{});return{type:"success",messageInfo:a,filters:d,trustedNamesAddresses:this.extractTrustedNames(n,e),tokens:await this.extractTokens(n,e),calldatas:this.extractCalldatas(n,o,e),proxy:r}}async resolveProxy(e){const r=await this.proxyDataSource.getProxyImplementationAddress({calldata:"0x",proxyAddress:e.verifyingContract,chainId:e.chainId,challenge:e.challenge??""});if(r.isLeft())return{resolvedAddress:e.verifyingContract,context:void 0};const t=r.unsafeCoerce(),a=await this._certificateLoader.loadCertificate({keyId:t.keyId,keyUsage:t.keyUsage,targetDevice:e.deviceModelId});return{resolvedAddress:t.implementationAddress,context:{type:F.PROXY_INFO,payload:t.signedDescriptor,certificate:a}}}extractTrustedNames(e,r){return e.filter(t=>t.type==="trusted-name").reduce((t,a)=>{const n=r.fieldsValues.filter(o=>o.path===a.path);if(n.length!==0){const o=n[0],d=this.convertAddressToHexaString(o.value);t[a.path]=d}return t},{})}async extractTokens(e,r){const t={};for(const a of e){if(a.type!=="token"&&a.type!=="amount")continue;const n=a.tokenIndex;if(t[n]===void 0){if(a.type==="token"){const o=r.fieldsValues.filter(s=>s.path===a.path);if(o.length===0)continue;const d=o[0],i=this.convertAddressToHexaString(d.value);if(o.every(s=>this.convertAddressToHexaString(s.value)===i)){const s=r.chainId;(await this.tokenDataSource.getTokenInfosPayload({address:i,chainId:s})).ifRight(f=>{t[n]=f})}}else if(a.type==="amount"&&n===R){const o=r.verifyingContract,d=r.chainId;(await this.tokenDataSource.getTokenInfosPayload({address:o,chainId:d})).ifRight(s=>{t[n]=s})}}}return t}extractCalldatas(e,r,t){const a=e.reduce((o,d)=>{if(d.type==="calldata-value"||d.type==="calldata-callee"||d.type==="calldata-chain-id"||d.type==="calldata-selector"||d.type==="calldata-amount"||d.type==="calldata-spender"){const i=o[d.calldataIndex];i===void 0?o[d.calldataIndex]=[d]:i.push(d)}return o},{}),n={};for(const o in r){const d=r[o],i=a[o];if(!i)continue;const s=this.extractHexaString(i.find(c=>c.type==="calldata-value"),t,"0x"),T=this.extractHexaString(i.find(c=>c.type==="calldata-selector"),t,s.slice(0,10)),f=this.extractAddress(i.find(c=>c.type==="calldata-callee"),t,d.calleeFlag),g=this.extractAddress(i.find(c=>c.type==="calldata-spender"),t,d.spenderFlag),C=this.extractBigint(i.find(c=>c.type==="calldata-amount"),t,void 0),x=this.extractBigint(i.find(c=>c.type==="calldata-chain-id"),t,void 0),v=x!==void 0&&x<Number.MAX_SAFE_INTEGER?Number(x):t.chainId;n[o]={filter:d,subset:{chainId:v,data:s,selector:T,to:f,value:C,from:g}}}return n}extractHexaString(e,r,t){if(e!==void 0){const a=r.fieldsValues.filter(n=>n.path===e.path);if(a.length!==0)return m(a[0].value)}return t}extractAddress(e,r,t,a){if(t===A.VerifyingContract)return r.verifyingContract;if(e!==void 0){const n=r.fieldsValues.filter(o=>o.path===e.path);if(n.length!==0)return this.convertAddressToHexaString(n[0].value)}return a}extractBigint(e,r,t){if(e!==void 0){const a=r.fieldsValues.filter(n=>n.path===e.path);if(a.length!==0)return BigInt(m(a[0].value))}return t}convertAddressToHexaString(e){return`0x${Array.from(e,r=>r.toString(16).padStart(2,"0")).join("").padStart(40,"0")}`}};u=h([I(),p(0,y(N.TypedDataDataSource)),p(1,y(H.TokenDataSource)),p(2,y(P.ProxyDataSource)),p(3,y(k.PkiCertificateLoader))],u);export{u as DefaultTypedDataContextLoader};
|
|
2
2
|
//# sourceMappingURL=DefaultTypedDataContextLoader.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/typed-data/domain/DefaultTypedDataContextLoader.ts"],
|
|
4
|
-
"sourcesContent": ["import type { HexaString } from \"@ledgerhq/device-management-kit\";\nimport { bufferToHexaString } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/pki/model/KeyId\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport type { ProxyDataSource } from \"@/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/proxy/di/proxyTypes\";\nimport {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport type {\n TypedDataCalldataIndex,\n TypedDataCalldataInfo,\n TypedDataClearSignContext,\n TypedDataFilter,\n TypedDataFilterCalldata,\n TypedDataFilterCalldataInfo,\n TypedDataFilterPath,\n TypedDataToken,\n TypedDataTokenIndex,\n} from \"@/shared/model/TypedDataClearSignContext\";\nimport {\n TypedDataCalldataParamPresence,\n VERIFYING_CONTRACT_TOKEN_INDEX,\n} from \"@/shared/model/TypedDataClearSignContext\";\nimport type { TypedDataContext } from \"@/shared/model/TypedDataContext\";\nimport type { TokenDataSource } from \"@/token/data/TokenDataSource\";\nimport { tokenTypes } from \"@/token/di/tokenTypes\";\nimport type { TypedDataDataSource } from \"@/typed-data/data/TypedDataDataSource\";\nimport { typedDataTypes } from \"@/typed-data/di/typedDataTypes\";\nimport type { TypedDataContextLoader } from \"@/typed-data/domain/TypedDataContextLoader\";\n\ntype ResolvedProxy = {\n resolvedAddress: string;\n context?: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>;\n};\n\n@injectable()\nexport class DefaultTypedDataContextLoader implements TypedDataContextLoader {\n constructor(\n @inject(typedDataTypes.TypedDataDataSource)\n private dataSource: TypedDataDataSource,\n @inject(tokenTypes.TokenDataSource)\n private tokenDataSource: TokenDataSource,\n @inject(proxyTypes.ProxyDataSource)\n private proxyDataSource: ProxyDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private _certificateLoader: PkiCertificateLoader,\n ) {}\n\n async load(typedData: TypedDataContext): Promise<TypedDataClearSignContext> {\n // Get the typed data filters from the data source\n let proxy:\n | ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>\n | undefined = undefined;\n let data = await this.dataSource.getTypedDataFilters({\n address: typedData.verifyingContract,\n chainId: typedData.chainId,\n version: typedData.version,\n schema: typedData.schema,\n });\n\n // If there was an error getting the typed data filters, try to resolve a proxy at that address\n if (data.isLeft()) {\n const { resolvedAddress, context } = await this.resolveProxy(typedData);\n if (context !== undefined) {\n proxy = context;\n data = await this.dataSource.getTypedDataFilters({\n address: resolvedAddress,\n chainId: typedData.chainId,\n version: typedData.version,\n schema: typedData.schema,\n });\n }\n // If there was stil an error, return immediately\n if (data.isLeft()) {\n return {\n type: \"error\",\n error: data.extract(),\n };\n }\n }\n\n // Else, extract the message info and filters\n const { messageInfo, filters, calldatasInfos } = data.unsafeCoerce();\n const mappedFilters = filters.reduce(\n (acc, filter) => {\n acc[filter.path] = filter;\n return acc;\n },\n {} as Record<TypedDataFilterPath, TypedDataFilter>,\n );\n\n return {\n type: \"success\",\n messageInfo,\n filters: mappedFilters,\n trustedNamesAddresses: this.extractTrustedNames(filters, typedData),\n tokens: await this.extractTokens(filters, typedData),\n calldatas: this.extractCalldatas(filters, calldatasInfos, typedData),\n proxy,\n };\n }\n\n private async resolveProxy(\n typedData: TypedDataContext,\n ): Promise<ResolvedProxy> {\n // Try to resolve the proxy\n const proxyDelegateCall =\n await this.proxyDataSource.getProxyImplementationAddress({\n calldata: \"0x\",\n proxyAddress: typedData.verifyingContract,\n chainId: typedData.chainId,\n challenge: typedData.challenge ?? \"\",\n });\n\n // Early return on failure\n if (proxyDelegateCall.isLeft()) {\n return {\n resolvedAddress: typedData.verifyingContract,\n context: undefined,\n };\n }\n\n // Fetch descriptor on success\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: KeyId.CalCalldataKey,\n keyUsage: KeyUsage.Calldata,\n targetDevice: typedData.deviceModelId,\n });\n const proxyData = proxyDelegateCall.unsafeCoerce();\n return {\n resolvedAddress: proxyData.implementationAddress,\n context: {\n type: ClearSignContextType.PROXY_INFO,\n payload: proxyData.signedDescriptor,\n certificate,\n },\n };\n }\n\n private extractTrustedNames(\n filters: TypedDataFilter[],\n typedData: TypedDataContext,\n ): Record<TypedDataFilterPath, HexaString> {\n return filters\n .filter((filter) => filter.type === \"trusted-name\")\n .reduce(\n (acc, filter) => {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n const value = values[0]!;\n const address = this.convertAddressToHexaString(value.value);\n acc[filter.path] = address;\n }\n return acc;\n },\n {} as Record<TypedDataFilterPath, HexaString>,\n );\n }\n\n private async extractTokens(\n filters: TypedDataFilter[],\n typedData: TypedDataContext,\n ): Promise<Record<TypedDataTokenIndex, TypedDataToken>> {\n const mappedTokens: Record<TypedDataTokenIndex, TypedDataToken> = {};\n for (const filter of filters) {\n if (filter.type !== \"token\" && filter.type !== \"amount\") {\n continue; // no token reference\n }\n const tokenIndex = filter.tokenIndex;\n if (mappedTokens[tokenIndex] !== undefined) {\n continue; // Already fetched for a previous filter\n }\n\n // If the filter is a token, get token address from typed message values, and fetch descriptor\n if (filter.type === \"token\") {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length === 0) {\n // No value matching the referenced token. It may be located in an empty array.\n continue;\n }\n const value = values[0]!;\n const address = this.convertAddressToHexaString(value.value);\n\n // Arrays with different tokens are not supported since there is only 1 tokenIndex per filter.\n // Only fetch tokens if all values are the same.\n if (\n values.every(\n (entry) => this.convertAddressToHexaString(entry.value) === address,\n )\n ) {\n // Fetch descriptor\n const chainId = typedData.chainId;\n const payload = await this.tokenDataSource.getTokenInfosPayload({\n address,\n chainId,\n });\n payload.ifRight((p) => {\n mappedTokens[tokenIndex] = p;\n });\n }\n }\n\n // If the filter is an amount with a reference to the verifyingContract, fetch verifyingContract descriptor.\n // This is because descriptors data-sources should be compatible with Ledger devices specifications:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#amount-join-value\n else if (\n filter.type === \"amount\" &&\n tokenIndex === VERIFYING_CONTRACT_TOKEN_INDEX\n ) {\n const address = typedData.verifyingContract;\n const chainId = typedData.chainId;\n const payload = await this.tokenDataSource.getTokenInfosPayload({\n address,\n chainId,\n });\n payload.ifRight((p) => {\n mappedTokens[tokenIndex] = p;\n });\n }\n }\n return mappedTokens;\n }\n\n private extractCalldatas(\n filters: TypedDataFilter[],\n calldatasInfos: Record<TypedDataCalldataIndex, TypedDataFilterCalldataInfo>,\n typedData: TypedDataContext,\n ): Record<TypedDataCalldataIndex, TypedDataCalldataInfo> {\n // Map filters per calldataIndex\n const calldataFilters = filters.reduce(\n (acc, filter) => {\n if (\n filter.type === \"calldata-value\" ||\n filter.type === \"calldata-callee\" ||\n filter.type === \"calldata-chain-id\" ||\n filter.type === \"calldata-selector\" ||\n filter.type === \"calldata-amount\" ||\n filter.type === \"calldata-spender\"\n ) {\n const array = acc[filter.calldataIndex];\n if (array === undefined) {\n acc[filter.calldataIndex] = [filter];\n } else {\n array.push(filter);\n }\n }\n return acc;\n },\n {} as Record<TypedDataCalldataIndex, TypedDataFilterCalldata[]>,\n );\n\n // Iterate over calldatas\n const mappedCalldatas: Record<\n TypedDataCalldataIndex,\n TypedDataCalldataInfo\n > = {};\n for (const calldataIndex in calldatasInfos) {\n const infos = calldatasInfos[calldataIndex]!;\n const filters = calldataFilters[calldataIndex];\n if (!filters) {\n continue;\n }\n\n // Get data\n const data = this.extractHexaString(\n filters.find((filter) => filter.type === \"calldata-value\"),\n typedData,\n \"0x\",\n );\n\n // Get selector\n const selector = this.extractHexaString(\n filters.find((filter) => filter.type === \"calldata-selector\"),\n typedData,\n data.slice(0, 10),\n );\n\n // Get to\n const to = this.extractAddress(\n filters.find((filter) => filter.type === \"calldata-callee\"),\n typedData,\n infos.calleeFlag,\n );\n\n // Get from\n const from = this.extractAddress(\n filters.find((filter) => filter.type === \"calldata-spender\"),\n typedData,\n infos.spenderFlag,\n );\n\n // Get amount\n const value = this.extractBigint(\n filters.find((filter) => filter.type === \"calldata-amount\"),\n typedData,\n undefined,\n );\n\n // Get chainId\n const chainIdBigint = this.extractBigint(\n filters.find((filter) => filter.type === \"calldata-chain-id\"),\n typedData,\n undefined,\n );\n const chainId =\n chainIdBigint !== undefined && chainIdBigint < Number.MAX_SAFE_INTEGER\n ? Number(chainIdBigint)\n : typedData.chainId;\n\n mappedCalldatas[calldataIndex] = {\n filter: infos,\n subset: {\n chainId,\n data,\n selector,\n to,\n value,\n from,\n },\n };\n }\n return mappedCalldatas;\n }\n\n private extractHexaString(\n filter: TypedDataFilter | undefined,\n typedData: TypedDataContext,\n defaultValue: string,\n ): string {\n if (filter !== undefined) {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n return bufferToHexaString(values[0]!.value);\n }\n }\n return defaultValue;\n }\n\n private extractAddress(\n filter: TypedDataFilter | undefined,\n typedData: TypedDataContext,\n presenceFlag: TypedDataCalldataParamPresence,\n defaultValue?: string,\n ): string | undefined {\n if (presenceFlag === TypedDataCalldataParamPresence.VerifyingContract) {\n return typedData.verifyingContract;\n } else if (filter !== undefined) {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n return this.convertAddressToHexaString(values[0]!.value);\n }\n }\n return defaultValue;\n }\n\n private extractBigint(\n filter: TypedDataFilter | undefined,\n typedData: TypedDataContext,\n defaultValue: bigint | undefined,\n ): bigint | undefined {\n if (filter !== undefined) {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n return BigInt(bufferToHexaString(values[0]!.value));\n }\n }\n return defaultValue;\n }\n\n private convertAddressToHexaString(address: Uint8Array): HexaString {\n // Address size is 20 bytes so 40 characters, padded with zeros on the left\n return `0x${Array.from(address, (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n )\n .join(\"\")\n .padStart(40, \"0\")}`;\n }\n}\n"],
|
|
5
|
-
"mappings": "iOACA,OAAS,sBAAAA,MAA0B,kCACnC,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,
|
|
6
|
-
"names": ["bufferToHexaString", "inject", "injectable", "pkiTypes", "
|
|
4
|
+
"sourcesContent": ["import type { HexaString } from \"@ledgerhq/device-management-kit\";\nimport { bufferToHexaString } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport type { ProxyDataSource } from \"@/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/proxy/di/proxyTypes\";\nimport {\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport type {\n TypedDataCalldataIndex,\n TypedDataCalldataInfo,\n TypedDataClearSignContext,\n TypedDataFilter,\n TypedDataFilterCalldata,\n TypedDataFilterCalldataInfo,\n TypedDataFilterPath,\n TypedDataToken,\n TypedDataTokenIndex,\n} from \"@/shared/model/TypedDataClearSignContext\";\nimport {\n TypedDataCalldataParamPresence,\n VERIFYING_CONTRACT_TOKEN_INDEX,\n} from \"@/shared/model/TypedDataClearSignContext\";\nimport type { TypedDataContext } from \"@/shared/model/TypedDataContext\";\nimport type { TokenDataSource } from \"@/token/data/TokenDataSource\";\nimport { tokenTypes } from \"@/token/di/tokenTypes\";\nimport type { TypedDataDataSource } from \"@/typed-data/data/TypedDataDataSource\";\nimport { typedDataTypes } from \"@/typed-data/di/typedDataTypes\";\nimport type { TypedDataContextLoader } from \"@/typed-data/domain/TypedDataContextLoader\";\n\ntype ResolvedProxy = {\n resolvedAddress: string;\n context?: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>;\n};\n\n@injectable()\nexport class DefaultTypedDataContextLoader implements TypedDataContextLoader {\n constructor(\n @inject(typedDataTypes.TypedDataDataSource)\n private dataSource: TypedDataDataSource,\n @inject(tokenTypes.TokenDataSource)\n private tokenDataSource: TokenDataSource,\n @inject(proxyTypes.ProxyDataSource)\n private proxyDataSource: ProxyDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private _certificateLoader: PkiCertificateLoader,\n ) {}\n\n async load(typedData: TypedDataContext): Promise<TypedDataClearSignContext> {\n // Get the typed data filters from the data source\n let proxy:\n | ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>\n | undefined = undefined;\n let data = await this.dataSource.getTypedDataFilters({\n address: typedData.verifyingContract,\n chainId: typedData.chainId,\n version: typedData.version,\n schema: typedData.schema,\n });\n\n // If there was an error getting the typed data filters, try to resolve a proxy at that address\n if (data.isLeft()) {\n const { resolvedAddress, context } = await this.resolveProxy(typedData);\n if (context !== undefined) {\n proxy = context;\n data = await this.dataSource.getTypedDataFilters({\n address: resolvedAddress,\n chainId: typedData.chainId,\n version: typedData.version,\n schema: typedData.schema,\n });\n }\n // If there was stil an error, return immediately\n if (data.isLeft()) {\n return {\n type: \"error\",\n error: data.extract(),\n };\n }\n }\n\n // Else, extract the message info and filters\n const { messageInfo, filters, calldatasInfos } = data.unsafeCoerce();\n const mappedFilters = filters.reduce(\n (acc, filter) => {\n acc[filter.path] = filter;\n return acc;\n },\n {} as Record<TypedDataFilterPath, TypedDataFilter>,\n );\n\n return {\n type: \"success\",\n messageInfo,\n filters: mappedFilters,\n trustedNamesAddresses: this.extractTrustedNames(filters, typedData),\n tokens: await this.extractTokens(filters, typedData),\n calldatas: this.extractCalldatas(filters, calldatasInfos, typedData),\n proxy,\n };\n }\n\n private async resolveProxy(\n typedData: TypedDataContext,\n ): Promise<ResolvedProxy> {\n // Try to resolve the proxy\n const proxyDelegateCall =\n await this.proxyDataSource.getProxyImplementationAddress({\n calldata: \"0x\",\n proxyAddress: typedData.verifyingContract,\n chainId: typedData.chainId,\n challenge: typedData.challenge ?? \"\",\n });\n\n // Early return on failure\n if (proxyDelegateCall.isLeft()) {\n return {\n resolvedAddress: typedData.verifyingContract,\n context: undefined,\n };\n }\n\n // Fetch descriptor on success\n const proxyData = proxyDelegateCall.unsafeCoerce();\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: proxyData.keyId,\n keyUsage: proxyData.keyUsage,\n targetDevice: typedData.deviceModelId,\n });\n return {\n resolvedAddress: proxyData.implementationAddress,\n context: {\n type: ClearSignContextType.PROXY_INFO,\n payload: proxyData.signedDescriptor,\n certificate,\n },\n };\n }\n\n private extractTrustedNames(\n filters: TypedDataFilter[],\n typedData: TypedDataContext,\n ): Record<TypedDataFilterPath, HexaString> {\n return filters\n .filter((filter) => filter.type === \"trusted-name\")\n .reduce(\n (acc, filter) => {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n const value = values[0]!;\n const address = this.convertAddressToHexaString(value.value);\n acc[filter.path] = address;\n }\n return acc;\n },\n {} as Record<TypedDataFilterPath, HexaString>,\n );\n }\n\n private async extractTokens(\n filters: TypedDataFilter[],\n typedData: TypedDataContext,\n ): Promise<Record<TypedDataTokenIndex, TypedDataToken>> {\n const mappedTokens: Record<TypedDataTokenIndex, TypedDataToken> = {};\n for (const filter of filters) {\n if (filter.type !== \"token\" && filter.type !== \"amount\") {\n continue; // no token reference\n }\n const tokenIndex = filter.tokenIndex;\n if (mappedTokens[tokenIndex] !== undefined) {\n continue; // Already fetched for a previous filter\n }\n\n // If the filter is a token, get token address from typed message values, and fetch descriptor\n if (filter.type === \"token\") {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length === 0) {\n // No value matching the referenced token. It may be located in an empty array.\n continue;\n }\n const value = values[0]!;\n const address = this.convertAddressToHexaString(value.value);\n\n // Arrays with different tokens are not supported since there is only 1 tokenIndex per filter.\n // Only fetch tokens if all values are the same.\n if (\n values.every(\n (entry) => this.convertAddressToHexaString(entry.value) === address,\n )\n ) {\n // Fetch descriptor\n const chainId = typedData.chainId;\n const payload = await this.tokenDataSource.getTokenInfosPayload({\n address,\n chainId,\n });\n payload.ifRight((p) => {\n mappedTokens[tokenIndex] = p;\n });\n }\n }\n\n // If the filter is an amount with a reference to the verifyingContract, fetch verifyingContract descriptor.\n // This is because descriptors data-sources should be compatible with Ledger devices specifications:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#amount-join-value\n else if (\n filter.type === \"amount\" &&\n tokenIndex === VERIFYING_CONTRACT_TOKEN_INDEX\n ) {\n const address = typedData.verifyingContract;\n const chainId = typedData.chainId;\n const payload = await this.tokenDataSource.getTokenInfosPayload({\n address,\n chainId,\n });\n payload.ifRight((p) => {\n mappedTokens[tokenIndex] = p;\n });\n }\n }\n return mappedTokens;\n }\n\n private extractCalldatas(\n filters: TypedDataFilter[],\n calldatasInfos: Record<TypedDataCalldataIndex, TypedDataFilterCalldataInfo>,\n typedData: TypedDataContext,\n ): Record<TypedDataCalldataIndex, TypedDataCalldataInfo> {\n // Map filters per calldataIndex\n const calldataFilters = filters.reduce(\n (acc, filter) => {\n if (\n filter.type === \"calldata-value\" ||\n filter.type === \"calldata-callee\" ||\n filter.type === \"calldata-chain-id\" ||\n filter.type === \"calldata-selector\" ||\n filter.type === \"calldata-amount\" ||\n filter.type === \"calldata-spender\"\n ) {\n const array = acc[filter.calldataIndex];\n if (array === undefined) {\n acc[filter.calldataIndex] = [filter];\n } else {\n array.push(filter);\n }\n }\n return acc;\n },\n {} as Record<TypedDataCalldataIndex, TypedDataFilterCalldata[]>,\n );\n\n // Iterate over calldatas\n const mappedCalldatas: Record<\n TypedDataCalldataIndex,\n TypedDataCalldataInfo\n > = {};\n for (const calldataIndex in calldatasInfos) {\n const infos = calldatasInfos[calldataIndex]!;\n const filters = calldataFilters[calldataIndex];\n if (!filters) {\n continue;\n }\n\n // Get data\n const data = this.extractHexaString(\n filters.find((filter) => filter.type === \"calldata-value\"),\n typedData,\n \"0x\",\n );\n\n // Get selector\n const selector = this.extractHexaString(\n filters.find((filter) => filter.type === \"calldata-selector\"),\n typedData,\n data.slice(0, 10),\n );\n\n // Get to\n const to = this.extractAddress(\n filters.find((filter) => filter.type === \"calldata-callee\"),\n typedData,\n infos.calleeFlag,\n );\n\n // Get from\n const from = this.extractAddress(\n filters.find((filter) => filter.type === \"calldata-spender\"),\n typedData,\n infos.spenderFlag,\n );\n\n // Get amount\n const value = this.extractBigint(\n filters.find((filter) => filter.type === \"calldata-amount\"),\n typedData,\n undefined,\n );\n\n // Get chainId\n const chainIdBigint = this.extractBigint(\n filters.find((filter) => filter.type === \"calldata-chain-id\"),\n typedData,\n undefined,\n );\n const chainId =\n chainIdBigint !== undefined && chainIdBigint < Number.MAX_SAFE_INTEGER\n ? Number(chainIdBigint)\n : typedData.chainId;\n\n mappedCalldatas[calldataIndex] = {\n filter: infos,\n subset: {\n chainId,\n data,\n selector,\n to,\n value,\n from,\n },\n };\n }\n return mappedCalldatas;\n }\n\n private extractHexaString(\n filter: TypedDataFilter | undefined,\n typedData: TypedDataContext,\n defaultValue: string,\n ): string {\n if (filter !== undefined) {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n return bufferToHexaString(values[0]!.value);\n }\n }\n return defaultValue;\n }\n\n private extractAddress(\n filter: TypedDataFilter | undefined,\n typedData: TypedDataContext,\n presenceFlag: TypedDataCalldataParamPresence,\n defaultValue?: string,\n ): string | undefined {\n if (presenceFlag === TypedDataCalldataParamPresence.VerifyingContract) {\n return typedData.verifyingContract;\n } else if (filter !== undefined) {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n return this.convertAddressToHexaString(values[0]!.value);\n }\n }\n return defaultValue;\n }\n\n private extractBigint(\n filter: TypedDataFilter | undefined,\n typedData: TypedDataContext,\n defaultValue: bigint | undefined,\n ): bigint | undefined {\n if (filter !== undefined) {\n const values = typedData.fieldsValues.filter(\n (entry) => entry.path === filter.path,\n );\n if (values.length !== 0) {\n return BigInt(bufferToHexaString(values[0]!.value));\n }\n }\n return defaultValue;\n }\n\n private convertAddressToHexaString(address: Uint8Array): HexaString {\n // Address size is 20 bytes so 40 characters, padded with zeros on the left\n return `0x${Array.from(address, (byte) =>\n byte.toString(16).padStart(2, \"0\"),\n )\n .join(\"\")\n .padStart(40, \"0\")}`;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["bufferToHexaString", "inject", "injectable", "pkiTypes", "proxyTypes", "ClearSignContextType", "TypedDataCalldataParamPresence", "VERIFYING_CONTRACT_TOKEN_INDEX", "tokenTypes", "typedDataTypes", "DefaultTypedDataContextLoader", "dataSource", "tokenDataSource", "proxyDataSource", "_certificateLoader", "typedData", "proxy", "data", "resolvedAddress", "context", "messageInfo", "filters", "calldatasInfos", "mappedFilters", "acc", "filter", "proxyDelegateCall", "proxyData", "certificate", "ClearSignContextType", "values", "entry", "value", "address", "mappedTokens", "tokenIndex", "chainId", "p", "VERIFYING_CONTRACT_TOKEN_INDEX", "calldataFilters", "array", "mappedCalldatas", "calldataIndex", "infos", "selector", "to", "from", "chainIdBigint", "defaultValue", "bufferToHexaString", "presenceFlag", "TypedDataCalldataParamPresence", "byte", "__decorateClass", "injectable", "__decorateParam", "inject", "typedDataTypes", "tokenTypes", "proxyTypes", "pkiTypes"]
|
|
7
7
|
}
|