@ledgerhq/context-module 0.0.0-develop-20260721105622 → 0.0.0-develop-20260726002715

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.
@@ -58,5 +58,5 @@
58
58
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
59
59
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
60
60
  },
61
- "version": "0.0.0-develop-20260721105622"
61
+ "version": "0.0.0-develop-20260726002715"
62
62
  }
@@ -1,2 +1,2 @@
1
- "use strict";var f=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var C=(o,e)=>{for(var r in e)f(o,r,{get:e[r],enumerable:!0})},O=(o,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of g(e))!I.call(o,t)&&t!==r&&f(o,t,{get:()=>e[t],enumerable:!(n=p(e,t))||n.enumerable});return o};var D=o=>O(f({},"__esModule",{value:!0}),o),w=(o,e,r,n)=>{for(var t=n>1?void 0:n?p(e,r):e,i=o.length-1,s;i>=0;i--)(s=o[i])&&(t=(n?s(e,r,t):s(t))||t);return n&&t&&f(e,r,t),t},l=(o,e)=>(r,n)=>e(r,n,o);var k={};C(k,{HttpOwnerInfoDataSource:()=>c});module.exports=D(k);var m=require("@ledgerhq/device-management-kit"),d=require("inversify"),a=require("purify-ts"),S=require("../../../../config/di/configTypes"),h=require("../../../../shared/network/di/networkTypes");let c=class{constructor(e,r){this.config=e;this.http=r;if(!this.config.originToken)throw new Error("[ContextModule] - HttpOwnerInfoDataSource: origin token is required")}isSolanaSPLOwnerInfo(e){return typeof e!="object"||e===null?!1:typeof e.tokenAccount=="string"&&typeof e.owner=="string"&&typeof e.contract=="string"&&typeof e.signedDescriptor=="string"}async fetchAddressMetadata(e,r){try{const n=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/owner/${e}`,{params:{challenge:r}});return this.isSolanaSPLOwnerInfo(n)?(0,a.Right)(n):(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape"))}catch{return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata"))}}async computeAddressMetadata(e,r,n){try{const t=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${e}/${r}`,{params:{challenge:n}});return this.isSolanaSPLOwnerInfo(t)?(0,a.Right)(t):(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape"))}catch{return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata"))}}async getOwnerInfo(e){const{tokenAddress:r,challenge:n,createATA:t}=e;if(!n)return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required"));let i;if(r)i=await this.fetchAddressMetadata(r,n);else if(t?.address&&t?.mintAddress)i=await this.computeAddressMetadata(t.address,t.mintAddress,n);else return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided"));return i.chain(s=>{const u=(0,m.hexaStringToBuffer)(s.signedDescriptor);return u?(0,a.Right)({tlvDescriptor:u}):(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received"))})}};c=w([(0,d.injectable)(),l(0,(0,d.inject)(S.configTypes.Config)),l(1,(0,d.inject)(h.networkTypes.NetworkClient))],c);0&&(module.exports={HttpOwnerInfoDataSource});
1
+ "use strict";var f=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var g=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var C=(o,e)=>{for(var r in e)f(o,r,{get:e[r],enumerable:!0})},O=(o,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of g(e))!I.call(o,t)&&t!==r&&f(o,t,{get:()=>e[t],enumerable:!(n=p(e,t))||n.enumerable});return o};var v=o=>O(f({},"__esModule",{value:!0}),o),w=(o,e,r,n)=>{for(var t=n>1?void 0:n?p(e,r):e,i=o.length-1,s;i>=0;i--)(s=o[i])&&(t=(n?s(e,r,t):s(t))||t);return n&&t&&f(e,r,t),t},l=(o,e)=>(r,n)=>e(r,n,o);var y={};C(y,{HttpOwnerInfoDataSource:()=>c});module.exports=v(y);var m=require("@ledgerhq/device-management-kit"),d=require("inversify"),a=require("purify-ts"),S=require("../../../../config/di/configTypes"),h=require("../../../../shared/network/di/networkTypes");let c=class{constructor(e,r){this.config=e;this.http=r}isSolanaSPLOwnerInfo(e){return typeof e!="object"||e===null?!1:typeof e.tokenAccount=="string"&&typeof e.owner=="string"&&typeof e.contract=="string"&&typeof e.signedDescriptor=="string"}async fetchAddressMetadata(e,r){try{const n=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/owner/${e}`,{params:{challenge:r}});return this.isSolanaSPLOwnerInfo(n)?(0,a.Right)(n):(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape"))}catch{return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata"))}}async computeAddressMetadata(e,r,n){try{const t=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${e}/${r}`,{params:{challenge:n}});return this.isSolanaSPLOwnerInfo(t)?(0,a.Right)(t):(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape"))}catch{return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata"))}}async getOwnerInfo(e){const{tokenAddress:r,challenge:n,createATA:t}=e;if(!n)return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required"));let i;if(r)i=await this.fetchAddressMetadata(r,n);else if(t?.address&&t?.mintAddress)i=await this.computeAddressMetadata(t.address,t.mintAddress,n);else return(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided"));return i.chain(s=>{const u=(0,m.hexaStringToBuffer)(s.signedDescriptor);return u?(0,a.Right)({tlvDescriptor:u}):(0,a.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received"))})}};c=w([(0,d.injectable)(),l(0,(0,d.inject)(S.configTypes.Config)),l(1,(0,d.inject)(h.networkTypes.NetworkClient))],c);0&&(module.exports={HttpOwnerInfoDataSource});
2
2
  //# sourceMappingURL=HttpOwnerInfoDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.ts"],
4
- "sourcesContent": ["import {\n DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type SolanaSPLOwnerInfo,\n type SolanaTransactionContext,\n} from \"@/modules/solana/model/SolanaTransactionContext\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n HttpOwnerInfoDataSourceResult,\n OwnerInfoDataSource,\n} from \"./OwnerInfoDataSource\";\n\n@injectable()\nexport class HttpOwnerInfoDataSource implements OwnerInfoDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {\n if (!this.config.originToken) {\n throw new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: origin token is required\",\n );\n }\n }\n\n private isSolanaSPLOwnerInfo(data: {\n tokenAccount?: unknown;\n owner?: unknown;\n contract?: unknown;\n signedDescriptor?: unknown;\n }): data is SolanaSPLOwnerInfo {\n if (typeof data !== \"object\" || data === null) return false;\n return (\n typeof data.tokenAccount === \"string\" &&\n typeof data.owner === \"string\" &&\n typeof data.contract === \"string\" &&\n typeof data.signedDescriptor === \"string\"\n );\n }\n\n async fetchAddressMetadata(\n tokenAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/owner/${tokenAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n );\n }\n }\n\n async computeAddressMetadata(\n address: string,\n mintAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${address}/${mintAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata\",\n ),\n );\n }\n }\n\n async getOwnerInfo(\n context: SolanaTransactionContext,\n ): Promise<Either<Error, HttpOwnerInfoDataSourceResult>> {\n const { tokenAddress, challenge, createATA } = context;\n\n if (!challenge) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n );\n }\n\n let ownerInfoResult: Either<Error, SolanaSPLOwnerInfo>;\n\n if (tokenAddress) {\n ownerInfoResult = await this.fetchAddressMetadata(\n tokenAddress,\n challenge,\n );\n } else if (createATA?.address && createATA?.mintAddress) {\n ownerInfoResult = await this.computeAddressMetadata(\n createATA.address,\n createATA.mintAddress,\n challenge,\n );\n } else {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n );\n }\n\n return ownerInfoResult.chain((ownerInfo) => {\n const tlvDescriptor = hexaStringToBuffer(ownerInfo.signedDescriptor);\n if (!tlvDescriptor) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n );\n }\n return Right({\n tlvDescriptor,\n });\n });\n }\n}\n"],
5
- "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAM5BC,EAA6B,4CAQtB,IAAMC,EAAN,KAA6D,CAClE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,EAEjB,GAAI,CAAC,KAAK,OAAO,YACf,MAAM,IAAI,MACR,qEACF,CAEJ,CAEQ,qBAAqBC,EAKE,CAC7B,OAAI,OAAOA,GAAS,UAAYA,IAAS,KAAa,GAEpD,OAAOA,EAAK,cAAiB,UAC7B,OAAOA,EAAK,OAAU,UACtB,OAAOA,EAAK,UAAa,UACzB,OAAOA,EAAK,kBAAqB,QAErC,CAEA,MAAM,qBACJC,EACAC,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBC,CAAY,GACxE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,KAM5B,SAAMA,CAAI,KALR,QACL,IAAI,MACF,wFACF,CACF,CAEJ,MAAQ,CACN,SAAO,QACL,IAAI,MACF,6EACF,CACF,CACF,CACF,CAEA,MAAM,uBACJG,EACAC,EACAF,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,qCAAqCG,CAAO,IAAIC,CAAW,GACnG,CAAE,OAAQ,CAAE,UAAAF,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,KAM5B,SAAMA,CAAI,KALR,QACL,IAAI,MACF,0FACF,CACF,CAEJ,MAAQ,CACN,SAAO,QACL,IAAI,MACF,+EACF,CACF,CACF,CACF,CAEA,MAAM,aACJK,EACuD,CACvD,KAAM,CAAE,aAAAJ,EAAc,UAAAC,EAAW,UAAAI,CAAU,EAAID,EAE/C,GAAI,CAACH,EACH,SAAO,QACL,IAAI,MACF,kEACF,CACF,EAGF,IAAIK,EAEJ,GAAIN,EACFM,EAAkB,MAAM,KAAK,qBAC3BN,EACAC,CACF,UACSI,GAAW,SAAWA,GAAW,YAC1CC,EAAkB,MAAM,KAAK,uBAC3BD,EAAU,QACVA,EAAU,YACVJ,CACF,MAEA,UAAO,QACL,IAAI,MACF,oGACF,CACF,EAGF,OAAOK,EAAgB,MAAOC,GAAc,CAC1C,MAAMC,KAAgB,sBAAmBD,EAAU,gBAAgB,EACnE,OAAKC,KAOE,SAAM,CACX,cAAAA,CACF,CAAC,KARQ,QACL,IAAI,MACF,kFACF,CACF,CAKJ,CAAC,CACH,CACF,EAhIaZ,EAANa,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBd",
4
+ "sourcesContent": ["import {\n DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type SolanaSPLOwnerInfo,\n type SolanaTransactionContext,\n} from \"@/modules/solana/model/SolanaTransactionContext\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n HttpOwnerInfoDataSourceResult,\n OwnerInfoDataSource,\n} from \"./OwnerInfoDataSource\";\n\n@injectable()\nexport class HttpOwnerInfoDataSource implements OwnerInfoDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n private isSolanaSPLOwnerInfo(data: {\n tokenAccount?: unknown;\n owner?: unknown;\n contract?: unknown;\n signedDescriptor?: unknown;\n }): data is SolanaSPLOwnerInfo {\n if (typeof data !== \"object\" || data === null) return false;\n return (\n typeof data.tokenAccount === \"string\" &&\n typeof data.owner === \"string\" &&\n typeof data.contract === \"string\" &&\n typeof data.signedDescriptor === \"string\"\n );\n }\n\n async fetchAddressMetadata(\n tokenAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/owner/${tokenAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n );\n }\n }\n\n async computeAddressMetadata(\n address: string,\n mintAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${address}/${mintAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata\",\n ),\n );\n }\n }\n\n async getOwnerInfo(\n context: SolanaTransactionContext,\n ): Promise<Either<Error, HttpOwnerInfoDataSourceResult>> {\n const { tokenAddress, challenge, createATA } = context;\n\n if (!challenge) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n );\n }\n\n let ownerInfoResult: Either<Error, SolanaSPLOwnerInfo>;\n\n if (tokenAddress) {\n ownerInfoResult = await this.fetchAddressMetadata(\n tokenAddress,\n challenge,\n );\n } else if (createATA?.address && createATA?.mintAddress) {\n ownerInfoResult = await this.computeAddressMetadata(\n createATA.address,\n createATA.mintAddress,\n challenge,\n );\n } else {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n );\n }\n\n return ownerInfoResult.chain((ownerInfo) => {\n const tlvDescriptor = hexaStringToBuffer(ownerInfo.signedDescriptor);\n if (!tlvDescriptor) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n );\n }\n return Right({\n tlvDescriptor,\n });\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,6BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAGO,2CACPC,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAM5BC,EAA6B,4CAQtB,IAAMC,EAAN,KAA6D,CAClE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEK,qBAAqBC,EAKE,CAC7B,OAAI,OAAOA,GAAS,UAAYA,IAAS,KAAa,GAEpD,OAAOA,EAAK,cAAiB,UAC7B,OAAOA,EAAK,OAAU,UACtB,OAAOA,EAAK,UAAa,UACzB,OAAOA,EAAK,kBAAqB,QAErC,CAEA,MAAM,qBACJC,EACAC,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBC,CAAY,GACxE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,KAM5B,SAAMA,CAAI,KALR,QACL,IAAI,MACF,wFACF,CACF,CAEJ,MAAQ,CACN,SAAO,QACL,IAAI,MACF,6EACF,CACF,CACF,CACF,CAEA,MAAM,uBACJG,EACAC,EACAF,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,qCAAqCG,CAAO,IAAIC,CAAW,GACnG,CAAE,OAAQ,CAAE,UAAAF,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,KAM5B,SAAMA,CAAI,KALR,QACL,IAAI,MACF,0FACF,CACF,CAEJ,MAAQ,CACN,SAAO,QACL,IAAI,MACF,+EACF,CACF,CACF,CACF,CAEA,MAAM,aACJK,EACuD,CACvD,KAAM,CAAE,aAAAJ,EAAc,UAAAC,EAAW,UAAAI,CAAU,EAAID,EAE/C,GAAI,CAACH,EACH,SAAO,QACL,IAAI,MACF,kEACF,CACF,EAGF,IAAIK,EAEJ,GAAIN,EACFM,EAAkB,MAAM,KAAK,qBAC3BN,EACAC,CACF,UACSI,GAAW,SAAWA,GAAW,YAC1CC,EAAkB,MAAM,KAAK,uBAC3BD,EAAU,QACVA,EAAU,YACVJ,CACF,MAEA,UAAO,QACL,IAAI,MACF,oGACF,CACF,EAGF,OAAOK,EAAgB,MAAOC,GAAc,CAC1C,MAAMC,KAAgB,sBAAmBD,EAAU,gBAAgB,EACnE,OAAKC,KAOE,SAAM,CACX,cAAAA,CACF,CAAC,KARQ,QACL,IAAI,MACF,kFACF,CACF,CAKJ,CAAC,CACH,CACF,EA1HaZ,EAANa,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBd",
6
6
  "names": ["HttpOwnerInfoDataSource_exports", "__export", "HttpOwnerInfoDataSource", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "HttpOwnerInfoDataSource", "config", "http", "data", "tokenAddress", "challenge", "address", "mintAddress", "context", "createATA", "ownerInfoResult", "ownerInfo", "tlvDescriptor", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var a=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),r=require("../../../../modules/solana/owner-info/data/HttpOwnerInfoDataSource");function l(o){const c=new TextEncoder().encode(o);return Array.from(c).map(e=>e.toString(16).padStart(2,"0")).join("")}describe("HttpOwnerInfoDataSource",()=>{const o={metadataServiceDomain:{url:"https://some.doma.in"},originToken:"mock-origin-token"},i=l("mock-descriptor"),c={tokenAccount:"token-account",owner:"owner-address",contract:"contract-address",signedDescriptor:i};let e;beforeEach(()=>{vi.resetAllMocks(),e={get:vi.fn()}}),it("should fetch address metadata via tokenAddress",async()=>{const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0};e.get.mockResolvedValueOnce(c);const t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/owner/some-token`,{params:{challenge:"random"}}),expect(t.isRight()).toBe(!0),expect(t.extract()).toEqual({tlvDescriptor:(0,a.hexaStringToBuffer)(i)})}),it("should return an error if both tokenAddress and createATA are missing or invalid",async()=>{const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:void 0,challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided")))}),it("should return an error if challenge is missing",async()=>{const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:void 0,createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required")))}),it("should return an error if the descriptor is not valid base64",async()=>{e.get.mockResolvedValueOnce({...c,signedDescriptor:"!!!not-valid-base64!!!"});const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received")))}),it("should return an error if the metadata request fails",async()=>{e.get.mockRejectedValueOnce(new Error("Network error"));const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata")))}),it("should return an error if fetch request return wrong shape for fetchAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape")))}),it("should return an error if fetch request return wrong shape for computeAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:void 0,challenge:"random",createATA:{address:"some-address",mintAddress:"some-mint"}},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,{params:{challenge:"random"}}),expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape")))}),it("should throw if originToken is missing",()=>{expect(()=>{new r.HttpOwnerInfoDataSource({...o,originToken:void 0},e)}).toThrow("[ContextModule] - HttpOwnerInfoDataSource: origin token is required")})});
1
+ "use strict";var a=require("@ledgerhq/device-management-kit"),s=require("purify-ts"),r=require("../../../../modules/solana/owner-info/data/HttpOwnerInfoDataSource");function l(o){const c=new TextEncoder().encode(o);return Array.from(c).map(e=>e.toString(16).padStart(2,"0")).join("")}describe("HttpOwnerInfoDataSource",()=>{const o={metadataServiceDomain:{url:"https://some.doma.in"},originToken:"mock-origin-token"},i=l("mock-descriptor"),c={tokenAccount:"token-account",owner:"owner-address",contract:"contract-address",signedDescriptor:i};let e;beforeEach(()=>{vi.resetAllMocks(),e={get:vi.fn()}}),it("should fetch address metadata via tokenAddress",async()=>{const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0};e.get.mockResolvedValueOnce(c);const t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/owner/some-token`,{params:{challenge:"random"}}),expect(t.isRight()).toBe(!0),expect(t.extract()).toEqual({tlvDescriptor:(0,a.hexaStringToBuffer)(i)})}),it("should return an error if both tokenAddress and createATA are missing or invalid",async()=>{const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:void 0,challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided")))}),it("should return an error if challenge is missing",async()=>{const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:void 0,createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required")))}),it("should return an error if the descriptor is not valid base64",async()=>{e.get.mockResolvedValueOnce({...c,signedDescriptor:"!!!not-valid-base64!!!"});const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received")))}),it("should return an error if the metadata request fails",async()=>{e.get.mockRejectedValueOnce(new Error("Network error"));const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata")))}),it("should return an error if fetch request return wrong shape for fetchAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape")))}),it("should return an error if fetch request return wrong shape for computeAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:a.DeviceModelId.FLEX,tokenAddress:void 0,challenge:"random",createATA:{address:"some-address",mintAddress:"some-mint"}},t=await new r.HttpOwnerInfoDataSource(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,{params:{challenge:"random"}}),expect(t).toEqual((0,s.Left)(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape")))})});
2
2
  //# sourceMappingURL=HttpOwnerInfoDataSource.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeviceModelId,\n type DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left } from \"purify-ts\";\n\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { HttpOwnerInfoDataSource } from \"@/modules/solana/owner-info/data/HttpOwnerInfoDataSource\";\nimport type { SolanaTransactionContext } from \"@/modules/solana/owner-info/domain/solanaContextTypes\";\n\nfunction stringToHex(str: string): string {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(str); // Uint8Array\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\ndescribe(\"HttpOwnerInfoDataSource\", () => {\n const config = {\n metadataServiceDomain: { url: \"https://some.doma.in\" },\n originToken: \"mock-origin-token\",\n } as ContextModuleServiceConfig;\n\n const signedDescriptorHex = stringToHex(\"mock-descriptor\");\n const responseData = {\n tokenAccount: \"token-account\",\n owner: \"owner-address\",\n contract: \"contract-address\",\n signedDescriptor: signedDescriptorHex,\n };\n\n let httpMock: { get: ReturnType<typeof vi.fn> };\n\n beforeEach(() => {\n vi.resetAllMocks();\n httpMock = { get: vi.fn() };\n });\n\n it(\"should fetch address metadata via tokenAddress\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n httpMock.get.mockResolvedValueOnce(responseData);\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/owner/some-token`,\n { params: { challenge: \"random\" } },\n );\n expect(result.isRight()).toBe(true);\n expect(result.extract()).toEqual({\n tlvDescriptor: hexaStringToBuffer(signedDescriptorHex),\n });\n });\n\n it(\"should return an error if both tokenAddress and createATA are missing or invalid\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n ),\n );\n });\n\n it(\"should return an error if challenge is missing\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: undefined,\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the descriptor is not valid base64\", async () => {\n httpMock.get.mockResolvedValueOnce({\n ...responseData,\n signedDescriptor: \"!!!not-valid-base64!!!\",\n });\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the metadata request fails\", async () => {\n httpMock.get.mockRejectedValueOnce(new Error(\"Network error\"));\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for fetchAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for computeAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: {\n address: \"some-address\",\n mintAddress: \"some-mint\",\n },\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,\n { params: { challenge: \"random\" } },\n );\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n ),\n );\n });\n\n it(\"should throw if originToken is missing\", () => {\n expect(() => {\n new HttpOwnerInfoDataSource(\n {\n ...config,\n originToken: undefined,\n } as any,\n httpMock as unknown as DmkNetworkClient,\n );\n }).toThrow(\n \"[ContextModule] - HttpOwnerInfoDataSource: origin token is required\",\n );\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeviceModelId,\n type DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left } from \"purify-ts\";\n\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { HttpOwnerInfoDataSource } from \"@/modules/solana/owner-info/data/HttpOwnerInfoDataSource\";\nimport type { SolanaTransactionContext } from \"@/modules/solana/owner-info/domain/solanaContextTypes\";\n\nfunction stringToHex(str: string): string {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(str); // Uint8Array\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\ndescribe(\"HttpOwnerInfoDataSource\", () => {\n const config = {\n metadataServiceDomain: { url: \"https://some.doma.in\" },\n originToken: \"mock-origin-token\",\n } as ContextModuleServiceConfig;\n\n const signedDescriptorHex = stringToHex(\"mock-descriptor\");\n const responseData = {\n tokenAccount: \"token-account\",\n owner: \"owner-address\",\n contract: \"contract-address\",\n signedDescriptor: signedDescriptorHex,\n };\n\n let httpMock: { get: ReturnType<typeof vi.fn> };\n\n beforeEach(() => {\n vi.resetAllMocks();\n httpMock = { get: vi.fn() };\n });\n\n it(\"should fetch address metadata via tokenAddress\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n httpMock.get.mockResolvedValueOnce(responseData);\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/owner/some-token`,\n { params: { challenge: \"random\" } },\n );\n expect(result.isRight()).toBe(true);\n expect(result.extract()).toEqual({\n tlvDescriptor: hexaStringToBuffer(signedDescriptorHex),\n });\n });\n\n it(\"should return an error if both tokenAddress and createATA are missing or invalid\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n ),\n );\n });\n\n it(\"should return an error if challenge is missing\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: undefined,\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the descriptor is not valid base64\", async () => {\n httpMock.get.mockResolvedValueOnce({\n ...responseData,\n signedDescriptor: \"!!!not-valid-base64!!!\",\n });\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the metadata request fails\", async () => {\n httpMock.get.mockRejectedValueOnce(new Error(\"Network error\"));\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for fetchAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for computeAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: {\n address: \"some-address\",\n mintAddress: \"some-mint\",\n },\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,\n { params: { challenge: \"random\" } },\n );\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "aACA,IAAAA,EAIO,2CACPC,EAAqB,qBAGrBC,EAAwC,oEAGxC,SAASC,EAAYC,EAAqB,CAExC,MAAMC,EADU,IAAI,YAAY,EACV,OAAOD,CAAG,EAChC,OAAO,MAAM,KAAKC,CAAK,EACpB,IAAKC,GAASA,EAAK,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAChD,KAAK,EAAE,CACZ,CAEA,SAAS,0BAA2B,IAAM,CACxC,MAAMC,EAAS,CACb,sBAAuB,CAAE,IAAK,sBAAuB,EACrD,YAAa,mBACf,EAEMC,EAAsBL,EAAY,iBAAiB,EACnDM,EAAe,CACnB,aAAc,gBACd,MAAO,gBACP,SAAU,mBACV,iBAAkBD,CACpB,EAEA,IAAIE,EAEJ,WAAW,IAAM,CACf,GAAG,cAAc,EACjBA,EAAW,CAAE,IAAK,GAAG,GAAG,CAAE,CAC5B,CAAC,EAED,GAAG,iDAAkD,SAAY,CAC/D,MAAMC,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,aACd,UAAW,SACX,UAAW,MACb,EACAD,EAAS,IAAI,sBAAsBD,CAAY,EAM/C,MAAMG,EAAS,MAJI,IAAI,0BACrBL,EACAG,CACF,EACgC,aAAaC,CAAO,EAEpD,OAAOD,EAAS,GAAG,EAAE,qBACnB,GAAGH,EAAO,sBAAsB,GAAG,8BACnC,CAAE,OAAQ,CAAE,UAAW,QAAS,CAAE,CACpC,EACA,OAAOK,EAAO,QAAQ,CAAC,EAAE,KAAK,EAAI,EAClC,OAAOA,EAAO,QAAQ,CAAC,EAAE,QAAQ,CAC/B,iBAAe,sBAAmBJ,CAAmB,CACvD,CAAC,CACH,CAAC,EAED,GAAG,mFAAoF,SAAY,CACjG,MAAMG,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,OACd,UAAW,SACX,UAAW,MACb,EAMMC,EAAS,MAJI,IAAI,0BACrBL,EACAG,CACF,EACgC,aAAaC,CAAO,EAEpD,OAAOC,CAAM,EAAE,WACb,QACE,IAAI,MACF,oGACF,CACF,CACF,CACF,CAAC,EAED,GAAG,iDAAkD,SAAY,CAC/D,MAAMD,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,aACd,UAAW,OACX,UAAW,MACb,EAMMC,EAAS,MAJI,IAAI,0BACrBL,EACAG,CACF,EACgC,aAAaC,CAAO,EAEpD,OAAOC,CAAM,EAAE,WACb,QACE,IAAI,MACF,kEACF,CACF,CACF,CACF,CAAC,EAED,GAAG,+DAAgE,SAAY,CAC7EF,EAAS,IAAI,sBAAsB,CACjC,GAAGD,EACH,iBAAkB,wBACpB,CAAC,EACD,MAAME,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,aACd,UAAW,SACX,UAAW,MACb,EAMMC,EAAS,MAJI,IAAI,0BACrBL,EACAG,CACF,EACgC,aAAaC,CAAO,EAEpD,OAAOC,CAAM,EAAE,WACb,QACE,IAAI,MACF,kFACF,CACF,CACF,CACF,CAAC,EAED,GAAG,uDAAwD,SAAY,CACrEF,EAAS,IAAI,sBAAsB,IAAI,MAAM,eAAe,CAAC,EAC7D,MAAMC,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,aACd,UAAW,SACX,UAAW,MACb,EAMMC,EAAS,MAJI,IAAI,0BACrBL,EACAG,CACF,EACgC,aAAaC,CAAO,EAEpD,OAAOC,CAAM,EAAE,WACb,QACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,EAED,GAAG,sFAAuF,SAAY,CACpGF,EAAS,IAAI,sBAAsB,CAAE,MAAO,OAAQ,CAAC,EAErD,MAAMC,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,aACd,UAAW,SACX,UAAW,MACb,EAMMC,EAAS,MAJI,IAAI,0BACrBL,EACAG,CACF,EACgC,aAAaC,CAAO,EAEpD,OAAOC,CAAM,EAAE,WACb,QACE,IAAI,MACF,wFACF,CACF,CACF,CACF,CAAC,EAED,GAAG,wFAAyF,SAAY,CACtGF,EAAS,IAAI,sBAAsB,CAAE,MAAO,OAAQ,CAAC,EAErD,MAAMC,EAAoC,CACxC,cAAe,gBAAc,KAC7B,aAAc,OACd,UAAW,SACX,UAAW,CACT,QAAS,eACT,YAAa,WACf,CACF,EAMMC,EAAS,MAJI,IAAI,0BACrBL,EACAG,CACF,EACgC,aAAaC,CAAO,EAEpD,OAAOD,EAAS,GAAG,EAAE,qBACnB,GAAGH,EAAO,sBAAsB,GAAG,2DACnC,CAAE,OAAQ,CAAE,UAAW,QAAS,CAAE,CACpC,EACA,OAAOK,CAAM,EAAE,WACb,QACE,IAAI,MACF,0FACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_HttpOwnerInfoDataSource", "stringToHex", "str", "bytes", "byte", "config", "signedDescriptorHex", "responseData", "httpMock", "context", "result"]
