@trufnetwork/sdk-js 0.4.1 → 0.4.2

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.
@@ -196,6 +196,50 @@ var BaseTNClient = class {
196
196
  async getLastTransactions(input) {
197
197
  return (0, import_getLastTransactions.getLastTransactions)(this.getKwilClient(), this.getKwilSigner(), input);
198
198
  }
199
+ /**
200
+ * Lists taxonomies by height range for incremental synchronization.
201
+ * High-level wrapper for ComposedAction.listTaxonomiesByHeight()
202
+ *
203
+ * @param params Height range and pagination parameters
204
+ * @returns Promise resolving to taxonomy query results
205
+ *
206
+ * @example
207
+ * ```typescript
208
+ * const taxonomies = await client.listTaxonomiesByHeight({
209
+ * fromHeight: 1000,
210
+ * toHeight: 2000,
211
+ * limit: 100,
212
+ * latestOnly: true
213
+ * });
214
+ * ```
215
+ */
216
+ async listTaxonomiesByHeight(params = {}) {
217
+ const composedAction = this.loadComposedAction();
218
+ return composedAction.listTaxonomiesByHeight(params);
219
+ }
220
+ /**
221
+ * Gets taxonomies for specific streams in batch.
222
+ * High-level wrapper for ComposedAction.getTaxonomiesForStreams()
223
+ *
224
+ * @param params Stream locators and options
225
+ * @returns Promise resolving to taxonomy query results
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * const streams = [
230
+ * { dataProvider: provider1, streamId: streamId1 },
231
+ * { dataProvider: provider2, streamId: streamId2 }
232
+ * ];
233
+ * const taxonomies = await client.getTaxonomiesForStreams({
234
+ * streams,
235
+ * latestOnly: true
236
+ * });
237
+ * ```
238
+ */
239
+ async getTaxonomiesForStreams(params) {
240
+ const composedAction = this.loadComposedAction();
241
+ return composedAction.getTaxonomiesForStreams(params);
242
+ }
199
243
  /**
200
244
  * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.
201
245
  * @param provider - The provider URL.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/client.ts"],
4
- "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@trufnetwork/kwil-js\";\nimport { KwilConfig } from \"@trufnetwork/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@trufnetwork/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@trufnetwork/kwil-js/dist/core/signature\";\nimport { EnvironmentType } from \"@trufnetwork/kwil-js/dist/core/enums\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { TxInfoReceipt } from \"@trufnetwork/kwil-js/dist/core/txQuery\";\nimport { ComposedAction } from \"../contracts-api/composedAction\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { deleteStream } from \"../contracts-api/deleteStream\";\nimport { PrimitiveAction } from \"../contracts-api/primitiveAction\";\nimport { Action } from \"../contracts-api/action\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator, TNStream } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listStreams } from \"./listStreams\";\nimport { getLastTransactions } from \"./getLastTransactions\";\nimport { RoleManagement } from \"../contracts-api/roleManagement\";\nimport { OwnerIdentifier } from \"../types/role\";\n\nexport interface SignerInfo {\n // we need to have the address upfront to create the KwilSigner, instead of relying on the signer to return it asynchronously\n address: string;\n signer: EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport interface ListStreamsInput {\n dataProvider?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n blockHeight?: number;\n}\n\n/**\n * @param dataProvider optional address; when omitted or null, returns for all providers\n * @param limitSize max rows to return (default 6, max 100)\n */\nexport interface GetLastTransactionsInput {\n dataProvider?: string;\n limitSize?: number;\n}\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n }\n\n /**\n * Waits for a transaction to be mined by TN.\n * @param txHash - The transaction hash to wait for.\n * @param timeout - The timeout in milliseconds.\n * @returns A promise that resolves to the transaction info receipt.\n */\n async waitForTx(txHash: string, timeout = 12000): Promise<TxInfoReceipt> {\n return new Promise<TxInfoReceipt>(async (resolve, reject) => {\n const interval = setInterval(async () => {\n const receipt = await this.getKwilClient()\n [\"txInfoClient\"](txHash)\n .catch(() => ({ data: undefined, status: undefined }));\n switch (receipt.status) {\n case 200:\n if (receipt.data?.tx_result?.log !== undefined && receipt.data?.tx_result?.log.includes(\"ERROR\")) {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ))\n } else {\n resolve(receipt.data!);\n }\n break;\n case undefined:\n break;\n default:\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\n }\n }, 1000);\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(\"Transaction failed: Timeout\"));\n }, timeout);\n });\n }\n\n /**\n * Returns the Kwil signer used by the client.\n * @returns An instance of KwilSigner.\n */\n getKwilSigner(): KwilSigner {\n return new KwilSigner(\n this.signerInfo.signer,\n this.address().getAddress(),\n );\n }\n\n /**\n * Returns the Kwil client used by the client.\n * @returns An instance of Kwil.\n * @throws If the Kwil client is not initialized.\n */\n getKwilClient(): Kwil<EnvironmentType> {\n if (!this.kwilClient) {\n throw new Error(\"Kwil client not initialized\");\n }\n return this.kwilClient;\n }\n\n /**\n * Deploys a new stream.\n * @param streamId - The ID of the stream to deploy.\n * @param streamType - The type of the stream.\n * @param synchronous - Whether the deployment should be synchronous.\n * @param contractVersion\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async deployStream(\n streamId: StreamId,\n streamType: StreamType,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param stream - The StreamLocator of the stream to destroy.\n * @param synchronous - Whether the destruction should be synchronous.\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async destroyStream(\n stream: StreamLocator,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deleteStream({\n stream,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Loads an already deployed stream, permitting its API usage.\n * @returns An instance of IStream.\n */\n loadAction(): Action {\n return new Action(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads a primitive stream.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveAction(): PrimitiveAction {\n return PrimitiveAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads a composed stream.\n * @returns An instance of IComposedStream.\n */\n loadComposedAction(): ComposedAction {\n return ComposedAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads the role management contract API, permitting its RBAC usage.\n */\n loadRoleManagementAction(): RoleManagement {\n return RoleManagement.fromClient(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Creates a new stream locator.\n * @param streamId - The ID of the stream.\n * @returns A StreamLocator object.\n */\n ownStreamLocator(streamId: StreamId): StreamLocator {\n return {\n streamId,\n dataProvider: this.address(),\n };\n }\n\n /**\n * Returns the address of the signer used by the client.\n * @returns An instance of EthereumAddress.\n */\n address(): EthereumAddress {\n return new EthereumAddress(this.signerInfo.address);\n }\n\n /**\n * Returns all streams from the TN network.\n * @param input - The input parameters for listing streams.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getListStreams(input: ListStreamsInput): Promise<TNStream[]> {\n return listStreams(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Returns the last write activity across streams.\n * @param input - The input parameters for getting last transactions.\n * @returns A promise that resolves to a list of last transactions.\n */\n async getLastTransactions(input: GetLastTransactionsInput): Promise<any[]> {\n return getLastTransactions(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.\n * @param provider - The provider URL.\n * @returns A promise that resolves to the chain ID.\n */\n public static async getDefaultChainId(provider: string) {\n const kwilClient = new Client({\n kwilProvider: provider,\n });\n const chainInfo = await kwilClient[\"chainInfoClient\"]();\n return chainInfo.data?.chain_id;\n }\n\n /*\n * High-level role-management helpers. These wrap the lower-level\n * RoleManagement contract calls and expose a simpler API on the\n * TN client.\n */\n\n /** Grants a role to one or more wallets. */\n async grantRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.grantRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /** Revokes a role from one or more wallets. */\n async revokeRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.revokeRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /**\n * Checks if a wallet is member of a role.\n * Returns true if the wallet is a member.\n */\n async isMemberOf(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallet: EthereumAddress;\n }): Promise<boolean> {\n const rm = this.loadRoleManagementAction();\n const res = await rm.areMembersOf({\n owner: input.owner,\n roleName: input.roleName,\n wallets: [input.wallet],\n });\n return res.length > 0 && res[0].isMember;\n }\n\n /**\n * Lists role members \u2013 currently unsupported in the\n * smart-contract layer.\n */\n async listRoleMembers(input: {\n owner: OwnerIdentifier;\n roleName: string;\n limit?: number;\n offset?: number;\n }): Promise<import(\"../types/role\").RoleMember[]> {\n const rm = this.loadRoleManagementAction();\n return rm.listRoleMembers({\n owner: input.owner,\n roleName: input.roleName,\n limit: input.limit,\n offset: input.offset,\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil } from \"@trufnetwork/kwil-js\";\nimport { KwilConfig } from \"@trufnetwork/kwil-js/dist/api_client/config\";\nimport { Kwil } from \"@trufnetwork/kwil-js/dist/client/kwil\";\nimport { EthSigner } from \"@trufnetwork/kwil-js/dist/core/signature\";\nimport { EnvironmentType } from \"@trufnetwork/kwil-js/dist/core/enums\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { TxInfoReceipt } from \"@trufnetwork/kwil-js/dist/core/txQuery\";\nimport { ComposedAction, ListTaxonomiesByHeightParams, GetTaxonomiesForStreamsParams, TaxonomyQueryResult } from \"../contracts-api/composedAction\";\nimport { deployStream } from \"../contracts-api/deployStream\";\nimport { deleteStream } from \"../contracts-api/deleteStream\";\nimport { PrimitiveAction } from \"../contracts-api/primitiveAction\";\nimport { Action } from \"../contracts-api/action\";\nimport { StreamType } from \"../contracts-api/contractValues\";\nimport { StreamLocator, TNStream } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { listStreams } from \"./listStreams\";\nimport { getLastTransactions } from \"./getLastTransactions\";\nimport { RoleManagement } from \"../contracts-api/roleManagement\";\nimport { OwnerIdentifier } from \"../types/role\";\n\nexport interface SignerInfo {\n // we need to have the address upfront to create the KwilSigner, instead of relying on the signer to return it asynchronously\n address: string;\n signer: EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<KwilConfig, \"kwilProvider\">;\n\nexport interface ListStreamsInput {\n dataProvider?: string;\n limit?: number;\n offset?: number;\n orderBy?: string;\n blockHeight?: number;\n}\n\n/**\n * @param dataProvider optional address; when omitted or null, returns for all providers\n * @param limitSize max rows to return (default 6, max 100)\n */\nexport interface GetLastTransactionsInput {\n dataProvider?: string;\n limitSize?: number;\n}\n\nexport abstract class BaseTNClient<T extends EnvironmentType> {\n protected kwilClient: Kwil<T> | undefined;\n protected signerInfo: SignerInfo;\n\n protected constructor(options: TNClientOptions) {\n this.signerInfo = options.signerInfo;\n }\n\n /**\n * Waits for a transaction to be mined by TN.\n * @param txHash - The transaction hash to wait for.\n * @param timeout - The timeout in milliseconds.\n * @returns A promise that resolves to the transaction info receipt.\n */\n async waitForTx(txHash: string, timeout = 12000): Promise<TxInfoReceipt> {\n return new Promise<TxInfoReceipt>(async (resolve, reject) => {\n const interval = setInterval(async () => {\n const receipt = await this.getKwilClient()\n [\"txInfoClient\"](txHash)\n .catch(() => ({ data: undefined, status: undefined }));\n switch (receipt.status) {\n case 200:\n if (receipt.data?.tx_result?.log !== undefined && receipt.data?.tx_result?.log.includes(\"ERROR\")) {\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ))\n } else {\n resolve(receipt.data!);\n }\n break;\n case undefined:\n break;\n default:\n reject(\n new Error(\n `Transaction failed: status ${receipt.status} : log message ${receipt.data?.tx_result.log}`,\n ),\n );\n }\n }, 1000);\n setTimeout(() => {\n clearInterval(interval);\n reject(new Error(\"Transaction failed: Timeout\"));\n }, timeout);\n });\n }\n\n /**\n * Returns the Kwil signer used by the client.\n * @returns An instance of KwilSigner.\n */\n getKwilSigner(): KwilSigner {\n return new KwilSigner(\n this.signerInfo.signer,\n this.address().getAddress(),\n );\n }\n\n /**\n * Returns the Kwil client used by the client.\n * @returns An instance of Kwil.\n * @throws If the Kwil client is not initialized.\n */\n getKwilClient(): Kwil<EnvironmentType> {\n if (!this.kwilClient) {\n throw new Error(\"Kwil client not initialized\");\n }\n return this.kwilClient;\n }\n\n /**\n * Deploys a new stream.\n * @param streamId - The ID of the stream to deploy.\n * @param streamType - The type of the stream.\n * @param synchronous - Whether the deployment should be synchronous.\n * @param contractVersion\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async deployStream(\n streamId: StreamId,\n streamType: StreamType,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deployStream({\n streamId,\n streamType,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Destroys a stream.\n * @param stream - The StreamLocator of the stream to destroy.\n * @param synchronous - Whether the destruction should be synchronous.\n * @returns A promise that resolves to a generic response containing the transaction receipt.\n */\n async destroyStream(\n stream: StreamLocator,\n synchronous?: boolean,\n ): Promise<GenericResponse<TxReceipt>> {\n return await deleteStream({\n stream,\n synchronous,\n kwilClient: this.getKwilClient(),\n kwilSigner: this.getKwilSigner(),\n });\n }\n\n /**\n * Loads an already deployed stream, permitting its API usage.\n * @returns An instance of IStream.\n */\n loadAction(): Action {\n return new Action(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads a primitive stream.\n * @returns An instance of IPrimitiveStream.\n */\n loadPrimitiveAction(): PrimitiveAction {\n return PrimitiveAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads a composed stream.\n * @returns An instance of IComposedStream.\n */\n loadComposedAction(): ComposedAction {\n return ComposedAction.fromStream(this.loadAction());\n }\n\n /**\n * Loads the role management contract API, permitting its RBAC usage.\n */\n loadRoleManagementAction(): RoleManagement {\n return RoleManagement.fromClient(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Creates a new stream locator.\n * @param streamId - The ID of the stream.\n * @returns A StreamLocator object.\n */\n ownStreamLocator(streamId: StreamId): StreamLocator {\n return {\n streamId,\n dataProvider: this.address(),\n };\n }\n\n /**\n * Returns the address of the signer used by the client.\n * @returns An instance of EthereumAddress.\n */\n address(): EthereumAddress {\n return new EthereumAddress(this.signerInfo.address);\n }\n\n /**\n * Returns all streams from the TN network.\n * @param input - The input parameters for listing streams.\n * @returns A promise that resolves to a list of stream locators.\n */\n async getListStreams(input: ListStreamsInput): Promise<TNStream[]> {\n return listStreams(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Returns the last write activity across streams.\n * @param input - The input parameters for getting last transactions.\n * @returns A promise that resolves to a list of last transactions.\n */\n async getLastTransactions(input: GetLastTransactionsInput): Promise<any[]> {\n return getLastTransactions(this.getKwilClient() as WebKwil | NodeKwil,this.getKwilSigner(),input);\n }\n\n /**\n * Lists taxonomies by height range for incremental synchronization.\n * High-level wrapper for ComposedAction.listTaxonomiesByHeight()\n * \n * @param params Height range and pagination parameters \n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const taxonomies = await client.listTaxonomiesByHeight({\n * fromHeight: 1000,\n * toHeight: 2000,\n * limit: 100,\n * latestOnly: true\n * });\n * ```\n */\n async listTaxonomiesByHeight(params: ListTaxonomiesByHeightParams = {}): Promise<TaxonomyQueryResult[]> {\n const composedAction = this.loadComposedAction();\n return composedAction.listTaxonomiesByHeight(params);\n }\n\n /**\n * Gets taxonomies for specific streams in batch.\n * High-level wrapper for ComposedAction.getTaxonomiesForStreams()\n * \n * @param params Stream locators and options\n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const streams = [\n * { dataProvider: provider1, streamId: streamId1 },\n * { dataProvider: provider2, streamId: streamId2 }\n * ];\n * const taxonomies = await client.getTaxonomiesForStreams({\n * streams,\n * latestOnly: true\n * });\n * ```\n */\n async getTaxonomiesForStreams(params: GetTaxonomiesForStreamsParams): Promise<TaxonomyQueryResult[]> {\n const composedAction = this.loadComposedAction();\n return composedAction.getTaxonomiesForStreams(params);\n }\n\n /**\n * Get the default chain id for a provider. Use with caution, as this decreases the security of the TN.\n * @param provider - The provider URL.\n * @returns A promise that resolves to the chain ID.\n */\n public static async getDefaultChainId(provider: string) {\n const kwilClient = new Client({\n kwilProvider: provider,\n });\n const chainInfo = await kwilClient[\"chainInfoClient\"]();\n return chainInfo.data?.chain_id;\n }\n\n /*\n * High-level role-management helpers. These wrap the lower-level\n * RoleManagement contract calls and expose a simpler API on the\n * TN client.\n */\n\n /** Grants a role to one or more wallets. */\n async grantRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.grantRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /** Revokes a role from one or more wallets. */\n async revokeRole(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallets: EthereumAddress | EthereumAddress[];\n synchronous?: boolean;\n }): Promise<string> {\n const rm = this.loadRoleManagementAction();\n const walletsArr: EthereumAddress[] = Array.isArray(input.wallets)\n ? input.wallets\n : [input.wallets];\n const tx = await rm.revokeRole(\n {\n owner: input.owner,\n roleName: input.roleName,\n wallets: walletsArr,\n },\n input.synchronous,\n );\n return tx.data?.tx_hash as unknown as string;\n }\n\n /**\n * Checks if a wallet is member of a role.\n * Returns true if the wallet is a member.\n */\n async isMemberOf(input: {\n owner: OwnerIdentifier;\n roleName: string;\n wallet: EthereumAddress;\n }): Promise<boolean> {\n const rm = this.loadRoleManagementAction();\n const res = await rm.areMembersOf({\n owner: input.owner,\n roleName: input.roleName,\n wallets: [input.wallet],\n });\n return res.length > 0 && res[0].isMember;\n }\n\n /**\n * Lists role members \u2013 currently unsupported in the\n * smart-contract layer.\n */\n async listRoleMembers(input: {\n owner: OwnerIdentifier;\n roleName: string;\n limit?: number;\n offset?: number;\n }): Promise<import(\"../types/role\").RoleMember[]> {\n const rm = this.loadRoleManagementAction();\n return rm.listRoleMembers({\n owner: input.owner,\n roleName: input.roleName,\n limit: input.limit,\n offset: input.offset,\n });\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -118,6 +118,92 @@ var ComposedAction = class _ComposedAction extends import_action.Action {
118
118
  });
119
119
  return txHash;
120
120
  }
121
+ /**
122
+ * Lists taxonomies by block height range for incremental synchronization.
123
+ * Enables efficient detection of taxonomy changes since a specific block height.
124
+ *
125
+ * @param params Height range and pagination parameters
126
+ * @returns Promise resolving to taxonomy query results
127
+ *
128
+ * @example
129
+ * ```typescript
130
+ * const taxonomies = await composedAction.listTaxonomiesByHeight({
131
+ * fromHeight: 1000,
132
+ * toHeight: 2000,
133
+ * limit: 100,
134
+ * latestOnly: true
135
+ * });
136
+ * ```
137
+ */
138
+ async listTaxonomiesByHeight(params = {}) {
139
+ const result = await this.call(
140
+ "list_taxonomies_by_height",
141
+ {
142
+ $from_height: params.fromHeight ?? null,
143
+ $to_height: params.toHeight ?? null,
144
+ $limit: params.limit ?? null,
145
+ $offset: params.offset ?? null,
146
+ $latest_only: params.latestOnly ?? null
147
+ }
148
+ );
149
+ return result.mapRight(
150
+ (records) => records.map((record) => ({
151
+ dataProvider: import_EthereumAddress.EthereumAddress.fromString(record.data_provider).throw(),
152
+ streamId: import_StreamId.StreamId.fromString(record.stream_id).throw(),
153
+ childDataProvider: import_EthereumAddress.EthereumAddress.fromString(record.child_data_provider).throw(),
154
+ childStreamId: import_StreamId.StreamId.fromString(record.child_stream_id).throw(),
155
+ weight: record.weight,
156
+ createdAt: record.created_at,
157
+ groupSequence: record.group_sequence,
158
+ startTime: record.start_time
159
+ }))
160
+ ).throw();
161
+ }
162
+ /**
163
+ * Gets taxonomies for specific streams in batch.
164
+ * Useful for validating taxonomy data for known streams.
165
+ *
166
+ * @param params Stream locators and filtering options
167
+ * @returns Promise resolving to taxonomy query results
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * const taxonomies = await composedAction.getTaxonomiesForStreams({
172
+ * streams: [
173
+ * { dataProvider: provider1, streamId: streamId1 },
174
+ * { dataProvider: provider2, streamId: streamId2 }
175
+ * ],
176
+ * latestOnly: true
177
+ * });
178
+ * ```
179
+ */
180
+ async getTaxonomiesForStreams(params) {
181
+ if (!params.streams || params.streams.length === 0) {
182
+ return [];
183
+ }
184
+ const dataProviders = params.streams.map((s) => s.dataProvider.getAddress());
185
+ const streamIds = params.streams.map((s) => s.streamId.getId());
186
+ const result = await this.call(
187
+ "get_taxonomies_for_streams",
188
+ {
189
+ $data_providers: dataProviders,
190
+ $stream_ids: streamIds,
191
+ $latest_only: params.latestOnly ?? null
192
+ }
193
+ );
194
+ return result.mapRight(
195
+ (records) => records.map((record) => ({
196
+ dataProvider: import_EthereumAddress.EthereumAddress.fromString(record.data_provider).throw(),
197
+ streamId: import_StreamId.StreamId.fromString(record.stream_id).throw(),
198
+ childDataProvider: import_EthereumAddress.EthereumAddress.fromString(record.child_data_provider).throw(),
199
+ childStreamId: import_StreamId.StreamId.fromString(record.child_stream_id).throw(),
200
+ weight: record.weight,
201
+ createdAt: record.created_at,
202
+ groupSequence: record.group_sequence,
203
+ startTime: record.start_time
204
+ }))
205
+ ).throw();
206
+ }
121
207
  /**
122
208
  * Creates a ComposedStream from a base Stream
123
209
  * @param stream The base stream to convert
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contracts-api/composedAction.ts"],
4
- "sourcesContent": ["import {KwilSigner, NodeKwil, Utils, WebKwil} from \"@trufnetwork/kwil-js\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { Action } from \"./action\";\nimport DataType = Utils.DataType;\n\nexport const ErrorStreamNotComposed = \"stream is not a composed stream\";\n\nexport interface TaxonomySet {\n stream: StreamLocator;\n taxonomyItems: TaxonomyItem[];\n startDate: number;\n}\n\nexport interface TaxonomyItem {\n childStream: StreamLocator;\n weight: string;\n}\n\nexport interface DescribeTaxonomiesParams {\n stream: StreamLocator;\n /**\n * if true, will return the latest version of the taxonomy only\n */\n latestGroupSequence: boolean;\n}\n\nexport class ComposedAction extends Action {\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n super(kwilClient, kwilSigner);\n }\n\n /**\n * Returns the taxonomy of the stream\n * @param params Parameters for describing taxonomies\n * @returns A promise that resolves to the taxonomy\n */\n public async describeTaxonomies(\n params: DescribeTaxonomiesParams,\n ): Promise<TaxonomySet[]> {\n type TaxonomyResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_date: number;\n }[];\n\n const result = await this.call<TaxonomyResult>(\n \"describe_taxonomies\",\n {\n $data_provider: params.stream.dataProvider.getAddress(),\n $stream_id: params.stream.streamId.getId(),\n $latest_group_sequence: params.latestGroupSequence,\n },\n );\n\n\n\n return result\n .mapRight((records) => {\n const taxonomyItems: Map<DateString, TaxonomyItem[]> = records.reduce(\n (acc, record) => {\n const currentArray = acc.get(record.start_date.toString()) || [];\n currentArray.push({\n childStream: {\n streamId: StreamId.fromString(record.child_stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n record.child_data_provider,\n ).throw(),\n },\n weight: record.weight,\n });\n acc.set(record.start_date.toString(), currentArray);\n return acc;\n },\n new Map<DateString, TaxonomyItem[]>(),\n );\n\n return Array.from(taxonomyItems.entries()).map(\n ([startDate, taxonomyItems]) => ({\n stream: {\n streamId: StreamId.fromString(records[0].stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n records[0].data_provider,\n ).throw(),\n },\n taxonomyItems,\n startDate: Number(startDate)\n }),\n );\n })\n .throw();\n }\n\n /**\n * Sets the taxonomy of the stream\n * @param taxonomy The taxonomy to set\n * @returns A promise that resolves to the transaction receipt\n */\n public async setTaxonomy(\n taxonomy: TaxonomySet,\n ): Promise<GenericResponse<TxReceipt>> {\n const childDataProviders: string[] = [];\n const childStreamIds: string[] = [];\n const weights: string[] = [];\n\n for (const item of taxonomy.taxonomyItems) {\n childDataProviders.push(item.childStream.dataProvider\n .getAddress());\n childStreamIds.push(item.childStream.streamId.getId());\n weights.push(item.weight.toString());\n }\n\n const txHash = await this.executeWithActionBody({\n namespace: \"main\",\n name: \"insert_taxonomy\",\n inputs: [\n {\n $data_provider: taxonomy.stream.dataProvider.getAddress(),\n $stream_id: taxonomy.stream.streamId.getId(),\n $child_data_providers: childDataProviders,\n $child_stream_ids: childStreamIds,\n $weights: weights,\n $start_date: taxonomy.startDate\n },\n ],\n types: {\n $data_provider: DataType.Text,\n $stream_id: DataType.Text,\n $child_data_providers: DataType.TextArray,\n $child_stream_ids: DataType.TextArray,\n $weights: DataType.NumericArray(36,18),\n $start_date: DataType.Int\n }});\n\n return txHash;\n }\n\n /**\n * Creates a ComposedStream from a base Stream\n * @param stream The base stream to convert\n * @returns A ComposedStream instance\n */\n public static fromStream(stream: Action): ComposedAction {\n return new ComposedAction(\n stream[\"kwilClient\"],\n stream[\"kwilSigner\"],\n );\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {KwilSigner, NodeKwil, Utils, WebKwil} from \"@trufnetwork/kwil-js\";\nimport { GenericResponse } from \"@trufnetwork/kwil-js/dist/core/resreq\";\nimport { TxReceipt } from \"@trufnetwork/kwil-js/dist/core/tx\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { StreamId } from \"../util/StreamId\";\nimport { Action } from \"./action\";\nimport DataType = Utils.DataType;\n\nexport const ErrorStreamNotComposed = \"stream is not a composed stream\";\n\nexport interface TaxonomySet {\n stream: StreamLocator;\n taxonomyItems: TaxonomyItem[];\n startDate: number;\n}\n\nexport interface TaxonomyItem {\n childStream: StreamLocator;\n weight: string;\n}\n\nexport interface DescribeTaxonomiesParams {\n stream: StreamLocator;\n /**\n * if true, will return the latest version of the taxonomy only\n */\n latestGroupSequence: boolean;\n}\n\nexport interface ListTaxonomiesByHeightParams {\n /** Start height (inclusive). If null, uses earliest available. */\n fromHeight?: number;\n /** End height (inclusive). If null, uses current height. */\n toHeight?: number;\n /** Maximum number of results to return. Default: 1000 */\n limit?: number;\n /** Number of results to skip for pagination. Default: 0 */\n offset?: number;\n /** If true, returns only latest group_sequence per stream. Default: false */\n latestOnly?: boolean;\n}\n\nexport interface GetTaxonomiesForStreamsParams {\n /** Array of stream locators to query */\n streams: StreamLocator[];\n /** If true, returns only latest group_sequence per stream. Default: false */\n latestOnly?: boolean;\n}\n\nexport interface TaxonomyQueryResult {\n /** Parent stream data provider */\n dataProvider: EthereumAddress;\n /** Parent stream ID */\n streamId: StreamId;\n /** Child stream data provider */\n childDataProvider: EthereumAddress;\n /** Child stream ID */\n childStreamId: StreamId;\n /** Weight of the child stream in the taxonomy */\n weight: string;\n /** Block height when taxonomy was created */\n createdAt: number;\n /** Group sequence number for this taxonomy set */\n groupSequence: number;\n /** Start time timestamp for this taxonomy */\n startTime: number;\n}\n\nexport class ComposedAction extends Action {\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n super(kwilClient, kwilSigner);\n }\n\n /**\n * Returns the taxonomy of the stream\n * @param params Parameters for describing taxonomies\n * @returns A promise that resolves to the taxonomy\n */\n public async describeTaxonomies(\n params: DescribeTaxonomiesParams,\n ): Promise<TaxonomySet[]> {\n type TaxonomyResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_date: number;\n }[];\n\n const result = await this.call<TaxonomyResult>(\n \"describe_taxonomies\",\n {\n $data_provider: params.stream.dataProvider.getAddress(),\n $stream_id: params.stream.streamId.getId(),\n $latest_group_sequence: params.latestGroupSequence,\n },\n );\n\n\n\n return result\n .mapRight((records) => {\n const taxonomyItems: Map<DateString, TaxonomyItem[]> = records.reduce(\n (acc, record) => {\n const currentArray = acc.get(record.start_date.toString()) || [];\n currentArray.push({\n childStream: {\n streamId: StreamId.fromString(record.child_stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n record.child_data_provider,\n ).throw(),\n },\n weight: record.weight,\n });\n acc.set(record.start_date.toString(), currentArray);\n return acc;\n },\n new Map<DateString, TaxonomyItem[]>(),\n );\n\n return Array.from(taxonomyItems.entries()).map(\n ([startDate, taxonomyItems]) => ({\n stream: {\n streamId: StreamId.fromString(records[0].stream_id).throw(),\n dataProvider: EthereumAddress.fromString(\n records[0].data_provider,\n ).throw(),\n },\n taxonomyItems,\n startDate: Number(startDate)\n }),\n );\n })\n .throw();\n }\n\n /**\n * Sets the taxonomy of the stream\n * @param taxonomy The taxonomy to set\n * @returns A promise that resolves to the transaction receipt\n */\n public async setTaxonomy(\n taxonomy: TaxonomySet,\n ): Promise<GenericResponse<TxReceipt>> {\n const childDataProviders: string[] = [];\n const childStreamIds: string[] = [];\n const weights: string[] = [];\n\n for (const item of taxonomy.taxonomyItems) {\n childDataProviders.push(item.childStream.dataProvider\n .getAddress());\n childStreamIds.push(item.childStream.streamId.getId());\n weights.push(item.weight.toString());\n }\n\n const txHash = await this.executeWithActionBody({\n namespace: \"main\",\n name: \"insert_taxonomy\",\n inputs: [\n {\n $data_provider: taxonomy.stream.dataProvider.getAddress(),\n $stream_id: taxonomy.stream.streamId.getId(),\n $child_data_providers: childDataProviders,\n $child_stream_ids: childStreamIds,\n $weights: weights,\n $start_date: taxonomy.startDate\n },\n ],\n types: {\n $data_provider: DataType.Text,\n $stream_id: DataType.Text,\n $child_data_providers: DataType.TextArray,\n $child_stream_ids: DataType.TextArray,\n $weights: DataType.NumericArray(36,18),\n $start_date: DataType.Int\n }});\n\n return txHash;\n }\n\n /**\n * Lists taxonomies by block height range for incremental synchronization.\n * Enables efficient detection of taxonomy changes since a specific block height.\n * \n * @param params Height range and pagination parameters\n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const taxonomies = await composedAction.listTaxonomiesByHeight({\n * fromHeight: 1000,\n * toHeight: 2000,\n * limit: 100,\n * latestOnly: true\n * });\n * ```\n */\n public async listTaxonomiesByHeight(\n params: ListTaxonomiesByHeightParams = {},\n ): Promise<TaxonomyQueryResult[]> {\n type TaxonomyRawResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_time: number;\n }[];\n\n const result = await this.call<TaxonomyRawResult>(\n \"list_taxonomies_by_height\",\n {\n $from_height: params.fromHeight ?? null,\n $to_height: params.toHeight ?? null,\n $limit: params.limit ?? null,\n $offset: params.offset ?? null,\n $latest_only: params.latestOnly ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n dataProvider: EthereumAddress.fromString(record.data_provider).throw(),\n streamId: StreamId.fromString(record.stream_id).throw(),\n childDataProvider: EthereumAddress.fromString(record.child_data_provider).throw(),\n childStreamId: StreamId.fromString(record.child_stream_id).throw(),\n weight: record.weight,\n createdAt: record.created_at,\n groupSequence: record.group_sequence,\n startTime: record.start_time,\n }))\n )\n .throw();\n }\n\n /**\n * Gets taxonomies for specific streams in batch.\n * Useful for validating taxonomy data for known streams.\n * \n * @param params Stream locators and filtering options\n * @returns Promise resolving to taxonomy query results\n * \n * @example\n * ```typescript\n * const taxonomies = await composedAction.getTaxonomiesForStreams({\n * streams: [\n * { dataProvider: provider1, streamId: streamId1 },\n * { dataProvider: provider2, streamId: streamId2 }\n * ],\n * latestOnly: true\n * });\n * ```\n */\n public async getTaxonomiesForStreams(\n params: GetTaxonomiesForStreamsParams,\n ): Promise<TaxonomyQueryResult[]> {\n // Validate input\n if (!params.streams || params.streams.length === 0) {\n return [];\n }\n\n const dataProviders = params.streams.map(s => s.dataProvider.getAddress());\n const streamIds = params.streams.map(s => s.streamId.getId());\n\n type TaxonomyRawResult = {\n data_provider: string;\n stream_id: string;\n child_data_provider: string;\n child_stream_id: string;\n weight: string;\n created_at: number;\n group_sequence: number;\n start_time: number;\n }[];\n\n const result = await this.call<TaxonomyRawResult>(\n \"get_taxonomies_for_streams\",\n {\n $data_providers: dataProviders,\n $stream_ids: streamIds,\n $latest_only: params.latestOnly ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n dataProvider: EthereumAddress.fromString(record.data_provider).throw(),\n streamId: StreamId.fromString(record.stream_id).throw(),\n childDataProvider: EthereumAddress.fromString(record.child_data_provider).throw(),\n childStreamId: StreamId.fromString(record.child_stream_id).throw(),\n weight: record.weight,\n createdAt: record.created_at,\n groupSequence: record.group_sequence,\n startTime: record.start_time,\n }))\n )\n .throw();\n }\n\n /**\n * Creates a ComposedStream from a base Stream\n * @param stream The base stream to convert\n * @returns A ComposedStream instance\n */\n public static fromStream(stream: Action): ComposedAction {\n return new ComposedAction(\n stream[\"kwilClient\"],\n stream[\"kwilSigner\"],\n );\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAmD;AAKnD,6BAAgC;AAChC,sBAAyB;AACzB,oBAAuB;AACvB,IAAO,WAAW,qBAAM;AAEjB,IAAM,yBAAyB;AA4D/B,IAAM,iBAAN,MAAM,wBAAuB,qBAAO;AAAA,EACzC,YACE,YACA,YACA;AACA,UAAM,YAAY,UAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,mBACX,QACwB;AAYxB,UAAM,SAAS,MAAM,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,QACI,gBAAgB,OAAO,OAAO,aAAa,WAAW;AAAA,QACtD,YAAY,OAAO,OAAO,SAAS,MAAM;AAAA,QACzC,wBAAwB,OAAO;AAAA,MACnC;AAAA,IACJ;AAIA,WAAO,OACJ,SAAS,CAAC,YAAY;AACrB,YAAM,gBAAiD,QAAQ;AAAA,QAC7D,CAAC,KAAK,WAAW;AACf,gBAAM,eAAe,IAAI,IAAI,OAAO,WAAW,SAAS,CAAC,KAAK,CAAC;AAC/D,uBAAa,KAAK;AAAA,YAChB,aAAa;AAAA,cACX,UAAU,yBAAS,WAAW,OAAO,eAAe,EAAE,MAAM;AAAA,cAC5D,cAAc,uCAAgB;AAAA,gBAC5B,OAAO;AAAA,cACT,EAAE,MAAM;AAAA,YACV;AAAA,YACA,QAAQ,OAAO;AAAA,UACjB,CAAC;AACD,cAAI,IAAI,OAAO,WAAW,SAAS,GAAG,YAAY;AAClD,iBAAO;AAAA,QACT;AAAA,QACA,oBAAI,IAAgC;AAAA,MACtC;AAEA,aAAO,MAAM,KAAK,cAAc,QAAQ,CAAC,EAAE;AAAA,QACzC,CAAC,CAAC,WAAWA,cAAa,OAAO;AAAA,UAC/B,QAAQ;AAAA,YACN,UAAU,yBAAS,WAAW,QAAQ,CAAC,EAAE,SAAS,EAAE,MAAM;AAAA,YAC1D,cAAc,uCAAgB;AAAA,cAC5B,QAAQ,CAAC,EAAE;AAAA,YACb,EAAE,MAAM;AAAA,UACV;AAAA,UACA,eAAAA;AAAA,UACA,WAAW,OAAO,SAAS;AAAA,QAC7B;AAAA,MACF;AAAA,IACF,CAAC,EACA,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAa,YACX,UACqC;AACrC,UAAM,qBAA+B,CAAC;AACtC,UAAM,iBAA2B,CAAC;AAClC,UAAM,UAAoB,CAAC;AAE3B,eAAW,QAAQ,SAAS,eAAe;AACzC,yBAAmB,KAAK,KAAK,YAAY,aACpC,WAAW,CAAC;AACjB,qBAAe,KAAK,KAAK,YAAY,SAAS,MAAM,CAAC;AACrD,cAAQ,KAAK,KAAK,OAAO,SAAS,CAAC;AAAA,IACrC;AAEA,UAAM,SAAS,MAAM,KAAK,sBAAsB;AAAA,MAC5C,WAAW;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,QACN;AAAA,UACE,gBAAgB,SAAS,OAAO,aAAa,WAAW;AAAA,UACxD,YAAY,SAAS,OAAO,SAAS,MAAM;AAAA,UAC3C,uBAAuB;AAAA,UACvB,mBAAmB;AAAA,UACnB,UAAU;AAAA,UACV,aAAa,SAAS;AAAA,QACxB;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,gBAAgB,SAAS;AAAA,QACzB,YAAY,SAAS;AAAA,QACrB,uBAAuB,SAAS;AAAA,QAChC,mBAAmB,SAAS;AAAA,QAC5B,UAAU,SAAS,aAAa,IAAG,EAAE;AAAA,QACrC,aAAa,SAAS;AAAA,MACxB;AAAA,IAAC,CAAC;AAEN,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAa,uBACX,SAAuC,CAAC,GACR;AAYhC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,cAAc,OAAO,cAAc;AAAA,QACnC,YAAY,OAAO,YAAY;AAAA,QAC/B,QAAQ,OAAO,SAAS;AAAA,QACxB,SAAS,OAAO,UAAU;AAAA,QAC1B,cAAc,OAAO,cAAc;AAAA,MACrC;AAAA,IACF;AAEA,WAAO,OACJ;AAAA,MAAS,CAAC,YACT,QAAQ,IAAI,aAAW;AAAA,QACrB,cAAc,uCAAgB,WAAW,OAAO,aAAa,EAAE,MAAM;AAAA,QACrE,UAAU,yBAAS,WAAW,OAAO,SAAS,EAAE,MAAM;AAAA,QACtD,mBAAmB,uCAAgB,WAAW,OAAO,mBAAmB,EAAE,MAAM;AAAA,QAChF,eAAe,yBAAS,WAAW,OAAO,eAAe,EAAE,MAAM;AAAA,QACjE,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO;AAAA,QAClB,eAAe,OAAO;AAAA,QACtB,WAAW,OAAO;AAAA,MACpB,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,MAAa,wBACX,QACgC;AAEhC,QAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAAG;AAClD,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,gBAAgB,OAAO,QAAQ,IAAI,OAAK,EAAE,aAAa,WAAW,CAAC;AACzE,UAAM,YAAY,OAAO,QAAQ,IAAI,OAAK,EAAE,SAAS,MAAM,CAAC;AAa5D,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,iBAAiB;AAAA,QACjB,aAAa;AAAA,QACb,cAAc,OAAO,cAAc;AAAA,MACrC;AAAA,IACF;AAEA,WAAO,OACJ;AAAA,MAAS,CAAC,YACT,QAAQ,IAAI,aAAW;AAAA,QACrB,cAAc,uCAAgB,WAAW,OAAO,aAAa,EAAE,MAAM;AAAA,QACrE,UAAU,yBAAS,WAAW,OAAO,SAAS,EAAE,MAAM;AAAA,QACtD,mBAAmB,uCAAgB,WAAW,OAAO,mBAAmB,EAAE,MAAM;AAAA,QAChF,eAAe,yBAAS,WAAW,OAAO,eAAe,EAAE,MAAM;AAAA,QACjE,QAAQ,OAAO;AAAA,QACf,WAAW,OAAO;AAAA,QAClB,eAAe,OAAO;AAAA,QACtB,WAAW,OAAO;AAAA,MACpB,EAAE;AAAA,IACJ,EACC,MAAM;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAc,WAAW,QAAgC;AACvD,WAAO,IAAI;AAAA,MACT,OAAO,YAAY;AAAA,MACnB,OAAO,YAAY;AAAA,IACrB;AAAA,EACF;AACF;",
6
6
  "names": ["taxonomyItems"]
7
7
  }
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+
3
+ // src/contracts-api/composedAction.test.ts
4
+ var import_vitest = require("vitest");
5
+ var import_composedAction = require("./composedAction.cjs");
6
+ var import_EthereumAddress = require("../util/EthereumAddress.cjs");
7
+ var import_StreamId = require("../util/StreamId.cjs");
8
+ (0, import_vitest.describe)("ComposedAction Taxonomy Query Methods", () => {
9
+ const createMockClient = (mockResponse) => ({
10
+ call: import_vitest.vi.fn().mockResolvedValue({
11
+ status: 200,
12
+ data: {
13
+ result: mockResponse
14
+ }
15
+ })
16
+ });
17
+ const mockSigner = {};
18
+ (0, import_vitest.test)("listTaxonomiesByHeight calls correct action with parameters", async () => {
19
+ const mockResponse = [
20
+ {
21
+ data_provider: "0x1234567890abcdef1234567890abcdef12345678",
22
+ stream_id: "test-stream",
23
+ child_data_provider: "0xabcdef1234567890abcdef1234567890abcdef12",
24
+ child_stream_id: "child-stream",
25
+ weight: "100.5",
26
+ created_at: 1e3,
27
+ group_sequence: 1,
28
+ start_time: 1625097600
29
+ }
30
+ ];
31
+ const mockClient = createMockClient(mockResponse);
32
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
33
+ const result = await composedAction.listTaxonomiesByHeight({
34
+ fromHeight: 1e3,
35
+ toHeight: 2e3,
36
+ limit: 100,
37
+ offset: 10,
38
+ latestOnly: true
39
+ });
40
+ (0, import_vitest.expect)(mockClient.call).toHaveBeenCalledWith(
41
+ {
42
+ namespace: "main",
43
+ name: "list_taxonomies_by_height",
44
+ inputs: {
45
+ $from_height: 1e3,
46
+ $to_height: 2e3,
47
+ $limit: 100,
48
+ $offset: 10,
49
+ $latest_only: true
50
+ }
51
+ },
52
+ {}
53
+ );
54
+ (0, import_vitest.expect)(result).toHaveLength(1);
55
+ (0, import_vitest.expect)(result[0].dataProvider.getAddress()).toBe("0x1234567890abcdef1234567890abcdef12345678");
56
+ (0, import_vitest.expect)(result[0].streamId.getId()).toBe("test-stream");
57
+ (0, import_vitest.expect)(result[0].childDataProvider.getAddress()).toBe("0xabcdef1234567890abcdef1234567890abcdef12");
58
+ (0, import_vitest.expect)(result[0].childStreamId.getId()).toBe("child-stream");
59
+ (0, import_vitest.expect)(result[0].weight).toBe("100.5");
60
+ (0, import_vitest.expect)(result[0].createdAt).toBe(1e3);
61
+ (0, import_vitest.expect)(result[0].groupSequence).toBe(1);
62
+ (0, import_vitest.expect)(result[0].startTime).toBe(1625097600);
63
+ });
64
+ (0, import_vitest.test)("listTaxonomiesByHeight handles default parameters", async () => {
65
+ const mockClient = createMockClient([]);
66
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
67
+ await composedAction.listTaxonomiesByHeight({});
68
+ (0, import_vitest.expect)(mockClient.call).toHaveBeenCalledWith(
69
+ {
70
+ namespace: "main",
71
+ name: "list_taxonomies_by_height",
72
+ inputs: {
73
+ $from_height: null,
74
+ $to_height: null,
75
+ $limit: null,
76
+ $offset: null,
77
+ $latest_only: null
78
+ }
79
+ },
80
+ {}
81
+ );
82
+ });
83
+ (0, import_vitest.test)("listTaxonomiesByHeight handles empty parameters", async () => {
84
+ const mockClient = createMockClient([]);
85
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
86
+ await composedAction.listTaxonomiesByHeight();
87
+ (0, import_vitest.expect)(mockClient.call).toHaveBeenCalledWith(
88
+ {
89
+ namespace: "main",
90
+ name: "list_taxonomies_by_height",
91
+ inputs: {
92
+ $from_height: null,
93
+ $to_height: null,
94
+ $limit: null,
95
+ $offset: null,
96
+ $latest_only: null
97
+ }
98
+ },
99
+ {}
100
+ );
101
+ });
102
+ (0, import_vitest.test)("getTaxonomiesForStreams calls correct action with stream arrays", async () => {
103
+ const mockResponse = [
104
+ {
105
+ data_provider: "0x1111111111111111111111111111111111111111",
106
+ stream_id: "stream-1",
107
+ child_data_provider: "0x2222222222222222222222222222222222222222",
108
+ child_stream_id: "child-1",
109
+ weight: "50.0",
110
+ created_at: 2e3,
111
+ group_sequence: 2,
112
+ start_time: 1625097700
113
+ }
114
+ ];
115
+ const mockClient = createMockClient(mockResponse);
116
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
117
+ const testStreams = [
118
+ {
119
+ dataProvider: import_EthereumAddress.EthereumAddress.fromString("0x1111111111111111111111111111111111111111").throw(),
120
+ streamId: import_StreamId.StreamId.fromString("stream-1").throw()
121
+ },
122
+ {
123
+ dataProvider: import_EthereumAddress.EthereumAddress.fromString("0x3333333333333333333333333333333333333333").throw(),
124
+ streamId: import_StreamId.StreamId.fromString("stream-2").throw()
125
+ }
126
+ ];
127
+ const result = await composedAction.getTaxonomiesForStreams({
128
+ streams: testStreams,
129
+ latestOnly: false
130
+ });
131
+ (0, import_vitest.expect)(mockClient.call).toHaveBeenCalledWith(
132
+ {
133
+ namespace: "main",
134
+ name: "get_taxonomies_for_streams",
135
+ inputs: {
136
+ $data_providers: [
137
+ "0x1111111111111111111111111111111111111111",
138
+ "0x3333333333333333333333333333333333333333"
139
+ ],
140
+ $stream_ids: ["stream-1", "stream-2"],
141
+ $latest_only: false
142
+ }
143
+ },
144
+ {}
145
+ );
146
+ (0, import_vitest.expect)(result).toHaveLength(1);
147
+ (0, import_vitest.expect)(result[0].dataProvider.getAddress()).toBe("0x1111111111111111111111111111111111111111");
148
+ (0, import_vitest.expect)(result[0].streamId.getId()).toBe("stream-1");
149
+ (0, import_vitest.expect)(result[0].weight).toBe("50.0");
150
+ });
151
+ (0, import_vitest.test)("getTaxonomiesForStreams handles empty stream array", async () => {
152
+ const mockClient = createMockClient([]);
153
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
154
+ const result = await composedAction.getTaxonomiesForStreams({
155
+ streams: [],
156
+ latestOnly: true
157
+ });
158
+ (0, import_vitest.expect)(mockClient.call).not.toHaveBeenCalled();
159
+ (0, import_vitest.expect)(result).toEqual([]);
160
+ });
161
+ (0, import_vitest.test)("getTaxonomiesForStreams handles latestOnly parameter", async () => {
162
+ const mockClient = createMockClient([]);
163
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
164
+ const testStreams = [
165
+ {
166
+ dataProvider: import_EthereumAddress.EthereumAddress.fromString("0x1111111111111111111111111111111111111111").throw(),
167
+ streamId: import_StreamId.StreamId.fromString("stream-1").throw()
168
+ }
169
+ ];
170
+ await composedAction.getTaxonomiesForStreams({
171
+ streams: testStreams,
172
+ latestOnly: true
173
+ });
174
+ (0, import_vitest.expect)(mockClient.call).toHaveBeenCalledWith(
175
+ {
176
+ namespace: "main",
177
+ name: "get_taxonomies_for_streams",
178
+ inputs: import_vitest.expect.objectContaining({
179
+ $latest_only: true
180
+ })
181
+ },
182
+ {}
183
+ );
184
+ });
185
+ (0, import_vitest.test)("getTaxonomiesForStreams handles default latestOnly parameter", async () => {
186
+ const mockClient = createMockClient([]);
187
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
188
+ const testStreams = [
189
+ {
190
+ dataProvider: import_EthereumAddress.EthereumAddress.fromString("0x1111111111111111111111111111111111111111").throw(),
191
+ streamId: import_StreamId.StreamId.fromString("stream-1").throw()
192
+ }
193
+ ];
194
+ await composedAction.getTaxonomiesForStreams({
195
+ streams: testStreams
196
+ });
197
+ (0, import_vitest.expect)(mockClient.call).toHaveBeenCalledWith(
198
+ {
199
+ namespace: "main",
200
+ name: "get_taxonomies_for_streams",
201
+ inputs: import_vitest.expect.objectContaining({
202
+ $latest_only: null
203
+ })
204
+ },
205
+ {}
206
+ );
207
+ });
208
+ (0, import_vitest.test)("listTaxonomiesByHeight handles network error", async () => {
209
+ const mockClient = {
210
+ call: import_vitest.vi.fn().mockResolvedValue({
211
+ status: 500,
212
+ data: null
213
+ })
214
+ };
215
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
216
+ await (0, import_vitest.expect)(
217
+ composedAction.listTaxonomiesByHeight({
218
+ fromHeight: 1e3,
219
+ toHeight: 2e3
220
+ })
221
+ ).rejects.toThrow();
222
+ });
223
+ (0, import_vitest.test)("getTaxonomiesForStreams handles network error", async () => {
224
+ const mockClient = {
225
+ call: import_vitest.vi.fn().mockResolvedValue({
226
+ status: 404,
227
+ data: null
228
+ })
229
+ };
230
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
231
+ const testStreams = [
232
+ {
233
+ dataProvider: import_EthereumAddress.EthereumAddress.fromString("0x1111111111111111111111111111111111111111").throw(),
234
+ streamId: import_StreamId.StreamId.fromString("stream-1").throw()
235
+ }
236
+ ];
237
+ await (0, import_vitest.expect)(
238
+ composedAction.getTaxonomiesForStreams({
239
+ streams: testStreams
240
+ })
241
+ ).rejects.toThrow();
242
+ });
243
+ (0, import_vitest.test)("methods handle multiple results correctly", async () => {
244
+ const mockResponse = [
245
+ {
246
+ data_provider: "0x1111111111111111111111111111111111111111",
247
+ stream_id: "stream-1",
248
+ child_data_provider: "0x2222222222222222222222222222222222222222",
249
+ child_stream_id: "child-1",
250
+ weight: "50.0",
251
+ created_at: 2e3,
252
+ group_sequence: 1,
253
+ start_time: 1625097600
254
+ },
255
+ {
256
+ data_provider: "0x1111111111111111111111111111111111111111",
257
+ stream_id: "stream-1",
258
+ child_data_provider: "0x3333333333333333333333333333333333333333",
259
+ child_stream_id: "child-2",
260
+ weight: "25.5",
261
+ created_at: 2e3,
262
+ group_sequence: 1,
263
+ start_time: 1625097600
264
+ }
265
+ ];
266
+ const mockClient = createMockClient(mockResponse);
267
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
268
+ const result = await composedAction.listTaxonomiesByHeight({ limit: 10 });
269
+ (0, import_vitest.expect)(result).toHaveLength(2);
270
+ (0, import_vitest.expect)(result[0].childStreamId.getId()).toBe("child-1");
271
+ (0, import_vitest.expect)(result[1].childStreamId.getId()).toBe("child-2");
272
+ (0, import_vitest.expect)(result[0].weight).toBe("50.0");
273
+ (0, import_vitest.expect)(result[1].weight).toBe("25.5");
274
+ });
275
+ (0, import_vitest.test)("methods handle address parsing correctly", async () => {
276
+ const mockResponse = [
277
+ {
278
+ data_provider: "0x1234567890abcdef1234567890abcdef12345678",
279
+ stream_id: "test-stream",
280
+ child_data_provider: "0xabcdef1234567890abcdef1234567890abcdef12",
281
+ child_stream_id: "child-stream",
282
+ weight: "100.0",
283
+ created_at: 1e3,
284
+ group_sequence: 1,
285
+ start_time: 1625097600
286
+ }
287
+ ];
288
+ const mockClient = createMockClient(mockResponse);
289
+ const composedAction = new import_composedAction.ComposedAction(mockClient, mockSigner);
290
+ const result = await composedAction.listTaxonomiesByHeight();
291
+ (0, import_vitest.expect)(result[0].dataProvider).toBeInstanceOf(import_EthereumAddress.EthereumAddress);
292
+ (0, import_vitest.expect)(result[0].streamId).toBeInstanceOf(import_StreamId.StreamId);
293
+ (0, import_vitest.expect)(result[0].childDataProvider).toBeInstanceOf(import_EthereumAddress.EthereumAddress);
294
+ (0, import_vitest.expect)(result[0].childStreamId).toBeInstanceOf(import_StreamId.StreamId);
295
+ (0, import_vitest.expect)(result[0].dataProvider.getAddress()).toBe("0x1234567890abcdef1234567890abcdef12345678");
296
+ (0, import_vitest.expect)(result[0].streamId.getId()).toBe("test-stream");
297
+ (0, import_vitest.expect)(result[0].childDataProvider.getAddress()).toBe("0xabcdef1234567890abcdef1234567890abcdef12");
298
+ (0, import_vitest.expect)(result[0].childStreamId.getId()).toBe("child-stream");
299
+ });
300
+ });
301
+ //# sourceMappingURL=composedAction.test.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/contracts-api/composedAction.test.ts"],
4
+ "sourcesContent": ["import { describe, test, expect, vi } from 'vitest'\r\nimport { ComposedAction } from './composedAction'\r\nimport { EthereumAddress } from '../util/EthereumAddress'\r\nimport { StreamId } from '../util/StreamId'\r\n\r\ndescribe('ComposedAction Taxonomy Query Methods', () => {\r\n const createMockClient = (mockResponse: any) => ({\r\n call: vi.fn().mockResolvedValue({\r\n status: 200,\r\n data: {\r\n result: mockResponse\r\n }\r\n })\r\n });\r\n\r\n const mockSigner = {};\r\n\r\n test('listTaxonomiesByHeight calls correct action with parameters', async () => {\r\n const mockResponse = [\r\n {\r\n data_provider: '0x1234567890abcdef1234567890abcdef12345678',\r\n stream_id: 'test-stream',\r\n child_data_provider: '0xabcdef1234567890abcdef1234567890abcdef12',\r\n child_stream_id: 'child-stream',\r\n weight: '100.5',\r\n created_at: 1000,\r\n group_sequence: 1,\r\n start_time: 1625097600\r\n }\r\n ];\r\n\r\n const mockClient = createMockClient(mockResponse);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const result = await composedAction.listTaxonomiesByHeight({\r\n fromHeight: 1000,\r\n toHeight: 2000,\r\n limit: 100,\r\n offset: 10,\r\n latestOnly: true\r\n });\r\n\r\n // Verify the call was made correctly\r\n expect(mockClient.call).toHaveBeenCalledWith(\r\n {\r\n namespace: \"main\",\r\n name: 'list_taxonomies_by_height',\r\n inputs: {\r\n $from_height: 1000,\r\n $to_height: 2000,\r\n $limit: 100,\r\n $offset: 10,\r\n $latest_only: true,\r\n }\r\n },\r\n {}\r\n );\r\n\r\n // Verify response mapping\r\n expect(result).toHaveLength(1);\r\n expect(result[0].dataProvider.getAddress()).toBe('0x1234567890abcdef1234567890abcdef12345678');\r\n expect(result[0].streamId.getId()).toBe('test-stream');\r\n expect(result[0].childDataProvider.getAddress()).toBe('0xabcdef1234567890abcdef1234567890abcdef12');\r\n expect(result[0].childStreamId.getId()).toBe('child-stream');\r\n expect(result[0].weight).toBe('100.5');\r\n expect(result[0].createdAt).toBe(1000);\r\n expect(result[0].groupSequence).toBe(1);\r\n expect(result[0].startTime).toBe(1625097600);\r\n });\r\n\r\n test('listTaxonomiesByHeight handles default parameters', async () => {\r\n const mockClient = createMockClient([]);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n await composedAction.listTaxonomiesByHeight({});\r\n\r\n expect(mockClient.call).toHaveBeenCalledWith(\r\n {\r\n namespace: \"main\",\r\n name: 'list_taxonomies_by_height',\r\n inputs: {\r\n $from_height: null,\r\n $to_height: null,\r\n $limit: null,\r\n $offset: null,\r\n $latest_only: null,\r\n }\r\n },\r\n {}\r\n );\r\n });\r\n\r\n test('listTaxonomiesByHeight handles empty parameters', async () => {\r\n const mockClient = createMockClient([]);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n await composedAction.listTaxonomiesByHeight();\r\n\r\n expect(mockClient.call).toHaveBeenCalledWith(\r\n {\r\n namespace: \"main\",\r\n name: 'list_taxonomies_by_height',\r\n inputs: {\r\n $from_height: null,\r\n $to_height: null,\r\n $limit: null,\r\n $offset: null,\r\n $latest_only: null,\r\n }\r\n },\r\n {}\r\n );\r\n });\r\n\r\n test('getTaxonomiesForStreams calls correct action with stream arrays', async () => {\r\n const mockResponse = [\r\n {\r\n data_provider: '0x1111111111111111111111111111111111111111',\r\n stream_id: 'stream-1',\r\n child_data_provider: '0x2222222222222222222222222222222222222222',\r\n child_stream_id: 'child-1',\r\n weight: '50.0',\r\n created_at: 2000,\r\n group_sequence: 2,\r\n start_time: 1625097700\r\n }\r\n ];\r\n\r\n const mockClient = createMockClient(mockResponse);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const testStreams = [\r\n {\r\n dataProvider: EthereumAddress.fromString('0x1111111111111111111111111111111111111111').throw(),\r\n streamId: StreamId.fromString('stream-1').throw()\r\n },\r\n {\r\n dataProvider: EthereumAddress.fromString('0x3333333333333333333333333333333333333333').throw(),\r\n streamId: StreamId.fromString('stream-2').throw()\r\n }\r\n ];\r\n\r\n const result = await composedAction.getTaxonomiesForStreams({\r\n streams: testStreams,\r\n latestOnly: false\r\n });\r\n\r\n // Verify the call was made correctly\r\n expect(mockClient.call).toHaveBeenCalledWith(\r\n {\r\n namespace: \"main\",\r\n name: 'get_taxonomies_for_streams',\r\n inputs: {\r\n $data_providers: [\r\n '0x1111111111111111111111111111111111111111',\r\n '0x3333333333333333333333333333333333333333'\r\n ],\r\n $stream_ids: ['stream-1', 'stream-2'],\r\n $latest_only: false,\r\n }\r\n },\r\n {}\r\n );\r\n\r\n // Verify response mapping\r\n expect(result).toHaveLength(1);\r\n expect(result[0].dataProvider.getAddress()).toBe('0x1111111111111111111111111111111111111111');\r\n expect(result[0].streamId.getId()).toBe('stream-1');\r\n expect(result[0].weight).toBe('50.0');\r\n });\r\n\r\n test('getTaxonomiesForStreams handles empty stream array', async () => {\r\n const mockClient = createMockClient([]);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const result = await composedAction.getTaxonomiesForStreams({\r\n streams: [],\r\n latestOnly: true\r\n });\r\n\r\n // Should return empty array without making network call\r\n expect(mockClient.call).not.toHaveBeenCalled();\r\n expect(result).toEqual([]);\r\n });\r\n\r\n test('getTaxonomiesForStreams handles latestOnly parameter', async () => {\r\n const mockClient = createMockClient([]);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const testStreams = [\r\n {\r\n dataProvider: EthereumAddress.fromString('0x1111111111111111111111111111111111111111').throw(),\r\n streamId: StreamId.fromString('stream-1').throw()\r\n }\r\n ];\r\n\r\n await composedAction.getTaxonomiesForStreams({\r\n streams: testStreams,\r\n latestOnly: true\r\n });\r\n\r\n expect(mockClient.call).toHaveBeenCalledWith(\r\n {\r\n namespace: \"main\",\r\n name: 'get_taxonomies_for_streams',\r\n inputs: expect.objectContaining({\r\n $latest_only: true,\r\n })\r\n },\r\n {}\r\n );\r\n });\r\n\r\n test('getTaxonomiesForStreams handles default latestOnly parameter', async () => {\r\n const mockClient = createMockClient([]);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const testStreams = [\r\n {\r\n dataProvider: EthereumAddress.fromString('0x1111111111111111111111111111111111111111').throw(),\r\n streamId: StreamId.fromString('stream-1').throw()\r\n }\r\n ];\r\n\r\n await composedAction.getTaxonomiesForStreams({\r\n streams: testStreams\r\n });\r\n\r\n expect(mockClient.call).toHaveBeenCalledWith(\r\n {\r\n namespace: \"main\",\r\n name: 'get_taxonomies_for_streams',\r\n inputs: expect.objectContaining({\r\n $latest_only: null,\r\n })\r\n },\r\n {}\r\n );\r\n });\r\n\r\n test('listTaxonomiesByHeight handles network error', async () => {\r\n const mockClient = {\r\n call: vi.fn().mockResolvedValue({\r\n status: 500,\r\n data: null\r\n })\r\n };\r\n\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n await expect(\r\n composedAction.listTaxonomiesByHeight({\r\n fromHeight: 1000,\r\n toHeight: 2000\r\n })\r\n ).rejects.toThrow();\r\n });\r\n\r\n test('getTaxonomiesForStreams handles network error', async () => {\r\n const mockClient = {\r\n call: vi.fn().mockResolvedValue({\r\n status: 404,\r\n data: null\r\n })\r\n };\r\n\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const testStreams = [\r\n {\r\n dataProvider: EthereumAddress.fromString('0x1111111111111111111111111111111111111111').throw(),\r\n streamId: StreamId.fromString('stream-1').throw()\r\n }\r\n ];\r\n\r\n await expect(\r\n composedAction.getTaxonomiesForStreams({\r\n streams: testStreams\r\n })\r\n ).rejects.toThrow();\r\n });\r\n\r\n test('methods handle multiple results correctly', async () => {\r\n const mockResponse = [\r\n {\r\n data_provider: '0x1111111111111111111111111111111111111111',\r\n stream_id: 'stream-1',\r\n child_data_provider: '0x2222222222222222222222222222222222222222',\r\n child_stream_id: 'child-1',\r\n weight: '50.0',\r\n created_at: 2000,\r\n group_sequence: 1,\r\n start_time: 1625097600\r\n },\r\n {\r\n data_provider: '0x1111111111111111111111111111111111111111',\r\n stream_id: 'stream-1',\r\n child_data_provider: '0x3333333333333333333333333333333333333333',\r\n child_stream_id: 'child-2',\r\n weight: '25.5',\r\n created_at: 2000,\r\n group_sequence: 1,\r\n start_time: 1625097600\r\n }\r\n ];\r\n\r\n const mockClient = createMockClient(mockResponse);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const result = await composedAction.listTaxonomiesByHeight({ limit: 10 });\r\n\r\n expect(result).toHaveLength(2);\r\n expect(result[0].childStreamId.getId()).toBe('child-1');\r\n expect(result[1].childStreamId.getId()).toBe('child-2');\r\n expect(result[0].weight).toBe('50.0');\r\n expect(result[1].weight).toBe('25.5');\r\n });\r\n\r\n test('methods handle address parsing correctly', async () => {\r\n const mockResponse = [\r\n {\r\n data_provider: '0x1234567890abcdef1234567890abcdef12345678',\r\n stream_id: 'test-stream',\r\n child_data_provider: '0xabcdef1234567890abcdef1234567890abcdef12',\r\n child_stream_id: 'child-stream',\r\n weight: '100.0',\r\n created_at: 1000,\r\n group_sequence: 1,\r\n start_time: 1625097600\r\n }\r\n ];\r\n\r\n const mockClient = createMockClient(mockResponse);\r\n const composedAction = new ComposedAction(mockClient as any, mockSigner as any);\r\n\r\n const result = await composedAction.listTaxonomiesByHeight();\r\n\r\n expect(result[0].dataProvider).toBeInstanceOf(EthereumAddress);\r\n expect(result[0].streamId).toBeInstanceOf(StreamId);\r\n expect(result[0].childDataProvider).toBeInstanceOf(EthereumAddress);\r\n expect(result[0].childStreamId).toBeInstanceOf(StreamId);\r\n \r\n expect(result[0].dataProvider.getAddress()).toBe('0x1234567890abcdef1234567890abcdef12345678');\r\n expect(result[0].streamId.getId()).toBe('test-stream');\r\n expect(result[0].childDataProvider.getAddress()).toBe('0xabcdef1234567890abcdef1234567890abcdef12');\r\n expect(result[0].childStreamId.getId()).toBe('child-stream');\r\n });\r\n});"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.common.ts"],
4
- "sourcesContent": ["// Core client types\nexport type { TNClientOptions } from \"./client/client\";\nexport type { SignerInfo as EthProvider } from \"./client/client\";\n\n// Stream types and interfaces\nexport type { StreamLocator } from \"./types/stream\";\nexport type { StreamRecord } from \"./contracts-api/action\";\nexport type { GetRecordInput, GetFirstRecordInput } from \"./contracts-api/action\";\nexport type { InsertRecordInput } from \"./contracts-api/primitiveAction\";\nexport type { TaxonomySet, TaxonomyItem } from \"./contracts-api/composedAction\";\n\n// Utility types and classes\nexport { StreamId } from \"./util/StreamId\";\nexport { EthereumAddress } from \"./util/EthereumAddress\";\nexport { visibility } from \"./util/visibility\";\nexport type { VisibilityEnum } from \"./util/visibility\";\n\n// Stream type constants\nexport { StreamType } from \"./contracts-api/contractValues\";\n\n// Base classes\nexport { Action } from \"./contracts-api/action\";\nexport { PrimitiveAction } from \"./contracts-api/primitiveAction\";\nexport { ComposedAction } from \"./contracts-api/composedAction\";\n\n// Role management exports\nexport { RoleManagement } from \"./contracts-api/roleManagement\";\nexport type { GrantRoleInput, RevokeRoleInput, AreMembersOfInput, WalletMembership } from \"./types/role\";\n\n"],
4
+ "sourcesContent": ["// Core client types\nexport type { TNClientOptions } from \"./client/client\";\nexport type { SignerInfo as EthProvider } from \"./client/client\";\n\n// Stream types and interfaces\nexport type { StreamLocator } from \"./types/stream\";\nexport type { StreamRecord } from \"./contracts-api/action\";\nexport type { GetRecordInput, GetFirstRecordInput } from \"./contracts-api/action\";\nexport type { InsertRecordInput } from \"./contracts-api/primitiveAction\";\nexport type { TaxonomySet, TaxonomyItem, ListTaxonomiesByHeightParams, GetTaxonomiesForStreamsParams, TaxonomyQueryResult } from \"./contracts-api/composedAction\";\n\n// Utility types and classes\nexport { StreamId } from \"./util/StreamId\";\nexport { EthereumAddress } from \"./util/EthereumAddress\";\nexport { visibility } from \"./util/visibility\";\nexport type { VisibilityEnum } from \"./util/visibility\";\n\n// Stream type constants\nexport { StreamType } from \"./contracts-api/contractValues\";\n\n// Base classes\nexport { Action } from \"./contracts-api/action\";\nexport { PrimitiveAction } from \"./contracts-api/primitiveAction\";\nexport { ComposedAction } from \"./contracts-api/composedAction\";\n\n// Role management exports\nexport { RoleManagement } from \"./contracts-api/roleManagement\";\nexport type { GrantRoleInput, RevokeRoleInput, AreMembersOfInput, WalletMembership } from \"./types/role\";\n\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYA,sBAAyB;AACzB,6BAAgC;AAChC,wBAA2B;AAI3B,4BAA2B;AAG3B,oBAAuB;AACvB,6BAAgC;AAChC,4BAA+B;AAG/B,4BAA+B;",
6
6
  "names": []
7
7
  }