@trufnetwork/sdk-js 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/cjs/client/client.cjs +11 -0
  2. package/dist/cjs/client/client.cjs.map +2 -2
  3. package/dist/cjs/contracts-api/action.cjs +3 -1
  4. package/dist/cjs/contracts-api/action.cjs.map +2 -2
  5. package/dist/cjs/contracts-api/attestationAction.cjs +9 -4
  6. package/dist/cjs/contracts-api/attestationAction.cjs.map +2 -2
  7. package/dist/cjs/contracts-api/transactionAction.cjs +139 -0
  8. package/dist/cjs/contracts-api/transactionAction.cjs.map +7 -0
  9. package/dist/cjs/types/attestation.cjs +2 -1
  10. package/dist/cjs/types/attestation.cjs.map +2 -2
  11. package/dist/cjs/types/transaction.cjs.map +1 -1
  12. package/dist/esm/client/client.mjs +11 -0
  13. package/dist/esm/client/client.mjs.map +2 -2
  14. package/dist/esm/contracts-api/action.mjs +3 -1
  15. package/dist/esm/contracts-api/action.mjs.map +2 -2
  16. package/dist/esm/contracts-api/attestationAction.mjs +9 -4
  17. package/dist/esm/contracts-api/attestationAction.mjs.map +2 -2
  18. package/dist/esm/contracts-api/transactionAction.mjs +122 -0
  19. package/dist/esm/contracts-api/transactionAction.mjs.map +7 -0
  20. package/dist/esm/types/attestation.mjs +2 -1
  21. package/dist/esm/types/attestation.mjs.map +2 -2
  22. package/dist/tsconfig.build.tsbuildinfo +1 -1
  23. package/dist/types/client/client.d.ts +6 -0
  24. package/dist/types/client/client.d.ts.map +1 -1
  25. package/dist/types/contracts-api/action.d.ts +2 -1
  26. package/dist/types/contracts-api/action.d.ts.map +1 -1
  27. package/dist/types/contracts-api/attestationAction.d.ts.map +1 -1
  28. package/dist/types/contracts-api/transactionAction.d.ts +36 -0
  29. package/dist/types/contracts-api/transactionAction.d.ts.map +1 -0
  30. package/dist/types/types/attestation.d.ts +4 -2
  31. package/dist/types/types/attestation.d.ts.map +1 -1
  32. package/dist/types/types/transaction.d.ts +59 -0
  33. package/dist/types/types/transaction.d.ts.map +1 -1
  34. package/package.json +2 -2
@@ -34,6 +34,7 @@ var import_listStreams = require("./listStreams.cjs");
34
34
  var import_getLastTransactions = require("./getLastTransactions.cjs");
35
35
  var import_roleManagement = require("../contracts-api/roleManagement.cjs");
36
36
  var import_attestationAction = require("../contracts-api/attestationAction.cjs");
37
+ var import_transactionAction = require("../contracts-api/transactionAction.cjs");
37
38
  var BaseTNClient = class {
38
39
  kwilClient;
39
40
  signerInfo;
@@ -173,6 +174,16 @@ var BaseTNClient = class {
173
174
  this.getKwilSigner()
174
175
  );
175
176
  }