7
7
  }
@@ -58,5 +58,5 @@
58
58
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
59
59
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
60
60
  },
61
- "version": "0.0.0-develop-20260721105622"
61
+ "version": "0.0.0-develop-20260726002715"
62
62
  }
@@ -1,2 +1,2 @@
1
- var w=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var u=(i,e,n,t)=>{for(var r=t>1?void 0:t?m(e,n):e,o=i.length-1,s;o>=0;o--)(s=i[o])&&(r=(t?s(e,n,r):s(r))||r);return t&&r&&w(e,n,r),r},d=(i,e)=>(n,t)=>e(n,t,i);import{hexaStringToBuffer as S}from"@ledgerhq/device-management-kit";import{inject as p,injectable as h}from"inversify";import{Left as a,Right as f}from"purify-ts";import{configTypes as g}from"../../../../config/di/configTypes";import{networkTypes as I}from"../../../../shared/network/di/networkTypes";let c=class{constructor(e,n){this.config=e;this.http=n;if(!this.config.originToken)throw new Error("[ContextModule] - HttpOwnerInfoDataSource: origin token is required")}isSolanaSPLOwnerInfo(e){return typeof e!="object"||e===null?!1:typeof e.tokenAccount=="string"&&typeof e.owner=="string"&&typeof e.contract=="string"&&typeof e.signedDescriptor=="string"}async fetchAddressMetadata(e,n){try{const t=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/owner/${e}`,{params:{challenge:n}});return this.isSolanaSPLOwnerInfo(t)?f(t):a(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape"))}catch{return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata"))}}async computeAddressMetadata(e,n,t){try{const r=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${e}/${n}`,{params:{challenge:t}});return this.isSolanaSPLOwnerInfo(r)?f(r):a(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape"))}catch{return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata"))}}async getOwnerInfo(e){const{tokenAddress:n,challenge:t,createATA:r}=e;if(!t)return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required"));let o;if(n)o=await this.fetchAddressMetadata(n,t);else if(r?.address&&r?.mintAddress)o=await this.computeAddressMetadata(r.address,r.mintAddress,t);else return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided"));return o.chain(s=>{const l=S(s.signedDescriptor);return l?f({tlvDescriptor:l}):a(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received"))})}};c=u([h(),d(0,p(g.Config)),d(1,p(I.NetworkClient))],c);export{c as HttpOwnerInfoDataSource};
1
+ var w=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var u=(i,e,n,t)=>{for(var r=t>1?void 0:t?m(e,n):e,o=i.length-1,s;o>=0;o--)(s=i[o])&&(r=(t?s(e,n,r):s(r))||r);return t&&r&&w(e,n,r),r},d=(i,e)=>(n,t)=>e(n,t,i);import{hexaStringToBuffer as S}from"@ledgerhq/device-management-kit";import{inject as p,injectable as h}from"inversify";import{Left as a,Right as f}from"purify-ts";import{configTypes as g}from"../../../../config/di/configTypes";import{networkTypes as I}from"../../../../shared/network/di/networkTypes";let c=class{constructor(e,n){this.config=e;this.http=n}isSolanaSPLOwnerInfo(e){return typeof e!="object"||e===null?!1:typeof e.tokenAccount=="string"&&typeof e.owner=="string"&&typeof e.contract=="string"&&typeof e.signedDescriptor=="string"}async fetchAddressMetadata(e,n){try{const t=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/owner/${e}`,{params:{challenge:n}});return this.isSolanaSPLOwnerInfo(t)?f(t):a(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape"))}catch{return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata"))}}async computeAddressMetadata(e,n,t){try{const r=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${e}/${n}`,{params:{challenge:t}});return this.isSolanaSPLOwnerInfo(r)?f(r):a(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape"))}catch{return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata"))}}async getOwnerInfo(e){const{tokenAddress:n,challenge:t,createATA:r}=e;if(!t)return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required"));let o;if(n)o=await this.fetchAddressMetadata(n,t);else if(r?.address&&r?.mintAddress)o=await this.computeAddressMetadata(r.address,r.mintAddress,t);else return a(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided"));return o.chain(s=>{const l=S(s.signedDescriptor);return l?f({tlvDescriptor:l}):a(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received"))})}};c=u([h(),d(0,p(g.Config)),d(1,p(I.NetworkClient))],c);export{c as HttpOwnerInfoDataSource};
2
2
  //# sourceMappingURL=HttpOwnerInfoDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.ts"],
4
- "sourcesContent": ["import {\n DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type SolanaSPLOwnerInfo,\n type SolanaTransactionContext,\n} from \"@/modules/solana/model/SolanaTransactionContext\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n HttpOwnerInfoDataSourceResult,\n OwnerInfoDataSource,\n} from \"./OwnerInfoDataSource\";\n\n@injectable()\nexport class HttpOwnerInfoDataSource implements OwnerInfoDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {\n if (!this.config.originToken) {\n throw new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: origin token is required\",\n );\n }\n }\n\n private isSolanaSPLOwnerInfo(data: {\n tokenAccount?: unknown;\n owner?: unknown;\n contract?: unknown;\n signedDescriptor?: unknown;\n }): data is SolanaSPLOwnerInfo {\n if (typeof data !== \"object\" || data === null) return false;\n return (\n typeof data.tokenAccount === \"string\" &&\n typeof data.owner === \"string\" &&\n typeof data.contract === \"string\" &&\n typeof data.signedDescriptor === \"string\"\n );\n }\n\n async fetchAddressMetadata(\n tokenAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/owner/${tokenAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n );\n }\n }\n\n async computeAddressMetadata(\n address: string,\n mintAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${address}/${mintAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata\",\n ),\n );\n }\n }\n\n async getOwnerInfo(\n context: SolanaTransactionContext,\n ): Promise<Either<Error, HttpOwnerInfoDataSourceResult>> {\n const { tokenAddress, challenge, createATA } = context;\n\n if (!challenge) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n );\n }\n\n let ownerInfoResult: Either<Error, SolanaSPLOwnerInfo>;\n\n if (tokenAddress) {\n ownerInfoResult = await this.fetchAddressMetadata(\n tokenAddress,\n challenge,\n );\n } else if (createATA?.address && createATA?.mintAddress) {\n ownerInfoResult = await this.computeAddressMetadata(\n createATA.address,\n createATA.mintAddress,\n challenge,\n );\n } else {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n );\n }\n\n return ownerInfoResult.chain((ownerInfo) => {\n const tlvDescriptor = hexaStringToBuffer(ownerInfo.signedDescriptor);\n if (!tlvDescriptor) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n );\n }\n return Right({\n tlvDescriptor,\n });\n });\n }\n}\n"],
5
- "mappings": "iOAAA,OAEE,sBAAAA,MACK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAM5B,OAAS,gBAAAC,MAAoB,mCAQtB,IAAMC,EAAN,KAA6D,CAClE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,EAEjB,GAAI,CAAC,KAAK,OAAO,YACf,MAAM,IAAI,MACR,qEACF,CAEJ,CAEQ,qBAAqBC,EAKE,CAC7B,OAAI,OAAOA,GAAS,UAAYA,IAAS,KAAa,GAEpD,OAAOA,EAAK,cAAiB,UAC7B,OAAOA,EAAK,OAAU,UACtB,OAAOA,EAAK,UAAa,UACzB,OAAOA,EAAK,kBAAqB,QAErC,CAEA,MAAM,qBACJC,EACAC,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBC,CAAY,GACxE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,EAM5BG,EAAMH,CAAI,EALRI,EACL,IAAI,MACF,wFACF,CACF,CAEJ,MAAQ,CACN,OAAOA,EACL,IAAI,MACF,6EACF,CACF,CACF,CACF,CAEA,MAAM,uBACJC,EACAC,EACAJ,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,qCAAqCK,CAAO,IAAIC,CAAW,GACnG,CAAE,OAAQ,CAAE,UAAAJ,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,EAM5BG,EAAMH,CAAI,EALRI,EACL,IAAI,MACF,0FACF,CACF,CAEJ,MAAQ,CACN,OAAOA,EACL,IAAI,MACF,+EACF,CACF,CACF,CACF,CAEA,MAAM,aACJG,EACuD,CACvD,KAAM,CAAE,aAAAN,EAAc,UAAAC,EAAW,UAAAM,CAAU,EAAID,EAE/C,GAAI,CAACL,EACH,OAAOE,EACL,IAAI,MACF,kEACF,CACF,EAGF,IAAIK,EAEJ,GAAIR,EACFQ,EAAkB,MAAM,KAAK,qBAC3BR,EACAC,CACF,UACSM,GAAW,SAAWA,GAAW,YAC1CC,EAAkB,MAAM,KAAK,uBAC3BD,EAAU,QACVA,EAAU,YACVN,CACF,MAEA,QAAOE,EACL,IAAI,MACF,oGACF,CACF,EAGF,OAAOK,EAAgB,MAAOC,GAAc,CAC1C,MAAMC,EAAgBC,EAAmBF,EAAU,gBAAgB,EACnE,OAAKC,EAOER,EAAM,CACX,cAAAQ,CACF,CAAC,EARQP,EACL,IAAI,MACF,kFACF,CACF,CAKJ,CAAC,CACH,CACF,EAhIaP,EAANgB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IAJzBrB",
4
+ "sourcesContent": ["import {\n DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type SolanaSPLOwnerInfo,\n type SolanaTransactionContext,\n} from \"@/modules/solana/model/SolanaTransactionContext\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n HttpOwnerInfoDataSourceResult,\n OwnerInfoDataSource,\n} from \"./OwnerInfoDataSource\";\n\n@injectable()\nexport class HttpOwnerInfoDataSource implements OwnerInfoDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n private isSolanaSPLOwnerInfo(data: {\n tokenAccount?: unknown;\n owner?: unknown;\n contract?: unknown;\n signedDescriptor?: unknown;\n }): data is SolanaSPLOwnerInfo {\n if (typeof data !== \"object\" || data === null) return false;\n return (\n typeof data.tokenAccount === \"string\" &&\n typeof data.owner === \"string\" &&\n typeof data.contract === \"string\" &&\n typeof data.signedDescriptor === \"string\"\n );\n }\n\n async fetchAddressMetadata(\n tokenAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/owner/${tokenAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n );\n }\n }\n\n async computeAddressMetadata(\n address: string,\n mintAddress: string,\n challenge: string,\n ): Promise<Either<Error, SolanaSPLOwnerInfo>> {\n try {\n const data = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/computed-token-account/${address}/${mintAddress}`,\n { params: { challenge } },\n )) as SolanaSPLOwnerInfo;\n if (!this.isSolanaSPLOwnerInfo(data))\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n );\n return Right(data);\n } catch {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to compute address metadata\",\n ),\n );\n }\n }\n\n async getOwnerInfo(\n context: SolanaTransactionContext,\n ): Promise<Either<Error, HttpOwnerInfoDataSourceResult>> {\n const { tokenAddress, challenge, createATA } = context;\n\n if (!challenge) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n );\n }\n\n let ownerInfoResult: Either<Error, SolanaSPLOwnerInfo>;\n\n if (tokenAddress) {\n ownerInfoResult = await this.fetchAddressMetadata(\n tokenAddress,\n challenge,\n );\n } else if (createATA?.address && createATA?.mintAddress) {\n ownerInfoResult = await this.computeAddressMetadata(\n createATA.address,\n createATA.mintAddress,\n challenge,\n );\n } else {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n );\n }\n\n return ownerInfoResult.chain((ownerInfo) => {\n const tlvDescriptor = hexaStringToBuffer(ownerInfo.signedDescriptor);\n if (!tlvDescriptor) {\n return Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n );\n }\n return Right({\n tlvDescriptor,\n });\n });\n }\n}\n"],
5
+ "mappings": "iOAAA,OAEE,sBAAAA,MACK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAM5B,OAAS,gBAAAC,MAAoB,mCAQtB,IAAMC,EAAN,KAA6D,CAClE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEK,qBAAqBC,EAKE,CAC7B,OAAI,OAAOA,GAAS,UAAYA,IAAS,KAAa,GAEpD,OAAOA,EAAK,cAAiB,UAC7B,OAAOA,EAAK,OAAU,UACtB,OAAOA,EAAK,UAAa,UACzB,OAAOA,EAAK,kBAAqB,QAErC,CAEA,MAAM,qBACJC,EACAC,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBC,CAAY,GACxE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,EAM5BG,EAAMH,CAAI,EALRI,EACL,IAAI,MACF,wFACF,CACF,CAEJ,MAAQ,CACN,OAAOA,EACL,IAAI,MACF,6EACF,CACF,CACF,CACF,CAEA,MAAM,uBACJC,EACAC,EACAJ,EAC4C,CAC5C,GAAI,CACF,MAAMF,EAAQ,MAAM,KAAK,KAAK,IAC5B,GAAG,KAAK,OAAO,sBAAsB,GAAG,qCAAqCK,CAAO,IAAIC,CAAW,GACnG,CAAE,OAAQ,CAAE,UAAAJ,CAAU,CAAE,CAC1B,EACA,OAAK,KAAK,qBAAqBF,CAAI,EAM5BG,EAAMH,CAAI,EALRI,EACL,IAAI,MACF,0FACF,CACF,CAEJ,MAAQ,CACN,OAAOA,EACL,IAAI,MACF,+EACF,CACF,CACF,CACF,CAEA,MAAM,aACJG,EACuD,CACvD,KAAM,CAAE,aAAAN,EAAc,UAAAC,EAAW,UAAAM,CAAU,EAAID,EAE/C,GAAI,CAACL,EACH,OAAOE,EACL,IAAI,MACF,kEACF,CACF,EAGF,IAAIK,EAEJ,GAAIR,EACFQ,EAAkB,MAAM,KAAK,qBAC3BR,EACAC,CACF,UACSM,GAAW,SAAWA,GAAW,YAC1CC,EAAkB,MAAM,KAAK,uBAC3BD,EAAU,QACVA,EAAU,YACVN,CACF,MAEA,QAAOE,EACL,IAAI,MACF,oGACF,CACF,EAGF,OAAOK,EAAgB,MAAOC,GAAc,CAC1C,MAAMC,EAAgBC,EAAmBF,EAAU,gBAAgB,EACnE,OAAKC,EAOER,EAAM,CACX,cAAAQ,CACF,CAAC,EARQP,EACL,IAAI,MACF,kFACF,CACF,CAKJ,CAAC,CACH,CACF,EA1HaP,EAANgB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IAJzBrB",
6
6
  "names": ["hexaStringToBuffer", "inject", "injectable", "Left", "Right", "configTypes", "networkTypes", "HttpOwnerInfoDataSource", "config", "http", "data", "tokenAddress", "challenge", "Right", "Left", "address", "mintAddress", "context", "createATA", "ownerInfoResult", "ownerInfo", "tlvDescriptor", "hexaStringToBuffer", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes", "networkTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as r,hexaStringToBuffer as l}from"@ledgerhq/device-management-kit";import{Left as d}from"purify-ts";import{HttpOwnerInfoDataSource as a}from"../../../../modules/solana/owner-info/data/HttpOwnerInfoDataSource";function u(o){const c=new TextEncoder().encode(o);return Array.from(c).map(e=>e.toString(16).padStart(2,"0")).join("")}describe("HttpOwnerInfoDataSource",()=>{const o={metadataServiceDomain:{url:"https://some.doma.in"},originToken:"mock-origin-token"},i=u("mock-descriptor"),c={tokenAccount:"token-account",owner:"owner-address",contract:"contract-address",signedDescriptor:i};let e;beforeEach(()=>{vi.resetAllMocks(),e={get:vi.fn()}}),it("should fetch address metadata via tokenAddress",async()=>{const n={deviceModelId:r.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0};e.get.mockResolvedValueOnce(c);const t=await new a(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/owner/some-token`,{params:{challenge:"random"}}),expect(t.isRight()).toBe(!0),expect(t.extract()).toEqual({tlvDescriptor:l(i)})}),it("should return an error if both tokenAddress and createATA are missing or invalid",async()=>{const n={deviceModelId:r.FLEX,tokenAddress:void 0,challenge:"random",createATA:void 0},t=await new a(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided")))}),it("should return an error if challenge is missing",async()=>{const n={deviceModelId:r.FLEX,tokenAddress:"some-token",challenge:void 0,createATA:void 0},t=await new a(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required")))}),it("should return an error if the descriptor is not valid base64",async()=>{e.get.mockResolvedValueOnce({...c,signedDescriptor:"!!!not-valid-base64!!!"});const n={deviceModelId:r.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new a(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received")))}),it("should return an error if the metadata request fails",async()=>{e.get.mockRejectedValueOnce(new Error("Network error"));const n={deviceModelId:r.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new a(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata")))}),it("should return an error if fetch request return wrong shape for fetchAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:r.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new a(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape")))}),it("should return an error if fetch request return wrong shape for computeAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:r.FLEX,tokenAddress:void 0,challenge:"random",createATA:{address:"some-address",mintAddress:"some-mint"}},t=await new a(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,{params:{challenge:"random"}}),expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape")))}),it("should throw if originToken is missing",()=>{expect(()=>{new a({...o,originToken:void 0},e)}).toThrow("[ContextModule] - HttpOwnerInfoDataSource: origin token is required")})});
1
+ import{DeviceModelId as a,hexaStringToBuffer as l}from"@ledgerhq/device-management-kit";import{Left as d}from"purify-ts";import{HttpOwnerInfoDataSource as r}from"../../../../modules/solana/owner-info/data/HttpOwnerInfoDataSource";function u(o){const c=new TextEncoder().encode(o);return Array.from(c).map(e=>e.toString(16).padStart(2,"0")).join("")}describe("HttpOwnerInfoDataSource",()=>{const o={metadataServiceDomain:{url:"https://some.doma.in"},originToken:"mock-origin-token"},i=u("mock-descriptor"),c={tokenAccount:"token-account",owner:"owner-address",contract:"contract-address",signedDescriptor:i};let e;beforeEach(()=>{vi.resetAllMocks(),e={get:vi.fn()}}),it("should fetch address metadata via tokenAddress",async()=>{const n={deviceModelId:a.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0};e.get.mockResolvedValueOnce(c);const t=await new r(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/owner/some-token`,{params:{challenge:"random"}}),expect(t.isRight()).toBe(!0),expect(t.extract()).toEqual({tlvDescriptor:l(i)})}),it("should return an error if both tokenAddress and createATA are missing or invalid",async()=>{const n={deviceModelId:a.FLEX,tokenAddress:void 0,challenge:"random",createATA:void 0},t=await new r(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided")))}),it("should return an error if challenge is missing",async()=>{const n={deviceModelId:a.FLEX,tokenAddress:"some-token",challenge:void 0,createATA:void 0},t=await new r(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: challenge is required")))}),it("should return an error if the descriptor is not valid base64",async()=>{e.get.mockResolvedValueOnce({...c,signedDescriptor:"!!!not-valid-base64!!!"});const n={deviceModelId:a.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received")))}),it("should return an error if the metadata request fails",async()=>{e.get.mockRejectedValueOnce(new Error("Network error"));const n={deviceModelId:a.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata")))}),it("should return an error if fetch request return wrong shape for fetchAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:a.FLEX,tokenAddress:"some-token",challenge:"random",createATA:void 0},t=await new r(o,e).getOwnerInfo(n);expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape")))}),it("should return an error if fetch request return wrong shape for computeAddressMetadata",async()=>{e.get.mockResolvedValueOnce({wrong:"field"});const n={deviceModelId:a.FLEX,tokenAddress:void 0,challenge:"random",createATA:{address:"some-address",mintAddress:"some-mint"}},t=await new r(o,e).getOwnerInfo(n);expect(e.get).toHaveBeenCalledWith(`${o.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,{params:{challenge:"random"}}),expect(t).toEqual(d(new Error("[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape")))})});
2
2
  //# sourceMappingURL=HttpOwnerInfoDataSource.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeviceModelId,\n type DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left } from \"purify-ts\";\n\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { HttpOwnerInfoDataSource } from \"@/modules/solana/owner-info/data/HttpOwnerInfoDataSource\";\nimport type { SolanaTransactionContext } from \"@/modules/solana/owner-info/domain/solanaContextTypes\";\n\nfunction stringToHex(str: string): string {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(str); // Uint8Array\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\ndescribe(\"HttpOwnerInfoDataSource\", () => {\n const config = {\n metadataServiceDomain: { url: \"https://some.doma.in\" },\n originToken: \"mock-origin-token\",\n } as ContextModuleServiceConfig;\n\n const signedDescriptorHex = stringToHex(\"mock-descriptor\");\n const responseData = {\n tokenAccount: \"token-account\",\n owner: \"owner-address\",\n contract: \"contract-address\",\n signedDescriptor: signedDescriptorHex,\n };\n\n let httpMock: { get: ReturnType<typeof vi.fn> };\n\n beforeEach(() => {\n vi.resetAllMocks();\n httpMock = { get: vi.fn() };\n });\n\n it(\"should fetch address metadata via tokenAddress\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n httpMock.get.mockResolvedValueOnce(responseData);\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/owner/some-token`,\n { params: { challenge: \"random\" } },\n );\n expect(result.isRight()).toBe(true);\n expect(result.extract()).toEqual({\n tlvDescriptor: hexaStringToBuffer(signedDescriptorHex),\n });\n });\n\n it(\"should return an error if both tokenAddress and createATA are missing or invalid\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n ),\n );\n });\n\n it(\"should return an error if challenge is missing\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: undefined,\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the descriptor is not valid base64\", async () => {\n httpMock.get.mockResolvedValueOnce({\n ...responseData,\n signedDescriptor: \"!!!not-valid-base64!!!\",\n });\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the metadata request fails\", async () => {\n httpMock.get.mockRejectedValueOnce(new Error(\"Network error\"));\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for fetchAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for computeAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: {\n address: \"some-address\",\n mintAddress: \"some-mint\",\n },\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,\n { params: { challenge: \"random\" } },\n );\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n ),\n );\n });\n\n it(\"should throw if originToken is missing\", () => {\n expect(() => {\n new HttpOwnerInfoDataSource(\n {\n ...config,\n originToken: undefined,\n } as any,\n httpMock as unknown as DmkNetworkClient,\n );\n }).toThrow(\n \"[ContextModule] - HttpOwnerInfoDataSource: origin token is required\",\n );\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeviceModelId,\n type DmkNetworkClient,\n hexaStringToBuffer,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left } from \"purify-ts\";\n\nimport type { ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { HttpOwnerInfoDataSource } from \"@/modules/solana/owner-info/data/HttpOwnerInfoDataSource\";\nimport type { SolanaTransactionContext } from \"@/modules/solana/owner-info/domain/solanaContextTypes\";\n\nfunction stringToHex(str: string): string {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(str); // Uint8Array\n return Array.from(bytes)\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\ndescribe(\"HttpOwnerInfoDataSource\", () => {\n const config = {\n metadataServiceDomain: { url: \"https://some.doma.in\" },\n originToken: \"mock-origin-token\",\n } as ContextModuleServiceConfig;\n\n const signedDescriptorHex = stringToHex(\"mock-descriptor\");\n const responseData = {\n tokenAccount: \"token-account\",\n owner: \"owner-address\",\n contract: \"contract-address\",\n signedDescriptor: signedDescriptorHex,\n };\n\n let httpMock: { get: ReturnType<typeof vi.fn> };\n\n beforeEach(() => {\n vi.resetAllMocks();\n httpMock = { get: vi.fn() };\n });\n\n it(\"should fetch address metadata via tokenAddress\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n httpMock.get.mockResolvedValueOnce(responseData);\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/owner/some-token`,\n { params: { challenge: \"random\" } },\n );\n expect(result.isRight()).toBe(true);\n expect(result.extract()).toEqual({\n tlvDescriptor: hexaStringToBuffer(signedDescriptorHex),\n });\n });\n\n it(\"should return an error if both tokenAddress and createATA are missing or invalid\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: either tokenAddress or valid createATA must be provided\",\n ),\n ),\n );\n });\n\n it(\"should return an error if challenge is missing\", async () => {\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: undefined,\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: challenge is required\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the descriptor is not valid base64\", async () => {\n httpMock.get.mockResolvedValueOnce({\n ...responseData,\n signedDescriptor: \"!!!not-valid-base64!!!\",\n });\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid base64 tlvDescriptor received\",\n ),\n ),\n );\n });\n\n it(\"should return an error if the metadata request fails\", async () => {\n httpMock.get.mockRejectedValueOnce(new Error(\"Network error\"));\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: Failed to fetch address metadata\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for fetchAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: \"some-token\",\n challenge: \"random\",\n createATA: undefined,\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid fetchAddressMetadata response shape\",\n ),\n ),\n );\n });\n\n it(\"should return an error if fetch request return wrong shape for computeAddressMetadata\", async () => {\n httpMock.get.mockResolvedValueOnce({ wrong: \"field\" });\n\n const context: SolanaTransactionContext = {\n deviceModelId: DeviceModelId.FLEX,\n tokenAddress: undefined,\n challenge: \"random\",\n createATA: {\n address: \"some-address\",\n mintAddress: \"some-mint\",\n },\n };\n\n const dataSource = new HttpOwnerInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n const result = await dataSource.getOwnerInfo(context);\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `${config.metadataServiceDomain.url}/v2/solana/computed-token-account/some-address/some-mint`,\n { params: { challenge: \"random\" } },\n );\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] - HttpOwnerInfoDataSource: invalid computeAddressMetadata response shape\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["DeviceModelId", "hexaStringToBuffer", "Left", "HttpOwnerInfoDataSource", "stringToHex", "str", "bytes", "byte", "config", "signedDescriptorHex", "responseData", "httpMock", "context", "result"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HttpOwnerInfoDataSource.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAEjB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAe,MAAM,WAAW,CAAC;AAGhD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,iDAAiD,CAAC;AAGzD,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,qBACa,uBAAwB,YAAW,mBAAmB;IAG/D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,MAAM,EAAE,0BAA0B,EAElC,IAAI,EAAE,gBAAgB;IASzC,OAAO,CAAC,oBAAoB;IAetB,oBAAoB,CACxB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAsBvC,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAsBvC,YAAY,CAChB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;CA8CzD"}
1
+ {"version":3,"file":"HttpOwnerInfoDataSource.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAEjB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAe,MAAM,WAAW,CAAC;AAGhD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,wBAAwB,EAC9B,MAAM,iDAAiD,CAAC;AAGzD,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,qBACa,uBAAwB,YAAW,mBAAmB;IAG/D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,MAAM,EAAE,0BAA0B,EAElC,IAAI,EAAE,gBAAgB;IAGzC,OAAO,CAAC,oBAAoB;IAetB,oBAAoB,CACxB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAsBvC,sBAAsB,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAsBvC,YAAY,CAChB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC;CA8CzD"}