Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions cjs/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
} from './modules/_';
import { createDefaultCheqdRegistry } from './registry';
import { CheqdSigningStargateClient } from './signer';
import { CheqdNetwork, IContext, IModuleMethodMap } from './types';
import { CheqdNetwork, IContext, IModuleMethodMap, QueryExtensionSetup } from './types';
import { GasPrice, QueryClient } from '@cosmjs/stargate-cjs';
import { CheqdQuerier } from './querier';
import { Tendermint37Client } from '@cosmjs/tendermint-rpc-cjs';
Expand All @@ -25,7 +25,7 @@ import {
FeeabstractionModule,
MinimalImportableFeeabstractionModule,
} from './modules/feeabstraction';
import { OracleExtension, OracleModule } from './modules/oracle';
import { defaultOracleExtensionKey, OracleExtension, OracleModule } from './modules/oracle';

/**
* Configuration options for initializing the CheqdSDK
Expand Down Expand Up @@ -196,6 +196,30 @@ export class CheqdSDK {
>querier;
}

/**
* Checks if the Oracle module is enabled on the connected chain.
* It instantiates a Oracle querier and perform a
* lightweight metadata query. If the query fails, it assumes the module
* is not supported or disabled.
*
* @returns {Promise<boolean>} Resolves to `true` if the Oracle extension is functional, `false` otherwise.
* @private
*/
private async isOracleExtensionEnabled(): Promise<boolean> {
const oracleQuerierExtension: QueryExtensionSetup<OracleExtension> =
instantiateCheqdSDKModuleQuerierExtensionSetup(OracleModule);
const querier: CheqdQuerier & OracleExtension = await CheqdQuerier.connectWithExtension(
this.options.rpcUrl,
oracleQuerierExtension
);
try {
await querier[defaultOracleExtensionKey].queryParams();
return true;
} catch {
return false;
}
}