177
+ /**
178
+ * Loads the transaction action API, permitting transaction ledger queries.
179
+ * @returns An instance of TransactionAction.
180
+ */
181
+ loadTransactionAction() {
182
+ return new import_transactionAction.TransactionAction(
183
+ this.getKwilClient(),
184
+ this.getKwilSigner()
185
+ );
186
+ }
176
187
  /**
177
188
  * Creates a new stream locator.
178
189
  * @param streamId - The ID of the stream.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client/client.ts"],
4
- "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil, Types, EnvironmentType } from \"@trufnetwork/kwil-js\";\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, ListMetadataByHeightParams, MetadataQueryResult } 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 { AttestationAction } from \"../contracts-api/attestationAction\";\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: Types.EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<Types.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: Types.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<Types.TxInfoReceipt> {\n return new Promise<Types.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(): Types.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<Types.GenericResponse<Types.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<Types.GenericResponse<Types.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 * Loads the attestation action API, permitting attestation operations.\n * @returns An instance of AttestationAction.\n */\n loadAttestationAction(): AttestationAction {\n return new AttestationAction(\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 async listMetadataByHeight(params: ListMetadataByHeightParams = {}): Promise<MetadataQueryResult[]> {\n const action = this.loadAction();\n return action.listMetadataByHeight(params);\n }\n\n async getWalletBalance(chain: string, walletAddress: string) {\n const action = this.loadAction();\n return action.getWalletBalance(chain, walletAddress);\n }\n\n /**\n * Performs a withdrawal operation by bridging tokens\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param amount The amount to withdraw\n * @returns Promise that resolves to the transaction hash, or throws on error\n */\n async withdraw(chain: string, amount: string, recipient: string): Promise<string> {\n const action = this.loadAction();\n \n // Bridge tokens in a single operation\n const bridgeResult = await action.bridgeTokens(chain, amount, recipient);\n if (!bridgeResult.data?.tx_hash) {\n throw new Error(\"Bridge tokens operation failed: no transaction hash returned\");\n }\n \n // Wait for bridge transaction to be mined - let waitForTx errors bubble up\n try {\n await this.waitForTx(bridgeResult.data.tx_hash);\n } catch (error) {\n throw new Error(`Bridge tokens transaction failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n \n // Return the transaction hash\n return bridgeResult.data.tx_hash;\n }\n\n /**\n * Lists wallet rewards for a specific wallet address on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param wallet The wallet address to list rewards for\n * @param withPending Whether to include pending rewards\n * @returns Promise that resolves to an array of rewards data\n */\n async listWalletRewards(chain: string, wallet: string, withPending: boolean): Promise<any[]> {\n const action = this.loadAction();\n return action.listWalletRewards(chain, wallet, withPending);\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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",
4
+ "sourcesContent": ["import { Client, KwilSigner, NodeKwil, WebKwil, Types, EnvironmentType } from \"@trufnetwork/kwil-js\";\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, ListMetadataByHeightParams, MetadataQueryResult } 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 { AttestationAction } from \"../contracts-api/attestationAction\";\nimport { TransactionAction } from \"../contracts-api/transactionAction\";\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: Types.EthSigner;\n}\n\nexport type TNClientOptions = {\n endpoint: string;\n signerInfo: SignerInfo;\n} & Omit<Types.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: Types.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<Types.TxInfoReceipt> {\n return new Promise<Types.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(): Types.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<Types.GenericResponse<Types.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<Types.GenericResponse<Types.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 * Loads the attestation action API, permitting attestation operations.\n * @returns An instance of AttestationAction.\n */\n loadAttestationAction(): AttestationAction {\n return new AttestationAction(\n this.getKwilClient() as WebKwil | NodeKwil,\n this.getKwilSigner(),\n );\n }\n\n /**\n * Loads the transaction action API, permitting transaction ledger queries.\n * @returns An instance of TransactionAction.\n */\n loadTransactionAction(): TransactionAction {\n return new TransactionAction(\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 async listMetadataByHeight(params: ListMetadataByHeightParams = {}): Promise<MetadataQueryResult[]> {\n const action = this.loadAction();\n return action.listMetadataByHeight(params);\n }\n\n async getWalletBalance(chain: string, walletAddress: string) {\n const action = this.loadAction();\n return action.getWalletBalance(chain, walletAddress);\n }\n\n /**\n * Performs a withdrawal operation by bridging tokens\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param amount The amount to withdraw\n * @returns Promise that resolves to the transaction hash, or throws on error\n */\n async withdraw(chain: string, amount: string, recipient: string): Promise<string> {\n const action = this.loadAction();\n \n // Bridge tokens in a single operation\n const bridgeResult = await action.bridgeTokens(chain, amount, recipient);\n if (!bridgeResult.data?.tx_hash) {\n throw new Error(\"Bridge tokens operation failed: no transaction hash returned\");\n }\n \n // Wait for bridge transaction to be mined - let waitForTx errors bubble up\n try {\n await this.waitForTx(bridgeResult.data.tx_hash);\n } catch (error) {\n throw new Error(`Bridge tokens transaction failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n \n // Return the transaction hash\n return bridgeResult.data.tx_hash;\n }\n\n /**\n * Lists wallet rewards for a specific wallet address on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param wallet The wallet address to list rewards for\n * @param withPending Whether to include pending rewards\n * @returns Promise that resolves to an array of rewards data\n */\n async listWalletRewards(chain: string, wallet: string, withPending: boolean): Promise<any[]> {\n const action = this.loadAction();\n return action.listWalletRewards(chain, wallet, withPending);\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
  }
@@ -49,14 +49,16 @@ var Action = class _Action {
49
49
  * Executes a stream method with named parameters
50
50
  * @param method - The action name to execute
51
51
  * @param inputs - Named parameters for the action
52
+ * @param types - Optional type specifications for parameters (e.g., NUMERIC)
52
53
  * @returns Transaction receipt
53
54
  */
54
- async executeWithNamedParams(method, inputs) {
55
+ async executeWithNamedParams(method, inputs, types) {
55
56
  return this.kwilClient.execute(
56
57
  {
57
58
  namespace: "main",
58
59
  name: method,
59
60
  inputs,
61
+ types,
60
62
  description: `TN SDK - Executing method on stream: ${method}`
61
63
  },
62
64
  this.kwilSigner
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contracts-api/action.ts"],
4
- "sourcesContent": ["import {KwilSigner, NodeKwil, WebKwil, Types} from \"@trufnetwork/kwil-js\";\nimport { Either } from \"monads-io\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { CacheAwareResponse, GetRecordOptions, GetIndexOptions, GetIndexChangeOptions, GetFirstRecordOptions } from \"../types/cache\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { head } from \"../util/head\";\nimport { StreamId } from \"../util/StreamId\";\nimport { toVisibilityEnum, VisibilityEnum } from \"../util/visibility\";\nimport { CacheMetadataParser } from \"../util/cacheMetadataParser\";\nimport { CacheValidation } from \"../util/cacheValidation\";\nimport {\n MetadataKey,\n MetadataKeyValueMap,\n MetadataTableKey,\n MetadataValueTypeForKey,\n StreamType,\n} from \"./contractValues\";\n// ValueType is available as Types.ValueType\n\nexport interface GetRecordInput {\n stream: StreamLocator;\n from?: number;\n to?: number;\n frozenAt?: number;\n baseTime?: DateString | number;\n prefix?: string;\n}\n\nexport interface GetFirstRecordInput {\n stream: StreamLocator;\n after?: number;\n frozenAt?: number;\n}\n\nexport interface StreamRecord {\n eventTime: number;\n value: string;\n}\n\nexport interface GetIndexChangeInput extends GetRecordInput {\n timeInterval: number;\n}\n\nexport interface ListMetadataByHeightParams {\n /** Key reference filter. Default: empty string */\n key?: string;\n /** Value reference filter. Default: null */\n value?: string;\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}\n\nexport interface MetadataQueryResult {\n streamId: string;\n dataProvider: string;\n rowId: string;\n valueInt: number | null;\n valueFloat: string | null;\n valueBoolean: boolean | null;\n valueString: string | null;\n valueRef: string | null;\n createdAt: number;\n}\n\nexport class Action {\n protected kwilClient: WebKwil | NodeKwil;\n protected kwilSigner: KwilSigner;\n /** Track if deprecation warnings were already emitted */\n private static _legacyWarnEmitted: Record<string, boolean> = {\n getRecord: false,\n getIndex: false,\n getFirstRecord: false,\n getIndexChange: false,\n };\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n this.kwilClient = kwilClient;\n this.kwilSigner = kwilSigner;\n }\n\n /**\n * Executes a stream method with named parameters\n * @param method - The action name to execute\n * @param inputs - Named parameters for the action\n * @returns Transaction receipt\n */\n protected async executeWithNamedParams(\n method: string,\n inputs: Types.NamedParams[],\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute({\n namespace: \"main\",\n name: method,\n inputs,\n description: `TN SDK - Executing method on stream: ${method}`,\n },\n this.kwilSigner,\n );\n }\n\n /**\n * Executes a stream action with a complete ActionBody\n * @param inputs - Complete action body with all execution parameters\n * @param synchronous - Whether to wait for transaction to be mined\n * @returns Transaction receipt\n */\n protected async executeWithActionBody(\n inputs: Types.ActionBody,\n synchronous: boolean = false,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute(inputs, this.kwilSigner, synchronous);\n }\n\n /**\n * Calls a method on the stream\n */\n protected async call<T>(\n method: string,\n inputs: Types.NamedParams,\n ): Promise<Either<number, T>> {\n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: method,\n inputs: inputs,\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n return Either.left(result.status);\n }\n\n return Either.right(result.data?.result as T);\n }\n\n /**\n * @deprecated Use getRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getRecord(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getRecord(stream: StreamLocator, options?: GetRecordOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getRecord(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetRecordOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n // emit deprecation warning once\n if (!Action._legacyWarnEmitted.getRecord) {\n Action._legacyWarnEmitted.getRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getRecord(input). Use getRecord(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetRecordOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get record: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined,\n };\n }\n\n /**\n * Returns the index of the stream within the given date range\n * @deprecated Use getIndex(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getIndex(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getIndex(stream: StreamLocator, options?: GetIndexOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndex(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetIndexOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n if (!Action._legacyWarnEmitted.getIndex) {\n Action._legacyWarnEmitted.getIndex = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndex(input). Use getIndex(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_index\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetIndexOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n $base_time: options?.baseTime,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_index\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * Returns the type of the stream\n */\n public async getType(\n stream: StreamLocator,\n ): Promise<StreamType> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.TypeKey);\n\n if (!result) {\n throw new Error(\"Failed to get stream type\");\n }\n\n const type = head(result).unwrapOrElse(() => {\n throw new Error(\n \"Failed to get stream type. Check if the stream is initialized.\",\n );\n });\n\n const validTypes = [StreamType.Primitive, StreamType.Composed];\n\n if (!validTypes.includes(type.value as StreamType)) {\n throw new Error(`Invalid stream type: ${type.value}`);\n }\n\n return type.value as StreamType;\n }\n\n /**\n * Returns the first record of the stream\n * @deprecated Use getFirstRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getFirstRecord(\n input: GetFirstRecordInput,\n ): Promise<StreamRecord | null>;\n public async getFirstRecord(\n stream: StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<CacheAwareResponse<StreamRecord | null>>;\n public async getFirstRecord(\n inputOrStream: GetFirstRecordInput | StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<StreamRecord | null | CacheAwareResponse<StreamRecord | null>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetFirstRecordInput;\n if (!Action._legacyWarnEmitted.getFirstRecord) {\n Action._legacyWarnEmitted.getFirstRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getFirstRecord(input). Use getFirstRecord(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_first_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $after: input.after,\n $frozen_at: input.frozenAt,\n }\n );\n\n return result\n .mapRight(head)\n .mapRight((result) =>\n result\n .map((result) => ({\n eventTime: result.event_time,\n value: result.value,\n }))\n .unwrapOr(null),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetFirstRecordOptions(options);\n }\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $after: options?.after,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_first_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get first record: ${result.status}`);\n }\n \n const rawData = result.data?.result as { event_time: number; value: string }[];\n const data = rawData && rawData.length > 0 ? {\n eventTime: rawData[0].event_time,\n value: rawData[0].value,\n } : null;\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n frozenAt: options?.frozenAt,\n rowsServed: data ? 1 : 0\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n protected async setMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n value: MetadataValueTypeForKey<K>,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"insert_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $value: value,\n $val_type: MetadataKeyValueMap[key],\n },\n ]);\n }\n\n protected async getMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n // onlyLatest: boolean = true,\n filteredRef?: string,\n limit?: number,\n offset?: number,\n orderBy?: string,\n ): Promise<\n { rowId: string; value: MetadataValueTypeForKey<K>; createdAt: number }[]\n > {\n const result = await this.call<\n {\n row_id: string;\n value_i: number;\n value_f: string;\n value_b: boolean;\n value_s: string;\n value_ref: string;\n created_at: number;\n }[]\n >(\"get_metadata\", {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $ref: filteredRef,\n $limit: limit,\n $offset: offset,\n $order_by: orderBy,\n },\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n rowId: row.row_id,\n value: row[\n MetadataTableKey[MetadataKeyValueMap[key as MetadataKey]]\n ] as MetadataValueTypeForKey<K>,\n createdAt: row.created_at,\n })),\n )\n .throw();\n }\n\n public async listMetadataByHeight<K extends MetadataKey>(\n params: ListMetadataByHeightParams = {},\n ): Promise<MetadataQueryResult[]> {\n type MetadataRawResult = {\n stream_id: string;\n data_provider: string;\n row_id: string;\n value_i: number | null;\n value_f: string | null;\n value_b: boolean | null;\n value_s: string | null;\n value_ref: string | null;\n created_at: number;\n }[];\n const result = await this.call<MetadataRawResult>(\n \"list_metadata_by_height\",\n {\n $key: params.key ?? \"\",\n $ref: params.value ?? null,\n $from_height: params.fromHeight ?? null,\n $to_height: params.toHeight ?? null,\n $limit: params.limit ?? null,\n $offset: params.offset ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n streamId: record.stream_id,\n dataProvider: record.data_provider,\n rowId: record.row_id,\n valueInt: record.value_i,\n valueFloat: record.value_f,\n valueBoolean: record.value_b,\n valueString: record.value_s,\n valueRef: record.value_ref,\n createdAt: record.created_at,\n }))\n )\n .throw();\n }\n\n /**\n * Sets the read visibility of the stream\n */\n public async setReadVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ReadVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the read visibility of the stream\n */\n public async getReadVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ReadVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Sets the compose visibility of the stream\n */\n public async setComposeVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the compose visibility of the stream\n */\n public async getComposeVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Allows a wallet to read the stream\n */\n public async allowReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n }\n\n /**\n * Disables a wallet from reading the stream\n */\n public async disableReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Wallet not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n /**\n * Allows a stream to use this stream as child\n */\n public async allowComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.streamId.getId(),\n );\n }\n\n /**\n * Disables a stream from using this stream as child\n */\n public async disableComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.toString(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Stream not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n protected async disableMetadata(\n stream: StreamLocator,\n rowId: string,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"disable_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $row_id: rowId,\n }]);\n }\n\n /**\n * Returns the wallets allowed to read the stream\n */\n public async getAllowedReadWallets(\n stream: StreamLocator,\n ): Promise<EthereumAddress[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => new EthereumAddress(row.value));\n }\n\n /**\n * Returns the streams allowed to compose the stream\n */\n public async getAllowedComposeStreams(\n stream: StreamLocator,\n ): Promise<StreamLocator[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => {\n const [streamId, dataProvider] = row.value.split(\":\");\n return {\n streamId: StreamId.fromString(streamId).throw(),\n dataProvider: new EthereumAddress(dataProvider),\n };\n });\n }\n\n /**\n * Returns the index change of the stream within the given date range\n * @deprecated Use getIndexChange(stream, options) to leverage cache support and future-proof parameter handling.\n */\n public async getIndexChange(\n input: GetIndexChangeInput,\n ): Promise<StreamRecord[]>;\n public async getIndexChange(\n stream: StreamLocator,\n options: GetIndexChangeOptions\n ): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndexChange(\n inputOrStream: GetIndexChangeInput | StreamLocator,\n options?: GetIndexChangeOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetIndexChangeInput;\n if (!Action._legacyWarnEmitted.getIndexChange) {\n Action._legacyWarnEmitted.getIndexChange = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndexChange(input). Use getIndexChange(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_index_change\", \n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n $time_interval: input.timeInterval,\n }\n );\n\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n if (!options) {\n throw new Error('Options parameter is required for cache-aware getIndexChange');\n }\n \n // Validate options\n CacheValidation.validateGetIndexChangeOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options.from,\n $to: options.to,\n $frozen_at: options.frozenAt,\n $base_time: options.baseTime,\n $time_interval: options.timeInterval,\n };\n \n if (options.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_index_change\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index change: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options.from,\n to: options.to,\n frozenAt: options.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * A custom method that accepts the procedure name and the input of GetRecordInput\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_price\" that returns a list of date_value and value\n * can be called with customGetProcedure(\"get_price\", { dateFrom: \"2021-01-01\", dateTo: \"2021-01-31\" })\n */\n public async customGetProcedure(\n procedure: string,\n input: GetRecordInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n\n /**\n * A custom method that accepts the procedure name and custom input of type Record<string, any>\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_custom_index\" that returns a list of date_value and value\n * can be called with customProcedureWithArgs(\"get_custom_index\", { $customArg1: \"value1\", $customArg2: \"value2\" })\n * where $customArg1 and $customArg2 are the arguments of the procedure\n * @param procedure\n * @param args\n */\n public async customProcedureWithArgs(\n procedure: string,\n args: Record<string, Types.ValueType | Types.ValueType[]>,\n ){\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n args\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the size of database\n */\n public async getDatabaseSize(): Promise<BigInt> {\n const result = await this.call<{ database_size: BigInt }[]>(\"get_database_size_v2\", {})\n return result\n .map((rows) => {\n const raw = rows[0].database_size;\n const asBigInt = BigInt(raw.toString());\n return asBigInt;\n }).throw();\n }\n\n /**\n * Returns the size of database in human-readable format (e.g., \"22 GB\", \"1.5 TB\")\n */\n public async getDatabaseSizePretty(): Promise<string> {\n const result = await this.call<{ database_size_pretty: string }[]>(\"get_database_size_v2_pretty\", {})\n return result\n .map((rows) => rows[0].database_size_pretty)\n .throw();\n }\n\n /**\n * Gets the wallet balance on any supported blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param walletAddress The wallet address to check balance for\n * @returns Promise that resolves to the balance as a string, or throws on error\n */\n public async getWalletBalance(\n chain: string,\n walletAddress: string\n ): Promise<string> {\n const result = await this.call<{ balance?: string; }[]>(\n `${chain}_wallet_balance`,\n {\n $wallet_address: walletAddress,\n }\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"You don't have necessary permissions to execute this query\");\n }\n \n const row = rows[0];\n \n if (row.balance === undefined) {\n throw new Error(\"No balance returned from wallet balance query\");\n }\n \n return row.balance;\n })\n .throw();\n }\n\n /**\n * Calls the whoami action to get the caller's wallet address\n * This is useful for verifying wallet authentication with TN\n * @returns Promise that resolves to the caller's wallet address\n */\n public async whoami(): Promise<string> {\n const result = await this.call<{ caller: string }[]>(\n \"whoami\",\n {}\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"No response from whoami action\");\n }\n \n const row = rows[0];\n \n if (!row.caller) {\n throw new Error(\"No caller address returned from whoami\");\n }\n \n return row.caller;\n })\n .throw();\n }\n\n /**\n * Bridges tokens on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param amount The amount to bridge\n * @returns Promise that resolves to GenericResponse<TxReceipt>\n */\n public async bridgeTokens(\n chain: string,\n amount: string,\n recipient: string\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n // Validate amount is greater than 0\n const numAmount = parseFloat(amount);\n if (isNaN(numAmount) || numAmount <= 0) {\n throw new Error(`Invalid amount: ${amount}. Amount must be greater than 0.`);\n }\n\n return await this.executeWithNamedParams(`${chain}_bridge_tokens`, [{\n $recipient: recipient,\n $amount: amount\n }]);\n }\n\n /**\n * Lists wallet rewards on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param wallet The wallet address to list rewards for\n * @param withPending Whether to include pending rewards\n * @returns Promise that resolves to the rewards data\n */\n public async listWalletRewards(\n chain: string,\n wallet: string,\n withPending: boolean\n ): Promise<any[]> {\n const result = await this.kwilClient.call(\n {\n namespace: `${chain}_bridge`,\n name: \"list_wallet_rewards\",\n inputs: {\n $param_1: wallet,\n $param_2: withPending,\n },\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n throw new Error(`Failed to list wallet rewards: ${result.status}`);\n }\n\n return result.data?.result || [];\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {KwilSigner, NodeKwil, WebKwil, Types} from \"@trufnetwork/kwil-js\";\nimport { Either } from \"monads-io\";\nimport { DateString } from \"../types/other\";\nimport { StreamLocator } from \"../types/stream\";\nimport { CacheAwareResponse, GetRecordOptions, GetIndexOptions, GetIndexChangeOptions, GetFirstRecordOptions } from \"../types/cache\";\nimport { EthereumAddress } from \"../util/EthereumAddress\";\nimport { head } from \"../util/head\";\nimport { StreamId } from \"../util/StreamId\";\nimport { toVisibilityEnum, VisibilityEnum } from \"../util/visibility\";\nimport { CacheMetadataParser } from \"../util/cacheMetadataParser\";\nimport { CacheValidation } from \"../util/cacheValidation\";\nimport {\n MetadataKey,\n MetadataKeyValueMap,\n MetadataTableKey,\n MetadataValueTypeForKey,\n StreamType,\n} from \"./contractValues\";\n// ValueType is available as Types.ValueType\n\nexport interface GetRecordInput {\n stream: StreamLocator;\n from?: number;\n to?: number;\n frozenAt?: number;\n baseTime?: DateString | number;\n prefix?: string;\n}\n\nexport interface GetFirstRecordInput {\n stream: StreamLocator;\n after?: number;\n frozenAt?: number;\n}\n\nexport interface StreamRecord {\n eventTime: number;\n value: string;\n}\n\nexport interface GetIndexChangeInput extends GetRecordInput {\n timeInterval: number;\n}\n\nexport interface ListMetadataByHeightParams {\n /** Key reference filter. Default: empty string */\n key?: string;\n /** Value reference filter. Default: null */\n value?: string;\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}\n\nexport interface MetadataQueryResult {\n streamId: string;\n dataProvider: string;\n rowId: string;\n valueInt: number | null;\n valueFloat: string | null;\n valueBoolean: boolean | null;\n valueString: string | null;\n valueRef: string | null;\n createdAt: number;\n}\n\nexport class Action {\n protected kwilClient: WebKwil | NodeKwil;\n protected kwilSigner: KwilSigner;\n /** Track if deprecation warnings were already emitted */\n private static _legacyWarnEmitted: Record<string, boolean> = {\n getRecord: false,\n getIndex: false,\n getFirstRecord: false,\n getIndexChange: false,\n };\n constructor(\n kwilClient: WebKwil | NodeKwil,\n kwilSigner: KwilSigner,\n ) {\n this.kwilClient = kwilClient;\n this.kwilSigner = kwilSigner;\n }\n\n /**\n * Executes a stream method with named parameters\n * @param method - The action name to execute\n * @param inputs - Named parameters for the action\n * @param types - Optional type specifications for parameters (e.g., NUMERIC)\n * @returns Transaction receipt\n */\n protected async executeWithNamedParams(\n method: string,\n inputs: Types.NamedParams[],\n types?: Record<string, any>,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute({\n namespace: \"main\",\n name: method,\n inputs,\n types,\n description: `TN SDK - Executing method on stream: ${method}`,\n },\n this.kwilSigner,\n );\n }\n\n /**\n * Executes a stream action with a complete ActionBody\n * @param inputs - Complete action body with all execution parameters\n * @param synchronous - Whether to wait for transaction to be mined\n * @returns Transaction receipt\n */\n protected async executeWithActionBody(\n inputs: Types.ActionBody,\n synchronous: boolean = false,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return this.kwilClient.execute(inputs, this.kwilSigner, synchronous);\n }\n\n /**\n * Calls a method on the stream\n */\n protected async call<T>(\n method: string,\n inputs: Types.NamedParams,\n ): Promise<Either<number, T>> {\n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: method,\n inputs: inputs,\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n return Either.left(result.status);\n }\n\n return Either.right(result.data?.result as T);\n }\n\n /**\n * @deprecated Use getRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getRecord(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getRecord(stream: StreamLocator, options?: GetRecordOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getRecord(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetRecordOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n // emit deprecation warning once\n if (!Action._legacyWarnEmitted.getRecord) {\n Action._legacyWarnEmitted.getRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getRecord(input). Use getRecord(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetRecordOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get record: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined,\n };\n }\n\n /**\n * Returns the index of the stream within the given date range\n * @deprecated Use getIndex(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getIndex(input: GetRecordInput): Promise<StreamRecord[]>;\n public async getIndex(stream: StreamLocator, options?: GetIndexOptions): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndex(\n inputOrStream: GetRecordInput | StreamLocator,\n options?: GetIndexOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetRecordInput;\n if (!Action._legacyWarnEmitted.getIndex) {\n Action._legacyWarnEmitted.getIndex = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndex(input). Use getIndex(stream, options?) instead.');\n }\n }\n const prefix = input.prefix ? input.prefix : \"\"\n const result = await this.call<{ event_time: number; value: string }[]>(\n prefix + \"get_index\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetIndexOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n }\n \n const prefix = options?.prefix ? options.prefix : \"\"\n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options?.from,\n $to: options?.to,\n $frozen_at: options?.frozenAt,\n $base_time: options?.baseTime,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: prefix + \"get_index\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options?.from,\n to: options?.to,\n frozenAt: options?.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * Returns the type of the stream\n */\n public async getType(\n stream: StreamLocator,\n ): Promise<StreamType> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.TypeKey);\n\n if (!result) {\n throw new Error(\"Failed to get stream type\");\n }\n\n const type = head(result).unwrapOrElse(() => {\n throw new Error(\n \"Failed to get stream type. Check if the stream is initialized.\",\n );\n });\n\n const validTypes = [StreamType.Primitive, StreamType.Composed];\n\n if (!validTypes.includes(type.value as StreamType)) {\n throw new Error(`Invalid stream type: ${type.value}`);\n }\n\n return type.value as StreamType;\n }\n\n /**\n * Returns the first record of the stream\n * @deprecated Use getFirstRecord(stream, options?) to leverage cache support and future-proof parameter handling.\n */\n public async getFirstRecord(\n input: GetFirstRecordInput,\n ): Promise<StreamRecord | null>;\n public async getFirstRecord(\n stream: StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<CacheAwareResponse<StreamRecord | null>>;\n public async getFirstRecord(\n inputOrStream: GetFirstRecordInput | StreamLocator,\n options?: GetFirstRecordOptions\n ): Promise<StreamRecord | null | CacheAwareResponse<StreamRecord | null>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetFirstRecordInput;\n if (!Action._legacyWarnEmitted.getFirstRecord) {\n Action._legacyWarnEmitted.getFirstRecord = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getFirstRecord(input). Use getFirstRecord(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_first_record\",\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $after: input.after,\n $frozen_at: input.frozenAt,\n }\n );\n\n return result\n .mapRight(head)\n .mapRight((result) =>\n result\n .map((result) => ({\n eventTime: result.event_time,\n value: result.value,\n }))\n .unwrapOr(null),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n \n // Validate options if provided\n if (options) {\n CacheValidation.validateGetFirstRecordOptions(options);\n }\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $after: options?.after,\n $frozen_at: options?.frozenAt,\n };\n \n if (options?.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_first_record\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get first record: ${result.status}`);\n }\n \n const rawData = result.data?.result as { event_time: number; value: string }[];\n const data = rawData && rawData.length > 0 ? {\n eventTime: rawData[0].event_time,\n value: rawData[0].value,\n } : null;\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n frozenAt: options?.frozenAt,\n rowsServed: data ? 1 : 0\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n protected async setMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n value: MetadataValueTypeForKey<K>,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"insert_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $value: value,\n $val_type: MetadataKeyValueMap[key],\n },\n ]);\n }\n\n protected async getMetadata<K extends MetadataKey>(\n stream: StreamLocator,\n key: K,\n // onlyLatest: boolean = true,\n filteredRef?: string,\n limit?: number,\n offset?: number,\n orderBy?: string,\n ): Promise<\n { rowId: string; value: MetadataValueTypeForKey<K>; createdAt: number }[]\n > {\n const result = await this.call<\n {\n row_id: string;\n value_i: number;\n value_f: string;\n value_b: boolean;\n value_s: string;\n value_ref: string;\n created_at: number;\n }[]\n >(\"get_metadata\", {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $key: key,\n $ref: filteredRef,\n $limit: limit,\n $offset: offset,\n $order_by: orderBy,\n },\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n rowId: row.row_id,\n value: row[\n MetadataTableKey[MetadataKeyValueMap[key as MetadataKey]]\n ] as MetadataValueTypeForKey<K>,\n createdAt: row.created_at,\n })),\n )\n .throw();\n }\n\n public async listMetadataByHeight<K extends MetadataKey>(\n params: ListMetadataByHeightParams = {},\n ): Promise<MetadataQueryResult[]> {\n type MetadataRawResult = {\n stream_id: string;\n data_provider: string;\n row_id: string;\n value_i: number | null;\n value_f: string | null;\n value_b: boolean | null;\n value_s: string | null;\n value_ref: string | null;\n created_at: number;\n }[];\n const result = await this.call<MetadataRawResult>(\n \"list_metadata_by_height\",\n {\n $key: params.key ?? \"\",\n $ref: params.value ?? null,\n $from_height: params.fromHeight ?? null,\n $to_height: params.toHeight ?? null,\n $limit: params.limit ?? null,\n $offset: params.offset ?? null,\n },\n );\n\n return result\n .mapRight((records) => \n records.map(record => ({\n streamId: record.stream_id,\n dataProvider: record.data_provider,\n rowId: record.row_id,\n valueInt: record.value_i,\n valueFloat: record.value_f,\n valueBoolean: record.value_b,\n valueString: record.value_s,\n valueRef: record.value_ref,\n createdAt: record.created_at,\n }))\n )\n .throw();\n }\n\n /**\n * Sets the read visibility of the stream\n */\n public async setReadVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ReadVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the read visibility of the stream\n */\n public async getReadVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ReadVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Sets the compose visibility of the stream\n */\n public async setComposeVisibility(\n stream: StreamLocator,\n visibility: VisibilityEnum,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey,\n visibility.toString(),\n );\n }\n\n /**\n * Returns the compose visibility of the stream\n */\n public async getComposeVisibility(\n stream: StreamLocator,\n ): Promise<VisibilityEnum | null> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.ComposeVisibilityKey);\n\n return head(result)\n .map((row) => toVisibilityEnum(row.value))\n .unwrapOr(null);\n }\n\n /**\n * Allows a wallet to read the stream\n */\n public async allowReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n }\n\n /**\n * Disables a wallet from reading the stream\n */\n public async disableReadWallet(\n stream: StreamLocator,\n wallet: EthereumAddress,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey,\n wallet.getAddress(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Wallet not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n /**\n * Allows a stream to use this stream as child\n */\n public async allowComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.setMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.streamId.getId(),\n );\n }\n\n /**\n * Disables a stream from using this stream as child\n */\n public async disableComposeStream(\n stream: StreamLocator,\n wallet: StreamLocator,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey,\n wallet.toString(),\n );\n\n const row_id = head(result)\n .map((row) => row.rowId)\n .unwrapOr(null);\n\n if (!row_id) {\n throw new Error(\"Stream not found in allowed list\");\n }\n\n return await this.disableMetadata(stream, row_id);\n }\n\n protected async disableMetadata(\n stream: StreamLocator,\n rowId: string,\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n return await this.executeWithNamedParams(\"disable_metadata\", [{\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $row_id: rowId,\n }]);\n }\n\n /**\n * Returns the wallets allowed to read the stream\n */\n public async getAllowedReadWallets(\n stream: StreamLocator,\n ): Promise<EthereumAddress[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowReadWalletKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => new EthereumAddress(row.value));\n }\n\n /**\n * Returns the streams allowed to compose the stream\n */\n public async getAllowedComposeStreams(\n stream: StreamLocator,\n ): Promise<StreamLocator[]> {\n const result = await this.getMetadata(\n stream,\n MetadataKey.AllowComposeStreamKey);\n\n return result\n .filter((row) => row.value)\n .map((row) => {\n const [streamId, dataProvider] = row.value.split(\":\");\n return {\n streamId: StreamId.fromString(streamId).throw(),\n dataProvider: new EthereumAddress(dataProvider),\n };\n });\n }\n\n /**\n * Returns the index change of the stream within the given date range\n * @deprecated Use getIndexChange(stream, options) to leverage cache support and future-proof parameter handling.\n */\n public async getIndexChange(\n input: GetIndexChangeInput,\n ): Promise<StreamRecord[]>;\n public async getIndexChange(\n stream: StreamLocator,\n options: GetIndexChangeOptions\n ): Promise<CacheAwareResponse<StreamRecord[]>>;\n public async getIndexChange(\n inputOrStream: GetIndexChangeInput | StreamLocator,\n options?: GetIndexChangeOptions\n ): Promise<StreamRecord[] | CacheAwareResponse<StreamRecord[]>> {\n // Handle backward compatibility\n if ('stream' in inputOrStream) {\n // Legacy call format\n const input = inputOrStream as GetIndexChangeInput;\n if (!Action._legacyWarnEmitted.getIndexChange) {\n Action._legacyWarnEmitted.getIndexChange = true;\n if (typeof console !== 'undefined' && console.warn) {\n console.warn('[TN SDK] Deprecated signature: getIndexChange(input). Use getIndexChange(stream, options?) instead.');\n }\n }\n const result = await this.call<{ event_time: number; value: string }[]>(\n \"get_index_change\", \n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt,\n $base_time: input.baseTime,\n $time_interval: input.timeInterval,\n }\n );\n\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n \n // New cache-aware call format\n const stream = inputOrStream as StreamLocator;\n if (!options) {\n throw new Error('Options parameter is required for cache-aware getIndexChange');\n }\n \n // Validate options\n CacheValidation.validateGetIndexChangeOptions(options);\n CacheValidation.validateTimeRange(options.from, options.to);\n \n const params: any = {\n $data_provider: stream.dataProvider.getAddress(),\n $stream_id: stream.streamId.getId(),\n $from: options.from,\n $to: options.to,\n $frozen_at: options.frozenAt,\n $base_time: options.baseTime,\n $time_interval: options.timeInterval,\n };\n \n if (options.useCache !== undefined) {\n params.$use_cache = options.useCache;\n }\n \n const result = await this.kwilClient.call(\n {\n namespace: \"main\",\n name: \"get_index_change\",\n inputs: params,\n },\n this.kwilSigner,\n );\n \n if (result.status !== 200) {\n throw new Error(`Failed to get index change: ${result.status}`);\n }\n \n const data = (result.data?.result as { event_time: number; value: string }[]).map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n }));\n \n let cache = CacheMetadataParser.extractFromResponse(result);\n \n // Enhance cache metadata with SDK-provided context\n if (cache) {\n cache = {\n ...cache,\n streamId: stream.streamId.getId(),\n dataProvider: stream.dataProvider.getAddress(),\n from: options.from,\n to: options.to,\n frozenAt: options.frozenAt,\n rowsServed: data.length\n };\n }\n \n return {\n data,\n cache: cache || undefined,\n logs: result.data?.logs ? CacheMetadataParser.parseLogsForMetadata(result.data.logs) : undefined\n };\n }\n\n /**\n * A custom method that accepts the procedure name and the input of GetRecordInput\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_price\" that returns a list of date_value and value\n * can be called with customGetProcedure(\"get_price\", { dateFrom: \"2021-01-01\", dateTo: \"2021-01-31\" })\n */\n public async customGetProcedure(\n procedure: string,\n input: GetRecordInput,\n ): Promise<StreamRecord[]> {\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n {\n $data_provider: input.stream.dataProvider.getAddress(),\n $stream_id: input.stream.streamId.getId(),\n $from: input.from,\n $to: input.to,\n $frozen_at: input.frozenAt\n }\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n\n /**\n * A custom method that accepts the procedure name and custom input of type Record<string, any>\n * Returns the result of the procedure in the same format as StreamRecord\n * I.e. a custom procedure named \"get_custom_index\" that returns a list of date_value and value\n * can be called with customProcedureWithArgs(\"get_custom_index\", { $customArg1: \"value1\", $customArg2: \"value2\" })\n * where $customArg1 and $customArg2 are the arguments of the procedure\n * @param procedure\n * @param args\n */\n public async customProcedureWithArgs(\n procedure: string,\n args: Record<string, Types.ValueType | Types.ValueType[]>,\n ){\n const result = await this.call<{ event_time: number; value: string }[]>(\n procedure,\n args\n );\n return result\n .mapRight((result) =>\n result.map((row) => ({\n eventTime: row.event_time,\n value: row.value,\n })),\n )\n .throw();\n }\n\n /**\n * Returns the size of database\n */\n public async getDatabaseSize(): Promise<BigInt> {\n const result = await this.call<{ database_size: BigInt }[]>(\"get_database_size_v2\", {})\n return result\n .map((rows) => {\n const raw = rows[0].database_size;\n const asBigInt = BigInt(raw.toString());\n return asBigInt;\n }).throw();\n }\n\n /**\n * Returns the size of database in human-readable format (e.g., \"22 GB\", \"1.5 TB\")\n */\n public async getDatabaseSizePretty(): Promise<string> {\n const result = await this.call<{ database_size_pretty: string }[]>(\"get_database_size_v2_pretty\", {})\n return result\n .map((rows) => rows[0].database_size_pretty)\n .throw();\n }\n\n /**\n * Gets the wallet balance on any supported blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param walletAddress The wallet address to check balance for\n * @returns Promise that resolves to the balance as a string, or throws on error\n */\n public async getWalletBalance(\n chain: string,\n walletAddress: string\n ): Promise<string> {\n const result = await this.call<{ balance?: string; }[]>(\n `${chain}_wallet_balance`,\n {\n $wallet_address: walletAddress,\n }\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"You don't have necessary permissions to execute this query\");\n }\n \n const row = rows[0];\n \n if (row.balance === undefined) {\n throw new Error(\"No balance returned from wallet balance query\");\n }\n \n return row.balance;\n })\n .throw();\n }\n\n /**\n * Calls the whoami action to get the caller's wallet address\n * This is useful for verifying wallet authentication with TN\n * @returns Promise that resolves to the caller's wallet address\n */\n public async whoami(): Promise<string> {\n const result = await this.call<{ caller: string }[]>(\n \"whoami\",\n {}\n );\n\n return result\n .mapRight((rows) => {\n if (rows.length === 0) {\n throw new Error(\"No response from whoami action\");\n }\n \n const row = rows[0];\n \n if (!row.caller) {\n throw new Error(\"No caller address returned from whoami\");\n }\n \n return row.caller;\n })\n .throw();\n }\n\n /**\n * Bridges tokens on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param amount The amount to bridge\n * @returns Promise that resolves to GenericResponse<TxReceipt>\n */\n public async bridgeTokens(\n chain: string,\n amount: string,\n recipient: string\n ): Promise<Types.GenericResponse<Types.TxReceipt>> {\n // Validate amount is greater than 0\n const numAmount = parseFloat(amount);\n if (isNaN(numAmount) || numAmount <= 0) {\n throw new Error(`Invalid amount: ${amount}. Amount must be greater than 0.`);\n }\n\n return await this.executeWithNamedParams(`${chain}_bridge_tokens`, [{\n $recipient: recipient,\n $amount: amount\n }]);\n }\n\n /**\n * Lists wallet rewards on a blockchain network\n * @param chain The chain identifier (e.g., \"sepolia\", \"mainnet\", \"polygon\", etc.)\n * @param wallet The wallet address to list rewards for\n * @param withPending Whether to include pending rewards\n * @returns Promise that resolves to the rewards data\n */\n public async listWalletRewards(\n chain: string,\n wallet: string,\n withPending: boolean\n ): Promise<any[]> {\n const result = await this.kwilClient.call(\n {\n namespace: `${chain}_bridge`,\n name: \"list_wallet_rewards\",\n inputs: {\n $param_1: wallet,\n $param_2: withPending,\n },\n },\n this.kwilSigner,\n );\n\n if (result.status !== 200) {\n throw new Error(`Failed to list wallet rewards: ${result.status}`);\n }\n\n return result.data?.result || [];\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["prefix", "result"]
7
7
  }
@@ -23,6 +23,7 @@ __export(attestationAction_exports, {
23
23
  AttestationAction: () => AttestationAction
24
24
  });
25
25
  module.exports = __toCommonJS(attestationAction_exports);
26
+ var import_kwil_js = require("@trufnetwork/kwil-js");
26
27
  var import_action = require("./action.cjs");
27
28
  var import_attestation = require("../types/attestation.cjs");
28
29
  var import_AttestationEncoding = require("../util/AttestationEncoding.cjs");
@@ -68,9 +69,12 @@ var AttestationAction = class extends import_action.Action {
68
69
  $action_name: input.actionName,
69
70
  $args_bytes: argsBytes,
70
71
  $encrypt_sig: input.encryptSig,
71
- $max_fee: input.maxFee
72
+ $max_fee: input.maxFee.toString()
72
73
  }];
73
- const result = await this.executeWithNamedParams("request_attestation", params);
74
+ const types = {
75
+ $max_fee: import_kwil_js.Utils.DataType.Numeric(78, 0)
76
+ };
77
+ const result = await this.executeWithNamedParams("request_attestation", params, types);
74
78
  if (!result.data?.tx_hash) {
75
79
  throw new Error(
76
80
  "Failed to request attestation: no transaction hash returned"
@@ -179,7 +183,7 @@ var AttestationAction = class extends import_action.Action {
179
183
  const limit = input.limit ?? 5e3;
180
184
  const offset = input.offset ?? 0;
181
185
  const params = {
182
- $requester: input.requester ?? null,
186
+ $requester: input.requester ?? new Uint8Array(0),
183
187
  $limit: limit,
184
188
  $offset: offset,
185
189
  $order_by: input.orderBy ?? null
@@ -190,7 +194,8 @@ var AttestationAction = class extends import_action.Action {
190
194
  `Failed to list attestations: HTTP status ${result.value}`
191
195
  );
192
196
  }
193
- const rows = result.value;
197
+ const rightValue = typeof result.value === "function" ? result.value() : result.value;
198
+ const rows = Array.isArray(rightValue) ? rightValue : [];
194
199
  if (!rows || rows.length === 0) {
195
200
  return [];
196
201
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/contracts-api/attestationAction.ts"],
4
- "sourcesContent": ["/**\n * Attestation action implementation\n *\n * This module provides methods for requesting, retrieving, and listing attestations.\n * Attestations are cryptographically signed proofs of query results that can be\n * consumed by smart contracts and external applications.\n */\n\nimport { Types } from '@trufnetwork/kwil-js';\nimport { Action } from './action';\nimport {\n RequestAttestationInput,\n RequestAttestationResult,\n GetSignedAttestationInput,\n SignedAttestationResult,\n ListAttestationsInput,\n AttestationMetadata,\n validateAttestationRequest,\n validateListAttestationsInput,\n} from '../types/attestation';\nimport { encodeActionArgs } from '../util/AttestationEncoding';\n\n/**\n * AttestationAction provides methods for working with data attestations\n *\n * Attestations enable validators to cryptographically sign query results,\n * providing verifiable proofs that can be used in smart contracts.\n *\n * @example\n * ```typescript\n * const client = new NodeTNClient({ ... });\n * const attestationAction = client.loadAttestationAction();\n *\n * // Request an attestation\n * const result = await attestationAction.requestAttestation({\n * dataProvider: \"0x4710a8d8f0d845da110086812a32de6d90d7ff5c\",\n * streamId: \"stai0000000000000000000000000000\",\n * actionName: \"get_record\",\n * args: [dataProvider, streamId, fromTime, toTime, null, false],\n * encryptSig: false,\n * maxFee: 1000000,\n * });\n *\n * // Wait for signing (1-2 blocks)\n * await new Promise(resolve => setTimeout(resolve, 10000));\n *\n * // Retrieve signed attestation\n * const signed = await attestationAction.getSignedAttestation({\n * requestTxId: result.requestTxId,\n * });\n * ```\n */\nexport class AttestationAction extends Action {\n /**\n * Request a signed attestation of query results\n *\n * This submits a transaction requesting that validators execute a query\n * and sign the results. The leader validator will sign the attestation\n * asynchronously (typically 1-2 blocks later).\n *\n * @param input - Attestation request parameters\n * @returns Promise resolving to request result with transaction ID\n * @throws Error if validation fails or transaction fails\n *\n * @example\n * ```typescript\n * const result = await attestationAction.requestAttestation({\n * dataProvider: \"0x4710a8d8f0d845da110086812a32de6d90d7ff5c\",\n * streamId: \"stai0000000000000000000000000000\",\n * actionName: \"get_record\",\n * args: [\n * \"0x4710a8d8f0d845da110086812a32de6d90d7ff5c\",\n * \"stai0000000000000000000000000000\",\n * Math.floor(Date.now() / 1000) - 86400, // 1 day ago\n * Math.floor(Date.now() / 1000),\n * null,\n * false,\n * ],\n * encryptSig: false,\n * maxFee: 1000000,\n * });\n * console.log(`Request TX ID: ${result.requestTxId}`);\n * ```\n */\n async requestAttestation(\n input: RequestAttestationInput\n ): Promise<RequestAttestationResult> {\n // Validate input\n validateAttestationRequest(input);\n\n // Encode arguments\n const argsBytes = encodeActionArgs(input.args);\n\n // Prepare named parameters for request_attestation action\n const params: Types.NamedParams[] = [{\n $data_provider: input.dataProvider,\n $stream_id: input.streamId,\n $action_name: input.actionName,\n $args_bytes: argsBytes,\n $encrypt_sig: input.encryptSig,\n $max_fee: input.maxFee,\n }];\n\n // Execute request_attestation action\n const result = await this.executeWithNamedParams('request_attestation', params);\n\n // Check for errors\n if (!result.data?.tx_hash) {\n throw new Error(\n 'Failed to request attestation: no transaction hash returned'\n );\n }\n\n // Return the 64-char hex tx_hash\n return {\n requestTxId: result.data.tx_hash,\n };\n }\n\n /**\n * Retrieve a complete signed attestation payload\n *\n * This fetches the signed attestation payload for a given request transaction ID.\n * The attestation must have been signed by the leader validator first.\n *\n * If the attestation is not yet signed, this will throw an error. Clients should\n * poll with exponential backoff or wait for 1-2 blocks after requesting.\n *\n * @param input - Request transaction ID\n * @returns Promise resolving to signed attestation payload\n * @throws Error if attestation not found or not yet signed\n *\n * @example\n * ```typescript\n * // Poll for signature\n * for (let i = 0; i < 15; i++) {\n * try {\n * const signed = await attestationAction.getSignedAttestation({\n * requestTxId: \"0x123...\",\n * });\n * console.log(`Payload: ${Buffer.from(signed.payload).toString('hex')}`);\n * break;\n * } catch (e) {\n * await new Promise(resolve => setTimeout(resolve, 2000));\n * }\n * }\n * ```\n */\n async getSignedAttestation(\n input: GetSignedAttestationInput\n ): Promise<SignedAttestationResult> {\n // Validate and normalize input\n const trimmed = input.requestTxId?.trim() || '';\n if (trimmed === '') {\n throw new Error('request_tx_id is required');\n }\n\n // Strip optional \"0x\" prefix and lowercase for normalization\n const normalizedRequestTxId = trimmed.startsWith('0x')\n ? trimmed.slice(2).toLowerCase()\n : trimmed.toLowerCase();\n\n // Call get_signed_attestation view action\n const result = await this.call<Array<{ payload: string | Uint8Array }>>(\n 'get_signed_attestation',\n { $request_tx_id: normalizedRequestTxId }\n );\n\n // Extract the right value from Either, or throw if Left\n const data = result.throw();\n\n // The action returns an array of rows - extract the first row\n if (!data || !Array.isArray(data) || data.length === 0) {\n throw new Error('No attestation found for request_tx_id - may not exist or is not yet signed');\n }\n\n const row = data[0];\n if (!row || !row.payload) {\n throw new Error('No payload in attestation row');\n }\n\n // Decode base64 to bytes\n let payloadBytes: Uint8Array;\n const payloadValue = row.payload;\n\n if (typeof payloadValue === 'string') {\n // Node.js environment\n if (typeof Buffer !== 'undefined') {\n payloadBytes = new Uint8Array(Buffer.from(payloadValue, 'base64'));\n } else {\n // Browser environment\n const binaryString = atob(payloadValue);\n payloadBytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n payloadBytes[i] = binaryString.charCodeAt(i);\n }\n }\n } else if (payloadValue instanceof Uint8Array) {\n // Already decoded\n payloadBytes = payloadValue;\n } else {\n throw new Error(`Unexpected payload type: ${typeof payloadValue}`);\n }\n\n return {\n payload: payloadBytes,\n };\n }\n\n /**\n * List attestation metadata with optional filtering\n *\n * This returns metadata for attestations, optionally filtered by requester address.\n * Supports pagination and sorting.\n *\n * @param input - Filter and pagination parameters\n * @returns Promise resolving to array of attestation metadata\n * @throws Error if parameters are invalid\n *\n * @example\n * ```typescript\n * // List my recent attestations\n * const myAddress = new Uint8Array(Buffer.from(wallet.address.slice(2), 'hex'));\n * const attestations = await attestationAction.listAttestations({\n * requester: myAddress,\n * limit: 10,\n * offset: 0,\n * orderBy: \"created_height desc\",\n * });\n *\n * attestations.forEach(att => {\n * console.log(`TX: ${att.requestTxId}, Height: ${att.createdHeight}`);\n * });\n * ```\n */\n async listAttestations(\n input: ListAttestationsInput\n ): Promise<AttestationMetadata[]> {\n // Validate input\n validateListAttestationsInput(input);\n\n // Set defaults\n const limit = input.limit ?? 5000;\n const offset = input.offset ?? 0;\n\n // Prepare parameters for list_attestations view action\n const params: Types.NamedParams = {\n $requester: input.requester ?? null,\n $limit: limit,\n $offset: offset,\n $order_by: input.orderBy ?? null,\n };\n\n // Call list_attestations view action\n const result = await this.call<any[]>('list_attestations', params);\n\n // Check for errors\n if (result.isLeft()) {\n throw new Error(\n `Failed to list attestations: HTTP status ${result.value}`\n );\n }\n\n // Extract the right value from Either\n const rows = result.value as unknown as any[];\n\n // If no rows, return empty array\n if (!rows || rows.length === 0) {\n return [];\n }\n\n // Parse rows into AttestationMetadata\n return rows.map((row: any, idx: number) => parseAttestationRow(row, idx));\n }\n}\n\n/**\n * Parse a single row from list_attestations result into AttestationMetadata\n *\n * Expected columns (in order):\n * 0. request_tx_id (TEXT)\n * 1. attestation_hash (BYTEA)\n * 2. requester (BYTEA)\n * 3. created_height (INT8)\n * 4. signed_height (INT8, nullable)\n * 5. encrypt_sig (BOOLEAN)\n */\nfunction parseAttestationRow(row: any, idx: number): AttestationMetadata {\n // kwil-js returns rows as objects with column names as keys\n // or as arrays depending on the query format\n let requestTxId: string;\n let attestationHash: Uint8Array;\n let requester: Uint8Array;\n let createdHeight: number;\n let signedHeight: number | null;\n let encryptSig: boolean;\n\n // Handle both array and object formats\n if (Array.isArray(row)) {\n // Array format: [col0, col1, col2, ...]\n if (row.length < 6) {\n throw new Error(\n `Row ${idx}: expected 6 columns, got ${row.length}`\n );\n }\n\n requestTxId = row[0];\n attestationHash = decodeBytea(row[1], idx, 'attestation_hash');\n requester = decodeBytea(row[2], idx, 'requester');\n createdHeight = parseInt(row[3], 10);\n signedHeight = row[4] !== null ? parseInt(row[4], 10) : null;\n encryptSig = row[5];\n } else {\n // Object format: { request_tx_id: ..., attestation_hash: ..., ... }\n requestTxId = row.request_tx_id;\n attestationHash = decodeBytea(row.attestation_hash, idx, 'attestation_hash');\n requester = decodeBytea(row.requester, idx, 'requester');\n createdHeight = parseInt(row.created_height, 10);\n signedHeight = row.signed_height !== null ? parseInt(row.signed_height, 10) : null;\n encryptSig = row.encrypt_sig;\n }\n\n return {\n requestTxId,\n attestationHash,\n requester,\n createdHeight,\n signedHeight,\n encryptSig,\n };\n}\n\n/**\n * Decode a BYTEA column from base64\n */\nfunction decodeBytea(value: any, rowIdx: number, colName: string): Uint8Array {\n if (value === null || value === undefined) {\n throw new Error(`Row ${rowIdx}: ${colName} is null or undefined`);\n }\n\n // If already Uint8Array, return as-is\n if (value instanceof Uint8Array) {\n return value;\n }\n\n // If string, decode from base64\n if (typeof value === 'string') {\n try {\n // Node.js environment\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(value, 'base64'));\n } else {\n // Browser environment\n const binaryString = atob(value);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n }\n } catch (err) {\n throw new Error(\n `Row ${rowIdx}: failed to decode ${colName} as base64: ${err}`\n );\n }\n }\n\n throw new Error(\n `Row ${rowIdx}: expected ${colName} to be string or Uint8Array, got ${typeof value}`\n );\n}\n\n// Inline unit tests\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('decodeBytea', () => {\n it('should decode base64 string', () => {\n const base64 = Buffer.from([1, 2, 3, 4]).toString('base64');\n const decoded = decodeBytea(base64, 0, 'test');\n expect(Array.from(decoded)).toEqual([1, 2, 3, 4]);\n });\n\n it('should return Uint8Array as-is', () => {\n const bytes = new Uint8Array([1, 2, 3, 4]);\n const decoded = decodeBytea(bytes, 0, 'test');\n expect(decoded).toBe(bytes);\n });\n\n it('should throw on null', () => {\n expect(() => decodeBytea(null, 0, 'test')).toThrow('null or undefined');\n });\n\n it('should throw on invalid type', () => {\n expect(() => decodeBytea(123, 0, 'test')).toThrow('expected test to be string or Uint8Array');\n });\n });\n\n describe('parseAttestationRow', () => {\n it('should parse array format row', () => {\n const row = [\n 'tx123',\n Buffer.from([1, 2, 3]).toString('base64'),\n Buffer.from([4, 5, 6]).toString('base64'),\n '100',\n '200',\n true,\n ];\n\n const metadata = parseAttestationRow(row, 0);\n\n expect(metadata.requestTxId).toBe('tx123');\n expect(Array.from(metadata.attestationHash)).toEqual([1, 2, 3]);\n expect(Array.from(metadata.requester)).toEqual([4, 5, 6]);\n expect(metadata.createdHeight).toBe(100);\n expect(metadata.signedHeight).toBe(200);\n expect(metadata.encryptSig).toBe(true);\n });\n\n it('should parse object format row', () => {\n const row = {\n request_tx_id: 'tx456',\n attestation_hash: Buffer.from([7, 8, 9]).toString('base64'),\n requester: Buffer.from([10, 11, 12]).toString('base64'),\n created_height: '300',\n signed_height: null,\n encrypt_sig: false,\n };\n\n const metadata = parseAttestationRow(row, 0);\n\n expect(metadata.requestTxId).toBe('tx456');\n expect(Array.from(metadata.attestationHash)).toEqual([7, 8, 9]);\n expect(Array.from(metadata.requester)).toEqual([10, 11, 12]);\n expect(metadata.createdHeight).toBe(300);\n expect(metadata.signedHeight).toBe(null);\n expect(metadata.encryptSig).toBe(false);\n });\n });\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Attestation action implementation\n *\n * This module provides methods for requesting, retrieving, and listing attestations.\n * Attestations are cryptographically signed proofs of query results that can be\n * consumed by smart contracts and external applications.\n */\n\nimport { Types, Utils } from '@trufnetwork/kwil-js';\nimport { Action } from './action';\nimport {\n RequestAttestationInput,\n RequestAttestationResult,\n GetSignedAttestationInput,\n SignedAttestationResult,\n ListAttestationsInput,\n AttestationMetadata,\n validateAttestationRequest,\n validateListAttestationsInput,\n} from '../types/attestation';\nimport { encodeActionArgs } from '../util/AttestationEncoding';\n\n/**\n * AttestationAction provides methods for working with data attestations\n *\n * Attestations enable validators to cryptographically sign query results,\n * providing verifiable proofs that can be used in smart contracts.\n *\n * @example\n * ```typescript\n * const client = new NodeTNClient({ ... });\n * const attestationAction = client.loadAttestationAction();\n *\n * // Request an attestation\n * const result = await attestationAction.requestAttestation({\n * dataProvider: \"0x4710a8d8f0d845da110086812a32de6d90d7ff5c\",\n * streamId: \"stai0000000000000000000000000000\",\n * actionName: \"get_record\",\n * args: [dataProvider, streamId, fromTime, toTime, null, false],\n * encryptSig: false,\n * maxFee: 1000000,\n * });\n *\n * // Wait for signing (1-2 blocks)\n * await new Promise(resolve => setTimeout(resolve, 10000));\n *\n * // Retrieve signed attestation\n * const signed = await attestationAction.getSignedAttestation({\n * requestTxId: result.requestTxId,\n * });\n * ```\n */\nexport class AttestationAction extends Action {\n /**\n * Request a signed attestation of query results\n *\n * This submits a transaction requesting that validators execute a query\n * and sign the results. The leader validator will sign the attestation\n * asynchronously (typically 1-2 blocks later).\n *\n * @param input - Attestation request parameters\n * @returns Promise resolving to request result with transaction ID\n * @throws Error if validation fails or transaction fails\n *\n * @example\n * ```typescript\n * const result = await attestationAction.requestAttestation({\n * dataProvider: \"0x4710a8d8f0d845da110086812a32de6d90d7ff5c\",\n * streamId: \"stai0000000000000000000000000000\",\n * actionName: \"get_record\",\n * args: [\n * \"0x4710a8d8f0d845da110086812a32de6d90d7ff5c\",\n * \"stai0000000000000000000000000000\",\n * Math.floor(Date.now() / 1000) - 86400, // 1 day ago\n * Math.floor(Date.now() / 1000),\n * null,\n * false,\n * ],\n * encryptSig: false,\n * maxFee: 1000000,\n * });\n * console.log(`Request TX ID: ${result.requestTxId}`);\n * ```\n */\n async requestAttestation(\n input: RequestAttestationInput\n ): Promise<RequestAttestationResult> {\n // Validate input\n validateAttestationRequest(input);\n\n // Encode arguments\n const argsBytes = encodeActionArgs(input.args);\n\n // Prepare named parameters for request_attestation action\n // Note: maxFee must be a string with NUMERIC type to encode as NUMERIC(788,0) for wei amounts\n const params: Types.NamedParams[] = [{\n $data_provider: input.dataProvider,\n $stream_id: input.streamId,\n $action_name: input.actionName,\n $args_bytes: argsBytes,\n $encrypt_sig: input.encryptSig,\n $max_fee: input.maxFee.toString(),\n }];\n\n // Specify types - maxFee needs NUMERIC(78,0) for large wei amounts\n const types = {\n $max_fee: Utils.DataType.Numeric(78, 0),\n };\n\n // Execute request_attestation action\n const result = await this.executeWithNamedParams('request_attestation', params, types);\n\n // Check for errors\n if (!result.data?.tx_hash) {\n throw new Error(\n 'Failed to request attestation: no transaction hash returned'\n );\n }\n\n // Return the 64-char hex tx_hash\n return {\n requestTxId: result.data.tx_hash,\n };\n }\n\n /**\n * Retrieve a complete signed attestation payload\n *\n * This fetches the signed attestation payload for a given request transaction ID.\n * The attestation must have been signed by the leader validator first.\n *\n * If the attestation is not yet signed, this will throw an error. Clients should\n * poll with exponential backoff or wait for 1-2 blocks after requesting.\n *\n * @param input - Request transaction ID\n * @returns Promise resolving to signed attestation payload\n * @throws Error if attestation not found or not yet signed\n *\n * @example\n * ```typescript\n * // Poll for signature\n * for (let i = 0; i < 15; i++) {\n * try {\n * const signed = await attestationAction.getSignedAttestation({\n * requestTxId: \"0x123...\",\n * });\n * console.log(`Payload: ${Buffer.from(signed.payload).toString('hex')}`);\n * break;\n * } catch (e) {\n * await new Promise(resolve => setTimeout(resolve, 2000));\n * }\n * }\n * ```\n */\n async getSignedAttestation(\n input: GetSignedAttestationInput\n ): Promise<SignedAttestationResult> {\n // Validate and normalize input\n const trimmed = input.requestTxId?.trim() || '';\n if (trimmed === '') {\n throw new Error('request_tx_id is required');\n }\n\n // Strip optional \"0x\" prefix and lowercase for normalization\n const normalizedRequestTxId = trimmed.startsWith('0x')\n ? trimmed.slice(2).toLowerCase()\n : trimmed.toLowerCase();\n\n // Call get_signed_attestation view action\n const result = await this.call<Array<{ payload: string | Uint8Array }>>(\n 'get_signed_attestation',\n { $request_tx_id: normalizedRequestTxId }\n );\n\n // Extract the right value from Either, or throw if Left\n const data = result.throw();\n\n // The action returns an array of rows - extract the first row\n if (!data || !Array.isArray(data) || data.length === 0) {\n throw new Error('No attestation found for request_tx_id - may not exist or is not yet signed');\n }\n\n const row = data[0];\n if (!row || !row.payload) {\n throw new Error('No payload in attestation row');\n }\n\n // Decode base64 to bytes\n let payloadBytes: Uint8Array;\n const payloadValue = row.payload;\n\n if (typeof payloadValue === 'string') {\n // Node.js environment\n if (typeof Buffer !== 'undefined') {\n payloadBytes = new Uint8Array(Buffer.from(payloadValue, 'base64'));\n } else {\n // Browser environment\n const binaryString = atob(payloadValue);\n payloadBytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n payloadBytes[i] = binaryString.charCodeAt(i);\n }\n }\n } else if (payloadValue instanceof Uint8Array) {\n // Already decoded\n payloadBytes = payloadValue;\n } else {\n throw new Error(`Unexpected payload type: ${typeof payloadValue}`);\n }\n\n return {\n payload: payloadBytes,\n };\n }\n\n /**\n * List attestation metadata with optional filtering\n *\n * This returns metadata for attestations, optionally filtered by requester address.\n * Supports pagination and sorting.\n *\n * @param input - Filter and pagination parameters\n * @returns Promise resolving to array of attestation metadata\n * @throws Error if parameters are invalid\n *\n * @example\n * ```typescript\n * // List my recent attestations\n * const myAddress = new Uint8Array(Buffer.from(wallet.address.slice(2), 'hex'));\n * const attestations = await attestationAction.listAttestations({\n * requester: myAddress,\n * limit: 10,\n * offset: 0,\n * orderBy: \"created_height desc\",\n * });\n *\n * attestations.forEach(att => {\n * console.log(`TX: ${att.requestTxId}, Height: ${att.createdHeight}`);\n * });\n * ```\n */\n async listAttestations(\n input: ListAttestationsInput\n ): Promise<AttestationMetadata[]> {\n // Validate input\n validateListAttestationsInput(input);\n\n // Set defaults\n const limit = input.limit ?? 5000;\n const offset = input.offset ?? 0;\n\n // Prepare parameters for list_attestations view action\n // Note: Empty Uint8Array represents BYTEA NULL (handled by kwil-js 0.9.10+)\n const params: Types.NamedParams = {\n $requester: input.requester ?? new Uint8Array(0),\n $limit: limit,\n $offset: offset,\n $order_by: input.orderBy ?? null,\n };\n\n // Call list_attestations view action\n const result = await this.call<any[]>('list_attestations', params);\n\n // Check for errors\n if (result.isLeft()) {\n throw new Error(\n `Failed to list attestations: HTTP status ${result.value}`\n );\n }\n\n // Extract the right value from Either\n // Note: result.value might be a getter function, so call it if needed\n const rightValue = typeof result.value === 'function' ? result.value() : result.value;\n const rows = Array.isArray(rightValue) ? rightValue : [];\n\n // If no rows, return empty array\n if (!rows || rows.length === 0) {\n return [];\n }\n\n // Parse rows into AttestationMetadata\n return rows.map((row: any, idx: number) => parseAttestationRow(row, idx));\n }\n}\n\n/**\n * Parse a single row from list_attestations result into AttestationMetadata\n *\n * Expected columns (in order):\n * 0. request_tx_id (TEXT)\n * 1. attestation_hash (BYTEA)\n * 2. requester (BYTEA)\n * 3. created_height (INT8)\n * 4. signed_height (INT8, nullable)\n * 5. encrypt_sig (BOOLEAN)\n */\nfunction parseAttestationRow(row: any, idx: number): AttestationMetadata {\n // kwil-js returns rows as objects with column names as keys\n // or as arrays depending on the query format\n let requestTxId: string;\n let attestationHash: Uint8Array;\n let requester: Uint8Array;\n let createdHeight: number;\n let signedHeight: number | null;\n let encryptSig: boolean;\n\n // Handle both array and object formats\n if (Array.isArray(row)) {\n // Array format: [col0, col1, col2, ...]\n if (row.length < 6) {\n throw new Error(\n `Row ${idx}: expected 6 columns, got ${row.length}`\n );\n }\n\n requestTxId = row[0];\n attestationHash = decodeBytea(row[1], idx, 'attestation_hash');\n requester = decodeBytea(row[2], idx, 'requester');\n createdHeight = parseInt(row[3], 10);\n signedHeight = row[4] !== null ? parseInt(row[4], 10) : null;\n encryptSig = row[5];\n } else {\n // Object format: { request_tx_id: ..., attestation_hash: ..., ... }\n requestTxId = row.request_tx_id;\n attestationHash = decodeBytea(row.attestation_hash, idx, 'attestation_hash');\n requester = decodeBytea(row.requester, idx, 'requester');\n createdHeight = parseInt(row.created_height, 10);\n signedHeight = row.signed_height !== null ? parseInt(row.signed_height, 10) : null;\n encryptSig = row.encrypt_sig;\n }\n\n return {\n requestTxId,\n attestationHash,\n requester,\n createdHeight,\n signedHeight,\n encryptSig,\n };\n}\n\n/**\n * Decode a BYTEA column from base64\n */\nfunction decodeBytea(value: any, rowIdx: number, colName: string): Uint8Array {\n if (value === null || value === undefined) {\n throw new Error(`Row ${rowIdx}: ${colName} is null or undefined`);\n }\n\n // If already Uint8Array, return as-is\n if (value instanceof Uint8Array) {\n return value;\n }\n\n // If string, decode from base64\n if (typeof value === 'string') {\n try {\n // Node.js environment\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(value, 'base64'));\n } else {\n // Browser environment\n const binaryString = atob(value);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n }\n } catch (err) {\n throw new Error(\n `Row ${rowIdx}: failed to decode ${colName} as base64: ${err}`\n );\n }\n }\n\n throw new Error(\n `Row ${rowIdx}: expected ${colName} to be string or Uint8Array, got ${typeof value}`\n );\n}\n\n// Inline unit tests\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('decodeBytea', () => {\n it('should decode base64 string', () => {\n const base64 = Buffer.from([1, 2, 3, 4]).toString('base64');\n const decoded = decodeBytea(base64, 0, 'test');\n expect(Array.from(decoded)).toEqual([1, 2, 3, 4]);\n });\n\n it('should return Uint8Array as-is', () => {\n const bytes = new Uint8Array([1, 2, 3, 4]);\n const decoded = decodeBytea(bytes, 0, 'test');\n expect(decoded).toBe(bytes);\n });\n\n it('should throw on null', () => {\n expect(() => decodeBytea(null, 0, 'test')).toThrow('null or undefined');\n });\n\n it('should throw on invalid type', () => {\n expect(() => decodeBytea(123, 0, 'test')).toThrow('expected test to be string or Uint8Array');\n });\n });\n\n describe('parseAttestationRow', () => {\n it('should parse array format row', () => {\n const row = [\n 'tx123',\n Buffer.from([1, 2, 3]).toString('base64'),\n Buffer.from([4, 5, 6]).toString('base64'),\n '100',\n '200',\n true,\n ];\n\n const metadata = parseAttestationRow(row, 0);\n\n expect(metadata.requestTxId).toBe('tx123');\n expect(Array.from(metadata.attestationHash)).toEqual([1, 2, 3]);\n expect(Array.from(metadata.requester)).toEqual([4, 5, 6]);\n expect(metadata.createdHeight).toBe(100);\n expect(metadata.signedHeight).toBe(200);\n expect(metadata.encryptSig).toBe(true);\n });\n\n it('should parse object format row', () => {\n const row = {\n request_tx_id: 'tx456',\n attestation_hash: Buffer.from([7, 8, 9]).toString('base64'),\n requester: Buffer.from([10, 11, 12]).toString('base64'),\n created_height: '300',\n signed_height: null,\n encrypt_sig: false,\n };\n\n const metadata = parseAttestationRow(row, 0);\n\n expect(metadata.requestTxId).toBe('tx456');\n expect(Array.from(metadata.attestationHash)).toEqual([7, 8, 9]);\n expect(Array.from(metadata.requester)).toEqual([10, 11, 12]);\n expect(metadata.createdHeight).toBe(300);\n expect(metadata.signedHeight).toBe(null);\n expect(metadata.encryptSig).toBe(false);\n });\n });\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }