UNPKG

@cosmwasm/ts-codegen

Version:

@cosmwasm/ts-codegen converts your CosmWasm smart contracts into dev-friendly TypeScript classes so you can focus on shipping code.

2 lines (1 loc) 5.54 kB
export declare const baseClient = "\nimport { StdFee, Coin } from '@interchainjs/types';\nimport { DirectSigner } from '@interchainjs/cosmos';\nimport { getSmartContractState } from 'interchainjs/cosmwasm/wasm/v1/query.rpc.func';\nimport { executeContract } from 'interchainjs/cosmwasm/wasm/v1/tx.rpc.func';\nimport { QuerySmartContractStateRequest, QuerySmartContractStateResponse } from 'interchainjs/cosmwasm/wasm/v1/query';\nimport { MsgExecuteContract } from 'interchainjs/cosmwasm/wasm/v1/tx';\nimport { Chain } from '@chain-registry/v2-types';\n\n// Encoding utility functions\nconst fromUint8Array = <T>(uint8Array: Uint8Array): T => {\n const text = new TextDecoder().decode(uint8Array);\n return JSON.parse(text);\n};\n\nconst toUint8Array = (obj: any): Uint8Array => {\n const text = JSON.stringify(obj);\n return new TextEncoder().encode(text);\n};\n\n// Chain registry configuration\n// The amount under gasPrice represents gas price per unit\nexport interface ChainConfig {\n chain?: Chain;\n gasPrice?: {\n denom: string;\n amount: string;\n };\n}\n\n// Gas fee calculation utilities\nexport const calculateGasFromChain = (chain: Chain, gasAmount: string): StdFee => {\n try {\n const feeTokens = chain.fees?.feeTokens;\n \n if (feeTokens && feeTokens.length > 0) {\n const primaryToken = feeTokens[0];\n // v2 chain-registry uses camelCase: averageGasPrice, lowGasPrice, fixedMinGasPrice\n const gasPrice = primaryToken.averageGasPrice || primaryToken.lowGasPrice || primaryToken.fixedMinGasPrice || 0.025;\n const gasAmountNum = parseInt(gasAmount);\n const feeAmount = Math.ceil(gasAmountNum * gasPrice).toString();\n \n return {\n amount: [{\n denom: primaryToken.denom,\n amount: feeAmount\n }],\n gas: gasAmount\n };\n }\n } catch (error) {\n console.warn('Failed to calculate gas from chain registry:', error);\n }\n \n // Fallback to default\n return { amount: [], gas: gasAmount };\n};\n\n// Default gas amount - users can easily change this\nexport let DEFAULT_GAS_AMOUNT = '200000';\n\n// Allow users to set their preferred default gas amount\nexport const setDefaultGasAmount = (gasAmount: string): void => {\n DEFAULT_GAS_AMOUNT = gasAmount;\n};\n\n// Get current default gas amount\nexport const getDefaultGasAmount = (): string => DEFAULT_GAS_AMOUNT;\n\nexport const getAutoGasFee = (chainConfig?: ChainConfig): StdFee => {\n const gasAmount = DEFAULT_GAS_AMOUNT;\n \n if (chainConfig?.chain) {\n return calculateGasFromChain(chainConfig.chain, gasAmount);\n }\n \n if (chainConfig?.gasPrice) {\n const gasAmountNum = parseInt(gasAmount);\n const gasPriceNum = parseFloat(chainConfig.gasPrice.amount);\n const feeAmount = Math.ceil(gasAmountNum * gasPriceNum).toString();\n \n return {\n amount: [{\n denom: chainConfig.gasPrice.denom,\n amount: feeAmount\n }],\n gas: gasAmount\n };\n }\n \n // Fallback: no fee tokens, just gas amount\n return { amount: [], gas: gasAmount };\n};\n\n// InterchainJS interfaces for CosmWasm clients\nexport interface ICosmWasmClient {\n queryContractSmart(contractAddr: string, query: any): Promise<any>;\n}\n\nexport interface ISigningCosmWasmClient {\n execute(\n sender: string, \n contractAddress: string, \n msg: any, \n fee?: number | StdFee | \"auto\", \n memo?: string, \n funds?: Coin[], \n chainConfig?: ChainConfig\n ): Promise<any>;\n}\n\nexport interface ISigningClient {\n signAndBroadcast(\n signerAddress: string,\n messages: any[],\n fee: number | StdFee | \"auto\",\n memo?: string\n ): Promise<any>;\n}\n\n// Helper functions to create InterchainJS clients\nexport function getCosmWasmClient(rpcEndpoint: string): ICosmWasmClient {\n return {\n queryContractSmart: async (contractAddr: string, query: any) => {\n // Create the request object\n const request: QuerySmartContractStateRequest = {\n address: contractAddr,\n queryData: toUint8Array(query)\n };\n \n // Execute the query using InterchainJS\n const response: QuerySmartContractStateResponse = await getSmartContractState(rpcEndpoint, request);\n \n // Parse and return the result\n return fromUint8Array(response.data);\n },\n };\n}\n\nexport function getSigningCosmWasmClient(signingClient: DirectSigner): ISigningCosmWasmClient {\n return {\n execute: async (\n sender: string, \n contractAddress: string, \n msg: any, \n fee?: number | StdFee | \"auto\", \n memo?: string, \n funds?: Coin[], \n chainConfig?: ChainConfig\n ) => {\n // Handle fee conversion\n let finalFee: StdFee;\n if (typeof fee === 'number') {\n finalFee = { amount: [], gas: fee.toString() };\n } else if (fee === 'auto') {\n finalFee = getAutoGasFee(chainConfig);\n } else if (fee) {\n finalFee = fee;\n } else {\n finalFee = getAutoGasFee(chainConfig);\n }\n\n // Create the message object\n const message: MsgExecuteContract = {\n sender,\n contract: contractAddress,\n msg: toUint8Array(msg),\n funds: funds || []\n };\n \n // Execute the transaction using InterchainJS\n const result = await executeContract(\n signingClient as any,\n sender,\n message,\n finalFee,\n memo || ''\n );\n \n return result;\n },\n };\n}\n";