/**
* Builds and initializes the complete SDK instance by loading all components:
* registry, querier extensions, modules, gas price configuration, and signing client.
Expand All @@ -213,7 +237,7 @@ export class CheqdSDK {

// ensure oracle module is loaded, if not already, if testnet
if (
this.options.network === CheqdNetwork.Testnet &&
(await this.isOracleExtensionEnabled()) &&
!this.options.modules.find((module) => module instanceof OracleModule)
) {
this.options.modules.push(OracleModule as unknown as AbstractCheqdSDKModule);
Expand Down
6 changes: 3 additions & 3 deletions cjs/src/querier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,10 @@ export class CheqdQuerier extends QueryClient {
* @param extension - Query extension setup to add specialized query functionality
* @returns Promise resolving to a CheqdQuerier instance with the specified extension
*/
static async connectWithExtension(
static async connectWithExtension<E extends CheqdExtensions>(
url: string,
extension: QueryExtensionSetup<CheqdExtensions>
): Promise<CheqdQuerier & CheqdExtensions> {
extension: QueryExtensionSetup<E>
): Promise<CheqdQuerier & E> {
const tmClient = await Tendermint37Client.connect(url);
return CheqdQuerier.withExtensions(tmClient, extension);
}
Expand Down
23 changes: 23 additions & 0 deletions cjs/tests/index.test.ts
Comment thread
Eengineer1 marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,29 @@ describe('CheqdSDK', () => {
defaultAsyncTxTimeout
);

it(
'it can dynamically instantiate Oracle module if available',
async () => {
const options = {
modules: [FeemarketModule as unknown as AbstractCheqdSDKModule],
rpcUrl: localnet.rpcUrl,
network: localnet.network,
wallet: await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic, { prefix: 'cheqd' }),
} satisfies ICheqdSDKOptions;
const cheqdSDK = await createCheqdSDK(options);

const sdkMethods = Object.keys(cheqdSDK.methods);
const testSigner = await CheqdSigningStargateClient.connectWithSigner(options.rpcUrl, options.wallet);
const testQuerier = (await CheqdQuerier.connectWithExtension(
options.rpcUrl,
setupOracleExtension
)) as CheqdQuerier & OracleExtension;

expect(sdkMethods).toContain('convertUSDtoCHEQ');
},
defaultAsyncTxTimeout
);

it(
'should use module methods',
async () => {
Expand Down
30 changes: 27 additions & 3 deletions esm/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
} from './modules/_.js';
import { createDefaultCheqdRegistry } from './registry.js';
import { CheqdSigningStargateClient } from './signer.js';
import { CheqdNetwork, IContext, IModuleMethodMap } from './types.js';
import { CheqdNetwork, IContext, IModuleMethodMap, QueryExtensionSetup } from './types.js';
import { GasPrice, QueryClient } from '@cosmjs/stargate';
import { CheqdQuerier } from './querier.js';
import { CometClient } from '@cosmjs/tendermint-rpc';
Expand All @@ -27,7 +27,7 @@ import {
} from './modules/feeabstraction.js';
import { OracleExtension } from './modules/oracle.js';
import { MinimalImportableOracleModule } from './modules/oracle';
import { defaultOracleExtensionKey, setupOracleExtension, OracleModule } from './modules/oracle.js';
import { defaultOracleExtensionKey, OracleModule } from './modules/oracle.js';

/**
* Configuration options for initializing the CheqdSDK
Expand Down Expand Up @@ -199,6 +199,30 @@ export class CheqdSDK {
>querier;
}

/**
* Checks if the Oracle module is enabled on the connected chain.
* It instantiates a Oracle querier and perform a
* lightweight metadata query. If the query fails, it assumes the module
* is not supported or disabled.
*
* @returns {Promise<boolean>} Resolves to `true` if the Oracle extension is functional, `false` otherwise.
* @private
*/
private async isOracleExtensionEnabled(): Promise<boolean> {
const oracleQuerierExtension: QueryExtensionSetup<OracleExtension> =
instantiateCheqdSDKModuleQuerierExtensionSetup(OracleModule);
const querier: CheqdQuerier & OracleExtension = await CheqdQuerier.connectWithExtension(
this.options.rpcUrl,
oracleQuerierExtension
);
try {
await querier[defaultOracleExtensionKey].queryParams();
return true;
} catch {
return false;
}
}

/**
* Builds and initializes the complete SDK instance by loading all components:
* registry, querier extensions, modules, gas price configuration, and signing client.
Expand All @@ -216,7 +240,7 @@ export class CheqdSDK {

// ensure oracle module is loaded, if not already, if testnet
if (
this.options.network === CheqdNetwork.Testnet &&
(await this.isOracleExtensionEnabled()) &&
!this.options.modules.find((module) => module instanceof OracleModule)
) {
this.options.modules.push(OracleModule as unknown as AbstractCheqdSDKModule);
Expand Down
6 changes: 3 additions & 3 deletions esm/src/querier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,10 @@ export class CheqdQuerier extends QueryClient {
* @param extension - Query extension setup to add specialized query functionality
* @returns Promise resolving to a CheqdQuerier instance with the specified extension
*/
static async connectWithExtension(
static async connectWithExtension<E extends CheqdExtensions>(
url: string,
extension: QueryExtensionSetup<CheqdExtensions>
): Promise<CheqdQuerier & CheqdExtensions> {
extension: QueryExtensionSetup<E>
): Promise<CheqdQuerier & E> {
const cometClient = await connectComet(url);
return CheqdQuerier.withExtensions(cometClient, extension);
}
Expand Down
23 changes: 23 additions & 0 deletions esm/tests/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,29 @@ describe('CheqdSDK', () => {
defaultAsyncTxTimeout
);

it(
'it can dynamically instantiate Oracle module if available',
async () => {
const options = {
modules: [FeemarketModule as unknown as AbstractCheqdSDKModule],
rpcUrl: localnet.rpcUrl,
network: localnet.network,
wallet: await DirectSecp256k1HdWallet.fromMnemonic(faucet.mnemonic, { prefix: 'cheqd' }),
} satisfies ICheqdSDKOptions;
const cheqdSDK = await createCheqdSDK(options);

const sdkMethods = Object.keys(cheqdSDK.methods);
const testSigner = await CheqdSigningStargateClient.connectWithSigner(options.rpcUrl, options.wallet);
const testQuerier = (await CheqdQuerier.connectWithExtension(
options.rpcUrl,
setupOracleExtension
)) as CheqdQuerier & OracleExtension;

expect(sdkMethods).toContain('convertUSDtoCHEQ');
},
defaultAsyncTxTimeout
);

it(
'should use module methods',
async () => {
Expand Down
Loading