Chain ID: {account.chainId}
diff --git a/examples/nextjs/etc/noop/README.md b/examples/nextjs/etc/noop/README.md
new file mode 100644
index 00000000..45705258
--- /dev/null
+++ b/examples/nextjs/etc/noop/README.md
@@ -0,0 +1,7 @@
+# Noop
+
+This is copied as a design pattern from Keplr-wallet!
+
+https://github.com/chainapsis/keplr-wallet/tree/v0.12.25/etc/noop
+
+> This directory isn’t actually used, and would be preferred to not be added. But it is needed to explicitly ignore specific libraries used by the dependency. Specifically, libsodium isn’t actually used and WebAssembly can’t be used in the extension’s sandbox environment but creates various errors so the directory exists to ignore libsodium.
diff --git a/examples/nextjs/etc/noop/index.js b/examples/nextjs/etc/noop/index.js
new file mode 100644
index 00000000..f053ebf7
--- /dev/null
+++ b/examples/nextjs/etc/noop/index.js
@@ -0,0 +1 @@
+module.exports = {};
diff --git a/examples/nextjs/etc/noop/package.json b/examples/nextjs/etc/noop/package.json
new file mode 100644
index 00000000..1e0f254d
--- /dev/null
+++ b/examples/nextjs/etc/noop/package.json
@@ -0,0 +1,8 @@
+{
+ "name": "noop",
+ "version": "0.0.1",
+ "main": "index.js",
+ "private": true,
+ "scripts": {},
+ "dependencies": {}
+}
diff --git a/examples/nextjs/next.config.js b/examples/nextjs/next.config.js
index 007b2aa5..01017f7f 100644
--- a/examples/nextjs/next.config.js
+++ b/examples/nextjs/next.config.js
@@ -2,6 +2,7 @@
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { composePlugins, withNx } = require('@nx/next');
+const { resolve } = require('path');
/**
* @type {import('@nx/next/plugins/with-nx').WithNxOptions}
@@ -12,6 +13,26 @@ const nextConfig = {
// See: https://github.com/gregberge/svgr
svgr: false,
},
+ webpack: (config) => {
+ const noop = resolve(__dirname, 'etc', 'noop', 'index.js');
+
+ config.resolve = {
+ ...config.resolve, // This spreads existing resolve configuration (if any)
+ alias: {
+ ...config.resolve.alias, // This spreads any existing alias configurations
+ libsodium: noop,
+ 'libsodium-wrappers': noop,
+ 'libsodium-sumo': noop,
+ 'libsodium-wrappers-sumo': noop,
+ // bip39 is only used in the context of the extension wallet, so we can replace it.
+ // replacing it with a no-op breaks build, so we can at least replace it with a lighter weight version for now.
+ // ideally this becomes replaced with an API-compatible no-op.
+ bip39: noop,
+ },
+ };
+
+ return config;
+ },
};
const plugins = [
diff --git a/package.json b/package.json
index df2d797b..f9f69559 100644
--- a/package.json
+++ b/package.json
@@ -75,15 +75,20 @@
},
"dependencies": {
"@cosmjs/amino": "^0.31.3",
+ "@cosmjs/cosmwasm-stargate": "^0.31.3",
"@cosmjs/proto-signing": "^0.31.3",
+ "@cosmjs/stargate": "^0.31.3",
"@keplr-wallet/cosmos": "^0.12.38",
+ "bufferutil": "^4.0.8",
"cosmjs-types": "^0.9.0",
"eventemitter3": "^5.0.1",
"long": "^5.2.3",
"next": "13.5.6",
+ "osmojs": "^16.5.1",
"react": "18.2.0",
"react-dom": "18.2.0",
"semver": "^7.5.4",
+ "utf-8-validate": "^6.0.3",
"zustand": "^4.4.4"
}
}
diff --git a/packages/core/package.json b/packages/core/package.json
index ec899cc2..2eb888a7 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -17,6 +17,7 @@
"@nabla-studio/chain-registry": "*"
},
"peerDependencies": {
+ "@cosmjs/stargate": "^0.31.3",
"@cosmjs/proto-signing": "^0.31.3",
"cosmjs-types": "^0.9.0",
"@cosmjs/amino": "^0.31.3",
diff --git a/packages/core/src/types/fees.ts b/packages/core/src/types/fees.ts
new file mode 100644
index 00000000..8df4b8fe
--- /dev/null
+++ b/packages/core/src/types/fees.ts
@@ -0,0 +1,9 @@
+import type { EncodeObject } from '@cosmjs/proto-signing';
+
+export interface SigningSimulatorClient {
+ simulate(
+ signerAddress: string,
+ messages: readonly EncodeObject[],
+ memo: string | undefined,
+ ): Promise
;
+}
diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts
index 42e9a356..769032a7 100644
--- a/packages/core/src/types/index.ts
+++ b/packages/core/src/types/index.ts
@@ -2,3 +2,4 @@ export * from './suggest-tokens';
export * from './suggest-chains';
export * from './wallet';
export * from './account';
+export * from './fees';
diff --git a/packages/core/src/utils/endpoints.ts b/packages/core/src/utils/endpoints.ts
new file mode 100644
index 00000000..b8407bbb
--- /dev/null
+++ b/packages/core/src/utils/endpoints.ts
@@ -0,0 +1,18 @@
+import { Chain } from '@nabla-studio/chain-registry';
+import { assertIsDefined } from './asserts';
+
+export const getEndpoint = (chainName: string, chains: Chain[]) => {
+ const chain = chains.find((el) => el.chain_name === chainName);
+
+ assertIsDefined(chain);
+ assertIsDefined(chain.apis?.rpc);
+ assertIsDefined(chain.apis?.rest);
+
+ const rpc = chain.apis.rpc[0];
+ const rest = chain.apis.rest[0];
+
+ return {
+ rpc,
+ rest,
+ };
+};
diff --git a/packages/core/src/utils/fees.ts b/packages/core/src/utils/fees.ts
new file mode 100644
index 00000000..53c5639b
--- /dev/null
+++ b/packages/core/src/utils/fees.ts
@@ -0,0 +1,57 @@
+import type { EncodeObject } from '@cosmjs/proto-signing';
+import { calculateFee, GasPrice } from '@cosmjs/stargate';
+import { assertIsDefined } from './asserts';
+import type { SigningSimulatorClient } from '../types';
+import type { Chain } from '@nabla-studio/chain-registry';
+
+/**
+ * Retrieve chain gas price so we can use fee auto.
+ *
+ * @param chain
+ * @param feeDenom ex. uosmo
+ * @returns
+ */
+export const getGasPrice = (chain: Chain, feeDenom?: string) => {
+ let gasPrice: GasPrice | undefined = undefined;
+
+ if (chain.fees && chain.fees.fee_tokens.length > 0) {
+ let feeToken = undefined;
+
+ if (feeToken) {
+ feeToken = chain.fees.fee_tokens.find(
+ (token) => token.denom === feeDenom,
+ );
+ } else {
+ chain.fees.fee_tokens[0];
+ }
+
+ const averageGasPrice = feeToken?.average_gas_price;
+ const denom = feeToken?.denom;
+
+ if (averageGasPrice && denom && !denom.startsWith('ibc/')) {
+ gasPrice = GasPrice.fromString(`${averageGasPrice}${denom}`);
+ } else {
+ gasPrice = GasPrice.fromString(`1${denom}`);
+ }
+ }
+
+ return gasPrice;
+};
+
+export const estimateFee = async (
+ client: SigningSimulatorClient,
+ sender: string,
+ messages: EncodeObject[],
+ gasPrice?: string | GasPrice,
+ memo?: string,
+ multiplier = 1.4,
+) => {
+ assertIsDefined(
+ gasPrice,
+ 'Gas price must be set in the client options when auto gas is used.',
+ );
+
+ const gasEstimation = await client.simulate(sender, messages, memo);
+
+ return calculateFee(Math.round(gasEstimation * multiplier), gasPrice);
+};
diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts
index 8b948c6c..a6142fcc 100644
--- a/packages/core/src/utils/index.ts
+++ b/packages/core/src/utils/index.ts
@@ -1,3 +1,5 @@
export * from './extension';
export * from './asserts';
export * from './errors';
+export * from './fees';
+export * from './endpoints';
diff --git a/packages/core/src/wallet.ts b/packages/core/src/wallet.ts
index dde01a3a..fc274aa6 100644
--- a/packages/core/src/wallet.ts
+++ b/packages/core/src/wallet.ts
@@ -7,6 +7,7 @@ import type {
AminoSignResponse,
OfflineAminoSigner,
StdSignDoc,
+ StdSignature,
} from '@cosmjs/amino';
import type {
SignOptions,
@@ -90,6 +91,19 @@ export abstract class Wallet {
signOptions?: SignOptions,
): Promise;
+ abstract signArbitrary(
+ chainId: string,
+ signer: string,
+ data: string | Uint8Array,
+ ): Promise;
+
+ abstract verifyArbitrary(
+ chainId: string,
+ signer: string,
+ data: string | Uint8Array,
+ signature: StdSignature,
+ ): Promise;
+
/**
* Asks the user to add a tokens to the wallet
*/
diff --git a/packages/core/vite.config.ts b/packages/core/vite.config.ts
index 7bf67cfb..35f90633 100644
--- a/packages/core/vite.config.ts
+++ b/packages/core/vite.config.ts
@@ -36,9 +36,12 @@ export default defineConfig({
// External packages that should not be bundled into your library.
external: [
'cosmjs-types',
+ 'cosmjs-types/cosmos/tx/v1beta1/tx',
'@cosmjs/proto-signing',
'@cosmjs/amino',
+ '@cosmjs/stargate',
'eventemitter3',
+ '@nabla-studio/chain-registry',
],
},
},
diff --git a/packages/react/package.json b/packages/react/package.json
index a884006b..f0062f70 100644
--- a/packages/react/package.json
+++ b/packages/react/package.json
@@ -14,17 +14,15 @@
"version": "0.2.0",
"sideEffects": false,
"dependencies": {
- "@quirks/store": "*"
+ "@quirks/store": "*",
+ "@quirks/core": "*"
},
"peerDependencies": {
- "react": "18.2.0"
+ "react": "18.2.0",
+ "cosmjs-types": "^0.9.0",
+ "@cosmjs/amino": "^0.31.3"
},
"main": "./index.js",
- "types": "./index.d.ts",
- "exports": {
- ".": {
- "import": "./index.mjs",
- "require": "./index.js"
- }
- }
+ "module": "./index.mjs",
+ "typings": "./index.d.ts"
}
diff --git a/packages/react/src/hooks/chain.tsx b/packages/react/src/hooks/chain.tsx
index 05a157e6..1f682c61 100644
--- a/packages/react/src/hooks/chain.tsx
+++ b/packages/react/src/hooks/chain.tsx
@@ -1,9 +1,39 @@
+import { assertIsDefined } from '@quirks/core';
import { useQuirks } from '../providers';
+import type { SignDoc } from 'cosmjs-types/cosmos/tx/v1beta1/tx';
+import type { StdSignDoc } from '@cosmjs/amino';
export const useChains = () => {
const store = useQuirks();
return {
accounts: store.use.accounts(),
+ accountName: store.use.accountName ? store.use.accountName() : undefined,
+ getAddresses: store.use.getAddresses(),
+ getAddress: store.use.getAddress(),
+ getChain: store.use.getChain(),
+ };
+};
+
+export const useChain = (chainName: string) => {
+ const store = useQuirks();
+
+ const chain = store.use.getChain()(chainName);
+
+ assertIsDefined(chain, `there is no chain named "${chainName}"`);
+
+ return {
+ chain,
+ address: store.use.getAddress()(chain.chain_id),
+ accountName: store.use.accountName ? store.use.accountName() : undefined,
+ getOfflineSigner: () => store.use.getOfflineSigner()(chain.chain_id),
+ getOfflineSignerOnlyAmino: () =>
+ store.use.getOfflineSignerOnlyAmino()(chain.chain_id),
+ getOfflineSignerAuto: () =>
+ store.use.getOfflineSignerAuto()(chain.chain_id),
+ signAmino: (signDoc: StdSignDoc) =>
+ store.use.signAmino()(chain.chain_id, signDoc),
+ signDirect: (signDoc: SignDoc) =>
+ store.use.signDirect()(chain.chain_id, signDoc),
};
};
diff --git a/packages/react/vite.config.ts b/packages/react/vite.config.ts
index 6df515ba..15dc04b6 100644
--- a/packages/react/vite.config.ts
+++ b/packages/react/vite.config.ts
@@ -43,6 +43,11 @@ export default defineConfig({
'zustand',
'zustand/vanilla',
'zustand/middleware',
+ '@quirks/store',
+ '@quirks/core',
+ 'cosmjs-types',
+ 'cosmjs-types/cosmos/tx/v1beta1/tx',
+ '@cosmjs/amino',
],
},
},
diff --git a/packages/store/package.json b/packages/store/package.json
index b5afc8fe..7f9b144b 100644
--- a/packages/store/package.json
+++ b/packages/store/package.json
@@ -18,7 +18,12 @@
"@quirks/core": "*"
},
"peerDependencies": {
- "zustand": "^4.4.4"
+ "zustand": "^4.4.4",
+ "@cosmjs/amino": "^0.31.3",
+ "@cosmjs/proto-signing": "^0.31.3",
+ "@cosmjs/stargate": "^0.31.3",
+ "@cosmjs/cosmwasm-stargate": "^0.31.3",
+ "cosmjs-types": "^0.9.0"
},
"main": "./index.js",
"module": "./index.mjs",
diff --git a/packages/store/src/cosmjs/index.ts b/packages/store/src/cosmjs/index.ts
new file mode 100644
index 00000000..4baa8dbe
--- /dev/null
+++ b/packages/store/src/cosmjs/index.ts
@@ -0,0 +1 @@
+export * from './sign';
diff --git a/packages/store/src/cosmjs/sign.ts b/packages/store/src/cosmjs/sign.ts
new file mode 100644
index 00000000..b16fd600
--- /dev/null
+++ b/packages/store/src/cosmjs/sign.ts
@@ -0,0 +1,243 @@
+import type { StdFee } from '@cosmjs/amino';
+import type { EncodeObject } from '@cosmjs/proto-signing';
+import { store } from '../store';
+import {
+ assertIsDefined,
+ estimateFee,
+ getEndpoint,
+ getGasPrice,
+} from '@quirks/core';
+import {
+ SigningStargateClient,
+ SigningStargateClientOptions,
+ StargateClient,
+} from '@cosmjs/stargate';
+import {
+ SigningCosmWasmClient,
+ SigningCosmWasmClientOptions,
+} from '@cosmjs/cosmwasm-stargate';
+import { TxRaw } from 'cosmjs-types/cosmos/tx/v1beta1/tx';
+
+/**
+ * Why is this part outside the store?
+ *
+ * It is useful for it to be external since it depends on the store,
+ * but it doesn't have to be reactive, it also allows us to pass these functions outside of a react component,
+ * for example if I want to create a promise that signs a message and then I want to give this promise to a library like tanstack-query
+ */
+
+/**
+ * Get current account address by chainName
+ *
+ * @param chainName
+ * @returns string
+ */
+export const getAddress = (chainName: string) => {
+ const state = store.getState();
+
+ const chain = state.chains.find((el) => el.chain_name === chainName);
+ assertIsDefined(chain);
+
+ const sender = state.getAddress(chain.chain_id);
+ assertIsDefined(sender);
+
+ return sender;
+};
+
+export const getChain = (chainName: string) => {
+ const chain = store
+ .getState()
+ .chains.find((el) => el.chain_name === chainName);
+
+ return chain;
+};
+
+/**
+ * Allows you to broadcast a txraw
+ *
+ * @param chainName
+ * @param txRaw
+ * @param timeoutMs
+ * @param pollIntervalMs
+ * @returns Promise
+ */
+export const broadcast = async (
+ chainName: string,
+ txRaw: TxRaw,
+ timeoutMs = 60_000,
+ pollIntervalMs = 3_000,
+) => {
+ const state = store.getState();
+
+ const chain = store
+ .getState()
+ .chains.find((el) => el.chain_name === chainName);
+ assertIsDefined(chain);
+
+ const endpoint = getEndpoint(chainName, state.chains);
+
+ let clientOptions: SigningStargateClientOptions | undefined = undefined;
+
+ const stargate = state.signerOptions?.stargate;
+
+ if (stargate) {
+ clientOptions = stargate(chain);
+ }
+
+ const client = await StargateClient.connect(
+ endpoint.rpc.address,
+ clientOptions,
+ );
+
+ const txBytes = TxRaw.encode(txRaw).finish();
+
+ return client.broadcastTx(txBytes, timeoutMs, pollIntervalMs);
+};
+
+/**
+ * allows you to broadcast a txraw, but in synchronous mode,
+ * it does not stay polled but directly returns the hash of the transaction.
+ *
+ * @param chainName
+ * @param txRaw
+ * @param timeoutMs
+ * @param pollIntervalMs
+ * @returns string
+ */
+export const broadcastSync = async (chainName: string, txRaw: TxRaw) => {
+ const state = store.getState();
+
+ const chain = state.chains.find((el) => el.chain_name === chainName);
+ assertIsDefined(chain);
+
+ const endpoint = getEndpoint(chainName, state.chains);
+
+ let clientOptions: SigningStargateClientOptions | undefined = undefined;
+
+ const stargate = state.signerOptions?.stargate;
+
+ if (stargate) {
+ clientOptions = stargate(chain);
+ }
+
+ const client = await StargateClient.connect(
+ endpoint.rpc.address,
+ clientOptions,
+ );
+
+ const txBytes = TxRaw.encode(txRaw).finish();
+
+ return client.broadcastTxSync(txBytes);
+};
+
+/**
+ * Sign a TX using CosmJS Stargate Client
+ *
+ * @param chainName
+ * @param messages
+ * @param fee
+ * @param memo
+ * @returns TxRaw
+ */
+export const sign = async (
+ chainName: string,
+ messages: EncodeObject[],
+ fee: StdFee | 'auto' = 'auto',
+ memo?: string,
+): Promise => {
+ const state = store.getState();
+ assertIsDefined(state.wallet);
+
+ const chain = state.chains.find((el) => el.chain_name === chainName);
+ assertIsDefined(chain);
+
+ const endpoint = getEndpoint(chainName, state.chains);
+
+ const sender = getAddress(chainName);
+
+ const offlineSigner = await state.wallet.getOfflineSignerAuto(
+ chain.chain_id,
+ state.signOptions,
+ );
+
+ let clientOptions: SigningStargateClientOptions | undefined = undefined;
+
+ const signingStargate = state.signerOptions?.signingStargate;
+
+ if (signingStargate) {
+ clientOptions = signingStargate(chain);
+ }
+
+ const client = await SigningStargateClient.connectWithSigner(
+ endpoint.rpc.address,
+ offlineSigner,
+ clientOptions,
+ );
+
+ if (fee === 'auto') {
+ const gasPrice = clientOptions?.gasPrice
+ ? clientOptions.gasPrice
+ : getGasPrice(chain);
+
+ fee = await estimateFee(client, sender, messages, gasPrice, memo);
+ }
+
+ return client.sign(sender, messages, fee, memo ?? '');
+};
+
+/**
+ * Sign a TX using CosmJS Stargate Client
+ *
+ * @param chainName
+ * @param messages
+ * @param fee
+ * @param memo
+ * @returns TxRaw
+ */
+export const signCW = async (
+ chainName: string,
+ messages: EncodeObject[],
+ fee: StdFee | 'auto' = 'auto',
+ memo?: string,
+): Promise => {
+ const state = store.getState();
+ assertIsDefined(state.wallet);
+
+ const chain = store
+ .getState()
+ .chains.find((el) => el.chain_name === chainName);
+ assertIsDefined(chain);
+
+ const endpoint = getEndpoint(chainName, state.chains);
+
+ const sender = getAddress(chainName);
+
+ const offlineSigner = await state.wallet.getOfflineSignerAuto(
+ chain.chain_id,
+ state.signOptions,
+ );
+
+ let clientOptions: SigningCosmWasmClientOptions | undefined = undefined;
+
+ const signingCosmwasm = state.signerOptions?.signingCosmwasm;
+
+ if (signingCosmwasm) {
+ clientOptions = signingCosmwasm(chain);
+ }
+
+ const client = await SigningCosmWasmClient.connectWithSigner(
+ endpoint.rpc.address,
+ offlineSigner,
+ clientOptions,
+ );
+
+ if (fee === 'auto') {
+ const gasPrice = clientOptions?.gasPrice
+ ? clientOptions.gasPrice
+ : getGasPrice(chain);
+
+ fee = await estimateFee(client, sender, messages, gasPrice, memo);
+ }
+
+ return client.sign(sender, messages, fee, memo ?? '');
+};
diff --git a/packages/store/src/index.ts b/packages/store/src/index.ts
index dbe62159..81cb984f 100644
--- a/packages/store/src/index.ts
+++ b/packages/store/src/index.ts
@@ -1,3 +1,4 @@
export * from './store';
export * from './utils';
export * from './types';
+export * from './cosmjs';
diff --git a/packages/store/src/slices/account.ts b/packages/store/src/slices/account.ts
index e80af2fa..36a17dab 100644
--- a/packages/store/src/slices/account.ts
+++ b/packages/store/src/slices/account.ts
@@ -1,14 +1,18 @@
-import type { AppState, AccountState } from '../types';
+import type { AppState, AccountSlice, AccountState } from '../types';
import type { StateCreator } from 'zustand/vanilla';
+export const accountInitialState: AccountState = {
+ accountName: undefined,
+ accounts: [],
+};
+
export const createAccountSlice: StateCreator<
AppState,
[],
[],
- AccountState
+ AccountSlice
> = (_, get) => ({
- accountName: undefined,
- accounts: [],
+ ...accountInitialState,
getAddress: (chainId) =>
get().accounts.find((account) => account.chainId === chainId)
?.bech32Address,
diff --git a/packages/store/src/slices/config.ts b/packages/store/src/slices/config.ts
index d7c5fd52..f8751d5e 100644
--- a/packages/store/src/slices/config.ts
+++ b/packages/store/src/slices/config.ts
@@ -1,13 +1,20 @@
-import type { ConfigState, AppState } from '../types';
+import type { ConfigSlice, AppState, ConfigState } from '../types';
import type { StateCreator } from 'zustand/vanilla';
-export const createConfigSlice: StateCreator = (
- set,
-) => ({
+export const configInitialState: ConfigState = {
wallets: [],
chains: [],
assetsLists: [],
+};
+
+export const createConfigSlice: StateCreator = (
+ set,
+ get,
+) => ({
+ ...configInitialState,
setChains: (chains) => set(() => ({ chains })),
setAssetsLists: (assetsLists) => set(() => ({ assetsLists })),
setWallets: (wallets) => set(() => ({ wallets })),
+ getChain: (chainName) =>
+ get().chains.find((chain) => chain.chain_name === chainName),
});
diff --git a/packages/store/src/slices/connect.ts b/packages/store/src/slices/connect.ts
index 21dcb4e1..0b81904b 100644
--- a/packages/store/src/slices/connect.ts
+++ b/packages/store/src/slices/connect.ts
@@ -2,22 +2,27 @@ import { assertIsDefined, createInvalidWalletName } from '@quirks/core';
import {
ConnectionStates,
type AppState,
- type ConnectState,
+ type ConnectSlice,
AddressWithChain,
ReconnectionStates,
+ type ConnectState,
} from '../types';
import type { StateCreator } from 'zustand/vanilla';
+export const connectInitialState: ConnectState = {
+ walletName: undefined,
+ wallet: undefined,
+ status: ConnectionStates.DISCONNECTED,
+ reconnectionStatus: ReconnectionStates.IDLE,
+};
+
export const createConnectSlice: StateCreator<
AppState,
[],
[],
- ConnectState
+ ConnectSlice
> = (set, get) => ({
- walletName: undefined,
- wallet: undefined,
- status: ConnectionStates.DISCONNECTED,
- reconnectionStatus: ReconnectionStates.IDLE,
+ ...connectInitialState,
setWallet: async (wallet) => {
set(() => ({ wallet }));
@@ -118,9 +123,6 @@ export const createConnectSlice: StateCreator<
get().wallet?.removeListeners();
- set(() => ({
- walletName: undefined,
- status: ConnectionStates.DISCONNECTED,
- }));
+ get().reset();
},
});
diff --git a/packages/store/src/slices/index.ts b/packages/store/src/slices/index.ts
index 4e66bba8..c74f5177 100644
--- a/packages/store/src/slices/index.ts
+++ b/packages/store/src/slices/index.ts
@@ -1,3 +1,4 @@
export * from './connect';
export * from './config';
export * from './account';
+export * from './sign';
diff --git a/packages/store/src/slices/sign.ts b/packages/store/src/slices/sign.ts
new file mode 100644
index 00000000..d8a1212e
--- /dev/null
+++ b/packages/store/src/slices/sign.ts
@@ -0,0 +1,62 @@
+import { assertIsDefined } from '@quirks/core';
+import type { AppState, SignSlice, SignState } from '../types';
+import type { StateCreator } from 'zustand/vanilla';
+
+export const signInitialState: SignState = {
+ signOptions: {
+ preferNoSetFee: false,
+ preferNoSetMemo: true,
+ disableBalanceCheck: true,
+ },
+ signerOptions: undefined,
+};
+
+export const createSignSlice: StateCreator = (
+ _,
+ get,
+) => ({
+ ...signInitialState,
+ getOfflineSigner: (chainId) => {
+ assertIsDefined(get().wallet);
+
+ return get().wallet!.getOfflineSigner(chainId, get().signOptions);
+ },
+ getOfflineSignerOnlyAmino: (chainId) => {
+ assertIsDefined(get().wallet);
+
+ return get().wallet!.getOfflineSignerOnlyAmino(chainId, get().signOptions);
+ },
+ getOfflineSignerAuto: (chainId) => {
+ assertIsDefined(get().wallet);
+
+ return get().wallet!.getOfflineSignerAuto(chainId, get().signOptions);
+ },
+ signAmino: (chainId, signDoc) => {
+ assertIsDefined(get().wallet);
+
+ const address = get().getAddress(chainId);
+
+ assertIsDefined(address);
+
+ return get().wallet!.signAmino(
+ chainId,
+ address,
+ signDoc,
+ get().signOptions,
+ );
+ },
+ signDirect: (chainId, signDoc) => {
+ assertIsDefined(get().wallet);
+
+ const address = get().getAddress(chainId);
+
+ assertIsDefined(address);
+
+ return get().wallet!.signDirect(
+ chainId,
+ address,
+ signDoc,
+ get().signOptions,
+ );
+ },
+});
diff --git a/packages/store/src/store.ts b/packages/store/src/store.ts
index 1d12842c..2fbaba44 100644
--- a/packages/store/src/store.ts
+++ b/packages/store/src/store.ts
@@ -5,29 +5,18 @@ import {
persist,
} from 'zustand/middleware';
import {
+ configInitialState,
createConfigSlice,
+ connectInitialState,
createConnectSlice,
+ accountInitialState,
createAccountSlice,
+ signInitialState,
+ createSignSlice,
} from './slices';
-import { createSSRStorage } from './utils';
+import { createSSRStorage, noopStorage } from './utils';
import { createStore } from 'zustand/vanilla';
-import type { Wallet } from '@quirks/core';
-import type { AssetLists, Chain } from '@nabla-studio/chain-registry';
-import type { AppState } from './types';
-
-export interface Config {
- wallets: Wallet[];
- chains: Chain[];
- assetsLists: AssetLists[];
- /**
- * State manager persister
- */
- persistOptions?: PersistOptions;
- /**
- * Reinit connection on mount
- */
- autoConnect?: boolean;
-}
+import type { AppState, Config } from './types';
const excludedKeys: (keyof AppState)[] = [
'wallet',
@@ -54,6 +43,32 @@ export const ssrPersistOptions: PersistOptions = {
skipHydration: true,
};
+const emptyPersistOptions: PersistOptions = {
+ ...defaultPersistOptions,
+ storage: createJSONStorage(() => noopStorage),
+};
+
+export let store = createStore(
+ subscribeWithSelector(
+ persist(
+ (...props) => ({
+ ...createConfigSlice(...props),
+ ...createConnectSlice(...props),
+ ...createAccountSlice(...props),
+ ...createSignSlice(...props),
+ reset: () => {
+ props[0]({
+ ...configInitialState,
+ ...connectInitialState,
+ ...accountInitialState,
+ });
+ },
+ }),
+ emptyPersistOptions,
+ ),
+ ),
+);
+
export const createConfig = (config: Config) => {
const {
wallets,
@@ -61,9 +76,21 @@ export const createConfig = (config: Config) => {
assetsLists,
autoConnect = true,
persistOptions = defaultPersistOptions,
+ signOptions,
+ signerOptions,
} = config;
- const store = createStore(
+ const signOverrideOptions = signOptions
+ ? signOptions
+ : signInitialState.signOptions;
+
+ const signOverrideInitialState = {
+ ...signInitialState,
+ signOptions: signOverrideOptions,
+ signerOptions,
+ };
+
+ store = createStore(
subscribeWithSelector(
persist(
(...props) => ({
@@ -73,6 +100,19 @@ export const createConfig = (config: Config) => {
assetsLists,
...createConnectSlice(...props),
...createAccountSlice(...props),
+ ...createSignSlice(...props),
+ ...signOverrideInitialState,
+ reset: () => {
+ props[0]({
+ ...configInitialState,
+ ...connectInitialState,
+ ...accountInitialState,
+ ...signOverrideInitialState,
+ wallets,
+ chains,
+ assetsLists,
+ });
+ },
}),
persistOptions,
),
diff --git a/packages/store/src/types/account.ts b/packages/store/src/types/account.ts
index 6fceb181..9f2112f3 100644
--- a/packages/store/src/types/account.ts
+++ b/packages/store/src/types/account.ts
@@ -8,6 +8,11 @@ export interface AddressWithChain extends Key {
export interface AccountState {
accountName?: string;
accounts: AddressWithChain[];
+}
+
+export interface AccountActions {
getAddress: (chainId: string) => string | undefined;
getAddresses: (chainIds: string[]) => string[];
}
+
+export type AccountSlice = AccountState & AccountActions;
diff --git a/packages/store/src/types/config.ts b/packages/store/src/types/config.ts
index eaf29ddb..d828aa6d 100644
--- a/packages/store/src/types/config.ts
+++ b/packages/store/src/types/config.ts
@@ -5,7 +5,13 @@ export interface ConfigState {
wallets: Wallet[];
chains: Chain[];
assetsLists: AssetLists[];
+}
+
+export interface ConfigActions {
+ getChain: (chainName: string) => Chain | undefined;
setChains: (chains: Chain[]) => void;
setAssetsLists: (assetsLists: AssetLists[]) => void;
setWallets: (wallets: Wallet[]) => void;
}
+
+export type ConfigSlice = ConfigState & ConfigActions;
diff --git a/packages/store/src/types/connect.ts b/packages/store/src/types/connect.ts
index 8ee62773..81b2463c 100644
--- a/packages/store/src/types/connect.ts
+++ b/packages/store/src/types/connect.ts
@@ -25,9 +25,14 @@ export interface ConnectState {
wallet?: Wallet;
status: ConnectionState;
reconnectionStatus: ReconnectionState;
+}
+
+export interface ConnectActions {
setWallet: (wallet?: Wallet) => void;
getWalletData: () => void;
connect: (walletName: string) => void;
reconnect: (walletName: string) => void;
disconnect: () => void;
}
+
+export type ConnectSlice = ConnectState & ConnectActions;
diff --git a/packages/store/src/types/index.ts b/packages/store/src/types/index.ts
index 741d90b9..16b26006 100644
--- a/packages/store/src/types/index.ts
+++ b/packages/store/src/types/index.ts
@@ -2,3 +2,5 @@ export * from './config';
export * from './store';
export * from './connect';
export * from './account';
+export * from './sign';
+export * from './options';
diff --git a/packages/store/src/types/options.ts b/packages/store/src/types/options.ts
new file mode 100644
index 00000000..00b16d7e
--- /dev/null
+++ b/packages/store/src/types/options.ts
@@ -0,0 +1,44 @@
+import type { SignOptions, Wallet } from '@quirks/core';
+import type { AssetLists, Chain } from '@nabla-studio/chain-registry';
+import type {
+ SigningStargateClientOptions,
+ StargateClientOptions,
+} from '@cosmjs/stargate';
+import type { SigningCosmWasmClientOptions } from '@cosmjs/cosmwasm-stargate';
+import type { PersistOptions } from 'zustand/middleware';
+import type { AppState } from './store';
+
+export interface SignerOptions {
+ stargate?: (chain: Chain) => StargateClientOptions | undefined;
+ signingStargate?: (chain: Chain) => SigningStargateClientOptions | undefined;
+ signingCosmwasm?: (chain: Chain) => SigningCosmWasmClientOptions | undefined;
+}
+
+export interface Config {
+ wallets: Wallet[];
+ chains: Chain[];
+ assetsLists: AssetLists[];
+ /**
+ * State manager persister
+ */
+ persistOptions?: PersistOptions;
+ /**
+ * Reinit connection on mount
+ *
+ * @default true
+ */
+ autoConnect?: boolean;
+ /**
+ * Specify custom sign option
+ *
+ * @default
+ *
+ * {
+ * preferNoSetFee: false,
+ * preferNoSetMemo: true,
+ * disableBalanceCheck: true,
+ * }
+ */
+ signOptions?: SignOptions;
+ signerOptions?: SignerOptions;
+}
diff --git a/packages/store/src/types/sign.ts b/packages/store/src/types/sign.ts
new file mode 100644
index 00000000..b54aaf0e
--- /dev/null
+++ b/packages/store/src/types/sign.ts
@@ -0,0 +1,37 @@
+import type {
+ AminoSignResponse,
+ OfflineAminoSigner,
+ StdSignDoc,
+} from '@cosmjs/amino';
+import type {
+ DirectSignResponse,
+ OfflineDirectSigner,
+} from '@cosmjs/proto-signing';
+import type { SignOptions } from '@quirks/core';
+import type { SignDoc } from 'cosmjs-types/cosmos/tx/v1beta1/tx';
+import type { SignerOptions } from './options';
+
+export interface SignState {
+ signOptions: SignOptions;
+ signerOptions?: SignerOptions;
+}
+
+export interface SignActions {
+ getOfflineSigner: (
+ chainId: string,
+ ) => Promise;
+ getOfflineSignerOnlyAmino: (chainId: string) => Promise;
+ getOfflineSignerAuto: (
+ chainId: string,
+ ) => Promise;
+ signAmino: (
+ chainId: string,
+ signDoc: StdSignDoc,
+ ) => Promise;
+ signDirect: (
+ chainId: string,
+ signDoc: SignDoc,
+ ) => Promise;
+}
+
+export type SignSlice = SignState & SignActions;
diff --git a/packages/store/src/types/store.ts b/packages/store/src/types/store.ts
index ba51fbc9..f8c786ea 100644
--- a/packages/store/src/types/store.ts
+++ b/packages/store/src/types/store.ts
@@ -1,5 +1,14 @@
-import { AccountState } from './account';
-import { ConfigState } from './config';
-import { ConnectState } from './connect';
+import { SignSlice } from './sign';
+import { AccountSlice } from './account';
+import { ConfigSlice } from './config';
+import { ConnectSlice } from './connect';
-export type AppState = ConfigState & ConnectState & AccountState;
+export interface AppActions {
+ reset: () => void;
+}
+
+export type AppState = ConfigSlice &
+ ConnectSlice &
+ AccountSlice &
+ SignSlice &
+ AppActions;
diff --git a/packages/store/src/utils/index.ts b/packages/store/src/utils/index.ts
index e8ceb432..8356b716 100644
--- a/packages/store/src/utils/index.ts
+++ b/packages/store/src/utils/index.ts
@@ -1,2 +1,3 @@
export * from './storage';
export * from './selectors';
+export * from './suggestions';
diff --git a/packages/store/src/utils/suggestions.ts b/packages/store/src/utils/suggestions.ts
new file mode 100644
index 00000000..ed1122f7
--- /dev/null
+++ b/packages/store/src/utils/suggestions.ts
@@ -0,0 +1,22 @@
+import { SuggestChain, SuggestToken, assertIsDefined } from '@quirks/core';
+import { store } from '../store';
+
+export const suggestChains = (walletName: string, chains: SuggestChain[]) => {
+ const state = store.getState();
+
+ const wallet = state.wallets.find((el) => el.options.name === walletName);
+
+ assertIsDefined(wallet);
+
+ return wallet.suggestChains(chains);
+};
+
+export const suggestTokens = (walletName: string, tokens: SuggestToken[]) => {
+ const state = store.getState();
+
+ const wallet = state.wallets.find((el) => el.options.name === walletName);
+
+ assertIsDefined(wallet);
+
+ return wallet.suggestTokens(tokens);
+};
diff --git a/packages/store/vite.config.ts b/packages/store/vite.config.ts
index dcd019fd..01ae0b7d 100644
--- a/packages/store/vite.config.ts
+++ b/packages/store/vite.config.ts
@@ -34,7 +34,20 @@ export default defineConfig({
},
rollupOptions: {
// External packages that should not be bundled into your library.
- external: ['zustand', 'zustand/middleware', 'zustand/vanilla'],
+ external: [
+ 'zustand',
+ 'zustand/middleware',
+ 'zustand/vanilla',
+ '@cosmjs/amino',
+ '@cosmjs/proto-signing',
+ '@cosmjs/stargate',
+ '@cosmjs/cosmwasm-stargate',
+ '@cosmjs/stargate',
+ 'cosmjs-types',
+ 'cosmjs-types/cosmos/tx/v1beta1/tx',
+ '@quirks/core',
+ '@nabla-studio/chain-registry',
+ ],
},
},
diff --git a/packages/wallets/src/keplr/extension.ts b/packages/wallets/src/keplr/extension.ts
index 9ab80709..f86e90dc 100644
--- a/packages/wallets/src/keplr/extension.ts
+++ b/packages/wallets/src/keplr/extension.ts
@@ -2,6 +2,7 @@ import type {
OfflineAminoSigner,
StdSignDoc,
AminoSignResponse,
+ StdSignature,
} from '@cosmjs/amino';
import type {
OfflineDirectSigner,
@@ -116,6 +117,27 @@ export class KeplrWalletExtension extends ExtensionWallet {
);
}
+ override signArbitrary(
+ chainId: string,
+ signer: string,
+ data: string | Uint8Array,
+ ): Promise {
+ assertIsDefined(this.client);
+
+ return this.client.signArbitrary(chainId, signer, data);
+ }
+
+ override verifyArbitrary(
+ chainId: string,
+ signer: string,
+ data: string | Uint8Array,
+ signature: StdSignature,
+ ): Promise {
+ assertIsDefined(this.client);
+
+ return this.client.verifyArbitrary(chainId, signer, data, signature);
+ }
+
override async suggestTokens(suggestions: SuggestToken[]): Promise {
assertIsDefined(this.client);
diff --git a/packages/wallets/src/leap/extension.ts b/packages/wallets/src/leap/extension.ts
index b9487199..cdc7e6a5 100644
--- a/packages/wallets/src/leap/extension.ts
+++ b/packages/wallets/src/leap/extension.ts
@@ -2,6 +2,7 @@ import type {
OfflineAminoSigner,
StdSignDoc,
AminoSignResponse,
+ StdSignature,
} from '@cosmjs/amino';
import type {
OfflineDirectSigner,
@@ -120,6 +121,27 @@ export class LeapWalletExtension extends ExtensionWallet {
);
}
+ override signArbitrary(
+ chainId: string,
+ signer: string,
+ data: string | Uint8Array,
+ ): Promise {
+ assertIsDefined(this.client);
+
+ return this.client.signArbitrary(chainId, signer, data);
+ }
+
+ override verifyArbitrary(
+ chainId: string,
+ signer: string,
+ data: string | Uint8Array,
+ signature: StdSignature,
+ ): Promise {
+ assertIsDefined(this.client);
+
+ return this.client.verifyArbitrary(chainId, signer, data, signature);
+ }
+
override async suggestTokens(suggestions: SuggestToken[]): Promise {
assertIsDefined(this.client);
diff --git a/packages/wallets/vite.config.ts b/packages/wallets/vite.config.ts
index c9534de0..cda05fd2 100644
--- a/packages/wallets/vite.config.ts
+++ b/packages/wallets/vite.config.ts
@@ -36,11 +36,14 @@ export default defineConfig({
// External packages that should not be bundled into your library.
external: [
'cosmjs-types',
+ 'cosmjs-types/cosmos/tx/v1beta1/tx',
'@keplr-wallet/types',
'@cosmjs/proto-signing',
'@cosmjs/amino',
'semver',
'long',
+ '@quirks/core',
+ '@nabla-studio/chain-registry',
],
},
},
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index bfc1a582..4903b2a6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,12 +11,21 @@ dependencies:
'@cosmjs/amino':
specifier: ^0.31.3
version: 0.31.3
+ '@cosmjs/cosmwasm-stargate':
+ specifier: ^0.31.3
+ version: 0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
'@cosmjs/proto-signing':
specifier: ^0.31.3
version: 0.31.3
+ '@cosmjs/stargate':
+ specifier: ^0.31.3
+ version: 0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
'@keplr-wallet/cosmos':
specifier: ^0.12.38
version: 0.12.38
+ bufferutil:
+ specifier: ^4.0.8
+ version: 4.0.8
cosmjs-types:
specifier: ^0.9.0
version: 0.9.0
@@ -29,6 +38,9 @@ dependencies:
next:
specifier: 13.5.6
version: 13.5.6(@babel/core@7.23.2)(react-dom@18.2.0)(react@18.2.0)
+ osmojs:
+ specifier: ^16.5.1
+ version: 16.5.1(bufferutil@4.0.8)(utf-8-validate@6.0.3)
react:
specifier: 18.2.0
version: 18.2.0
@@ -38,6 +50,9 @@ dependencies:
semver:
specifier: ^7.5.4
version: 7.5.4
+ utf-8-validate:
+ specifier: ^6.0.3
+ version: 6.0.3
zustand:
specifier: ^4.4.4
version: 4.4.4(@types/react@18.2.31)(react@18.2.0)
@@ -165,10 +180,10 @@ devDependencies:
version: 29.7.0(@types/node@20.8.8)(ts-node@10.9.1)
jest-environment-jsdom:
specifier: ^29.7.0
- version: 29.7.0
+ version: 29.7.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)
jsdom:
specifier: ^22.1.0
- version: 22.1.0
+ version: 22.1.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)
json-schema-to-typescript:
specifier: ^13.1.1
version: 13.1.1
@@ -1505,7 +1520,6 @@ packages:
engines: {node: '>=6.9.0'}
dependencies:
regenerator-runtime: 0.14.0
- dev: true
/@babel/template@7.22.15:
resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==}
@@ -1722,6 +1736,22 @@ packages:
chalk: 4.1.2
dev: true
+ /@confio/ics23@0.6.8:
+ resolution: {integrity: sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==}
+ dependencies:
+ '@noble/hashes': 1.3.2
+ protobufjs: 6.11.4
+ dev: false
+
+ /@cosmjs/amino@0.29.3:
+ resolution: {integrity: sha512-BFz1++ERerIggiFc7iGHhGe1CeV3rCv8BvkoBQTBN/ZwzHOaKvqQj8smDlRGlQxX3HWlTwgiLN2A+OB5yX4ZRw==}
+ dependencies:
+ '@cosmjs/crypto': 0.29.5
+ '@cosmjs/encoding': 0.29.5
+ '@cosmjs/math': 0.29.5
+ '@cosmjs/utils': 0.29.5
+ dev: false
+
/@cosmjs/amino@0.31.3:
resolution: {integrity: sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw==}
dependencies:
@@ -1731,6 +1761,38 @@ packages:
'@cosmjs/utils': 0.31.3
dev: false
+ /@cosmjs/cosmwasm-stargate@0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-Uv9TmCn3650gdFeZm7SEfUZF3uX3lfJfFhXOk6I2ZLr/FrKximnlb+vwAfZaZnWYvlA7qrKtHIjeRNHvT23zcw==}
+ dependencies:
+ '@cosmjs/amino': 0.31.3
+ '@cosmjs/crypto': 0.31.3
+ '@cosmjs/encoding': 0.31.3
+ '@cosmjs/math': 0.31.3
+ '@cosmjs/proto-signing': 0.31.3
+ '@cosmjs/stargate': 0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmjs/tendermint-rpc': 0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmjs/utils': 0.31.3
+ cosmjs-types: 0.8.0
+ long: 4.0.0
+ pako: 2.1.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+ dev: false
+
+ /@cosmjs/crypto@0.29.5:
+ resolution: {integrity: sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ==}
+ dependencies:
+ '@cosmjs/encoding': 0.29.5
+ '@cosmjs/math': 0.29.5
+ '@cosmjs/utils': 0.29.5
+ '@noble/hashes': 1.3.2
+ bn.js: 5.2.1
+ elliptic: 6.5.4
+ libsodium-wrappers: 0.7.13
+ dev: false
+
/@cosmjs/crypto@0.31.3:
resolution: {integrity: sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ==}
dependencies:
@@ -1743,6 +1805,14 @@ packages:
libsodium-wrappers-sumo: 0.7.13
dev: false
+ /@cosmjs/encoding@0.29.5:
+ resolution: {integrity: sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ==}
+ dependencies:
+ base64-js: 1.5.1
+ bech32: 1.1.4
+ readonly-date: 1.0.0
+ dev: false
+
/@cosmjs/encoding@0.31.3:
resolution: {integrity: sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg==}
dependencies:
@@ -1751,12 +1821,44 @@ packages:
readonly-date: 1.0.0
dev: false
+ /@cosmjs/json-rpc@0.29.5:
+ resolution: {integrity: sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w==}
+ dependencies:
+ '@cosmjs/stream': 0.29.5
+ xstream: 11.14.0
+ dev: false
+
+ /@cosmjs/json-rpc@0.31.3:
+ resolution: {integrity: sha512-7LVYerXjnm69qqYR3uA6LGCrBW2EO5/F7lfJxAmY+iII2C7xO3a0vAjMSt5zBBh29PXrJVS6c2qRP22W1Le2Wg==}
+ dependencies:
+ '@cosmjs/stream': 0.31.3
+ xstream: 11.14.0
+ dev: false
+
+ /@cosmjs/math@0.29.5:
+ resolution: {integrity: sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q==}
+ dependencies:
+ bn.js: 5.2.1
+ dev: false
+
/@cosmjs/math@0.31.3:
resolution: {integrity: sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A==}
dependencies:
bn.js: 5.2.1
dev: false
+ /@cosmjs/proto-signing@0.29.3:
+ resolution: {integrity: sha512-Ai3l9THjMOrLJ4Ebn1Dgptwg6W5ZIRJqtnJjijHhGwTVC1WT0WdYU3aMZ7+PwubcA/cA1rH4ZTK7jrfYbra63g==}
+ dependencies:
+ '@cosmjs/amino': 0.29.3
+ '@cosmjs/crypto': 0.29.5
+ '@cosmjs/encoding': 0.29.5
+ '@cosmjs/math': 0.29.5
+ '@cosmjs/utils': 0.29.5
+ cosmjs-types: 0.5.2
+ long: 4.0.0
+ dev: false
+
/@cosmjs/proto-signing@0.31.3:
resolution: {integrity: sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA==}
dependencies:
@@ -1769,10 +1871,139 @@ packages:
long: 4.0.0
dev: false
+ /@cosmjs/socket@0.29.5(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ==}
+ dependencies:
+ '@cosmjs/stream': 0.29.5
+ isomorphic-ws: 4.0.1(ws@7.5.9)
+ ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: false
+
+ /@cosmjs/socket@0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-aqrDGGi7os/hsz5p++avI4L0ZushJ+ItnzbqA7C6hamFSCJwgOkXaOUs+K9hXZdX4rhY7rXO4PH9IH8q09JkTw==}
+ dependencies:
+ '@cosmjs/stream': 0.31.3
+ isomorphic-ws: 4.0.1(ws@7.5.9)
+ ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+ dev: false
+
+ /@cosmjs/stargate@0.29.3(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-455TgXStCi6E8KDjnhDAM8wt6aLSjobH4Dixvd7Up1DfCH6UB9NkC/G0fMJANNcNXMaM4wSX14niTXwD1d31BA==}
+ dependencies:
+ '@confio/ics23': 0.6.8
+ '@cosmjs/amino': 0.29.3
+ '@cosmjs/encoding': 0.29.5
+ '@cosmjs/math': 0.29.5
+ '@cosmjs/proto-signing': 0.29.3
+ '@cosmjs/stream': 0.29.5
+ '@cosmjs/tendermint-rpc': 0.29.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmjs/utils': 0.29.5
+ cosmjs-types: 0.5.2
+ long: 4.0.0
+ protobufjs: 6.11.4
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+ dev: false
+
+ /@cosmjs/stargate@0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-53NxnzmB9FfXpG4KjOUAYAvWLYKdEmZKsutcat/u2BrDXNZ7BN8jim/ENcpwXfs9/Og0K24lEIdvA4gsq3JDQw==}
+ dependencies:
+ '@confio/ics23': 0.6.8
+ '@cosmjs/amino': 0.31.3
+ '@cosmjs/encoding': 0.31.3
+ '@cosmjs/math': 0.31.3
+ '@cosmjs/proto-signing': 0.31.3
+ '@cosmjs/stream': 0.31.3
+ '@cosmjs/tendermint-rpc': 0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmjs/utils': 0.31.3
+ cosmjs-types: 0.8.0
+ long: 4.0.0
+ protobufjs: 6.11.4
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+ dev: false
+
+ /@cosmjs/stream@0.29.5:
+ resolution: {integrity: sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA==}
+ dependencies:
+ xstream: 11.14.0
+ dev: false
+
+ /@cosmjs/stream@0.31.3:
+ resolution: {integrity: sha512-8keYyI7X0RjsLyVcZuBeNjSv5FA4IHwbFKx7H60NHFXszN8/MvXL6aZbNIvxtcIHHsW7K9QSQos26eoEWlAd+w==}
+ dependencies:
+ xstream: 11.14.0
+ dev: false
+
+ /@cosmjs/tendermint-rpc@0.29.5(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w==}
+ dependencies:
+ '@cosmjs/crypto': 0.29.5
+ '@cosmjs/encoding': 0.29.5
+ '@cosmjs/json-rpc': 0.29.5
+ '@cosmjs/math': 0.29.5
+ '@cosmjs/socket': 0.29.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmjs/stream': 0.29.5
+ '@cosmjs/utils': 0.29.5
+ axios: 0.21.4
+ readonly-date: 1.0.0
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+ dev: false
+
+ /@cosmjs/tendermint-rpc@0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-s3TiWkPCW4QceTQjpYqn4xttUJH36mTPqplMl+qyocdqk5+X5mergzExU/pHZRWQ4pbby8bnR7kMvG4OC1aZ8g==}
+ dependencies:
+ '@cosmjs/crypto': 0.31.3
+ '@cosmjs/encoding': 0.31.3
+ '@cosmjs/json-rpc': 0.31.3
+ '@cosmjs/math': 0.31.3
+ '@cosmjs/socket': 0.31.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmjs/stream': 0.31.3
+ '@cosmjs/utils': 0.31.3
+ axios: 0.21.4
+ readonly-date: 1.0.0
+ xstream: 11.14.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+ dev: false
+
+ /@cosmjs/utils@0.29.5:
+ resolution: {integrity: sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ==}
+ dev: false
+
/@cosmjs/utils@0.31.3:
resolution: {integrity: sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA==}
dev: false
+ /@cosmology/lcd@0.12.0:
+ resolution: {integrity: sha512-f2mcySYO1xdislAhuWtNFmg4q/bzY3Aem2UkDzYzI0ZELVev5i2Pi0bQrYUNTeNg1isAo0Kyrdqj/4YPqEwjGA==}
+ dependencies:
+ '@babel/runtime': 7.23.2
+ axios: 0.27.2
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
/@cspotcode/source-map-support@0.8.1:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
@@ -5003,7 +5234,6 @@ packages:
/asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
- dev: true
/atomic-sleep@1.0.0:
resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
@@ -5028,6 +5258,23 @@ packages:
engines: {node: '>=4'}
dev: true
+ /axios@0.21.4:
+ resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
+ dependencies:
+ follow-redirects: 1.15.3
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
+ /axios@0.27.2:
+ resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
+ dependencies:
+ follow-redirects: 1.15.3
+ form-data: 4.0.0
+ transitivePeerDependencies:
+ - debug
+ dev: false
+
/axios@1.5.1:
resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==}
dependencies:
@@ -5376,6 +5623,13 @@ packages:
base64-js: 1.5.1
ieee754: 1.2.1
+ /bufferutil@4.0.8:
+ resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==}
+ engines: {node: '>=6.14.2'}
+ requiresBuild: true
+ dependencies:
+ node-gyp-build: 4.6.1
+
/builtins@5.0.1:
resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==}
dependencies:
@@ -5641,7 +5895,6 @@ packages:
engines: {node: '>= 0.8'}
dependencies:
delayed-stream: 1.0.0
- dev: true
/commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -5964,6 +6217,13 @@ packages:
typescript: 5.2.2
dev: true
+ /cosmjs-types@0.5.2:
+ resolution: {integrity: sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg==}
+ dependencies:
+ long: 4.0.0
+ protobufjs: 6.11.4
+ dev: false
+
/cosmjs-types@0.8.0:
resolution: {integrity: sha512-Q2Mj95Fl0PYMWEhA2LuGEIhipF7mQwd9gTQ85DdP9jjjopeoGaDxvmPa5nakNzsq7FnO1DMTatXTAx6bxMH7Lg==}
dependencies:
@@ -6259,7 +6519,6 @@ packages:
get-intrinsic: 1.2.2
gopd: 1.0.1
has-property-descriptors: 1.0.1
- dev: true
/define-lazy-prop@2.0.0:
resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
@@ -6273,7 +6532,6 @@ packages:
define-data-property: 1.1.1
has-property-descriptors: 1.0.1
object-keys: 1.1.1
- dev: true
/delay@4.4.1:
resolution: {integrity: sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==}
@@ -6283,7 +6541,6 @@ packages:
/delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
- dev: true
/depd@2.0.0:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
@@ -7335,7 +7592,6 @@ packages:
peerDependenciesMeta:
debug:
optional: true
- dev: true
/for-each@0.3.3:
resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
@@ -7371,7 +7627,6 @@ packages:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
- dev: true
/forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
@@ -7419,7 +7674,6 @@ packages:
/function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- dev: true
/function.prototype.name@1.1.6:
resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
@@ -7455,7 +7709,6 @@ packages:
has-proto: 1.0.1
has-symbols: 1.0.3
hasown: 2.0.0
- dev: true
/get-package-type@0.1.0:
resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
@@ -7653,7 +7906,6 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
define-properties: 1.2.1
- dev: true
/globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
@@ -7683,7 +7935,6 @@ packages:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
get-intrinsic: 1.2.2
- dev: true
/graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -7745,17 +7996,14 @@ packages:
resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==}
dependencies:
get-intrinsic: 1.2.2
- dev: true
/has-proto@1.0.1:
resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
engines: {node: '>= 0.4'}
- dev: true
/has-symbols@1.0.3:
resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
engines: {node: '>= 0.4'}
- dev: true
/has-tostringtag@1.0.0:
resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
@@ -7790,7 +8038,6 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
function-bind: 1.1.2
- dev: true
/he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
@@ -8291,6 +8538,14 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /isomorphic-ws@4.0.1(ws@7.5.9):
+ resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==}
+ peerDependencies:
+ ws: '*'
+ dependencies:
+ ws: 7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ dev: false
+
/isstream@0.1.2:
resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
dev: true
@@ -8519,7 +8774,7 @@ packages:
pretty-format: 29.7.0
dev: true
- /jest-environment-jsdom@29.7.0:
+ /jest-environment-jsdom@29.7.0(bufferutil@4.0.8)(utf-8-validate@6.0.3):
resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies:
@@ -8535,7 +8790,7 @@ packages:
'@types/node': 20.8.8
jest-mock: 29.7.0
jest-util: 29.7.0
- jsdom: 20.0.3
+ jsdom: 20.0.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -8857,7 +9112,7 @@ packages:
resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
dev: true
- /jsdom@20.0.3:
+ /jsdom@20.0.3(bufferutil@4.0.8)(utf-8-validate@6.0.3):
resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
engines: {node: '>=14'}
peerDependencies:
@@ -8890,7 +9145,7 @@ packages:
whatwg-encoding: 2.0.0
whatwg-mimetype: 3.0.0
whatwg-url: 11.0.0
- ws: 8.14.2
+ ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)
xml-name-validator: 4.0.0
transitivePeerDependencies:
- bufferutil
@@ -8898,7 +9153,7 @@ packages:
- utf-8-validate
dev: true
- /jsdom@22.1.0:
+ /jsdom@22.1.0(bufferutil@4.0.8)(utf-8-validate@6.0.3):
resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==}
engines: {node: '>=16'}
peerDependencies:
@@ -8928,7 +9183,7 @@ packages:
whatwg-encoding: 2.0.0
whatwg-mimetype: 3.0.0
whatwg-url: 12.0.1
- ws: 8.14.2
+ ws: 8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3)
xml-name-validator: 4.0.0
transitivePeerDependencies:
- bufferutil
@@ -9160,6 +9415,16 @@ packages:
libsodium-sumo: 0.7.13
dev: false
+ /libsodium-wrappers@0.7.13:
+ resolution: {integrity: sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==}
+ dependencies:
+ libsodium: 0.7.13
+ dev: false
+
+ /libsodium@0.7.13:
+ resolution: {integrity: sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==}
+ dev: false
+
/lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
dev: true
@@ -9508,14 +9773,12 @@ packages:
/mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
- dev: true
/mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
dependencies:
mime-db: 1.52.0
- dev: true
/mime@1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
@@ -9786,7 +10049,6 @@ packages:
/node-gyp-build@4.6.1:
resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==}
hasBin: true
- dev: true
/node-int64@0.4.0:
resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
@@ -9940,7 +10202,6 @@ packages:
/object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
- dev: true
/object.assign@4.1.4:
resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
@@ -10084,6 +10345,20 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /osmojs@16.5.1(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-V2Q2yMt7Paax6i+S5Q1l29Km0As/waXKmSVRe8gtd9he42kcbkpwwk/QUCvgS98XsL7Qz+vas2Tca016uBQHTQ==}
+ dependencies:
+ '@cosmjs/amino': 0.29.3
+ '@cosmjs/proto-signing': 0.29.3
+ '@cosmjs/stargate': 0.29.3(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmjs/tendermint-rpc': 0.29.5(bufferutil@4.0.8)(utf-8-validate@6.0.3)
+ '@cosmology/lcd': 0.12.0
+ transitivePeerDependencies:
+ - bufferutil
+ - debug
+ - utf-8-validate
+ dev: false
+
/p-limit@1.3.0:
resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
engines: {node: '>=4'}
@@ -10143,6 +10418,10 @@ packages:
engines: {node: '>=6'}
dev: true
+ /pako@2.1.0:
+ resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
+ dev: false
+
/parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@@ -10652,7 +10931,6 @@ packages:
/regenerator-runtime@0.14.0:
resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==}
- dev: true
/regenerator-transform@0.15.2:
resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
@@ -11427,6 +11705,11 @@ packages:
picocolors: 1.0.0
dev: true
+ /symbol-observable@2.0.3:
+ resolution: {integrity: sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==}
+ engines: {node: '>=0.10'}
+ dev: false
+
/symbol-tree@3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
dev: true
@@ -12086,6 +12369,13 @@ packages:
react: 18.2.0
dev: false
+ /utf-8-validate@6.0.3:
+ resolution: {integrity: sha512-uIuGf9TWQ/y+0Lp+KGZCMuJWc3N9BHA+l/UmHd/oUHwJJDeysyTRxNQVkbzsIWfGFbRe3OcgML/i0mvVRPOyDA==}
+ engines: {node: '>=6.14.2'}
+ requiresBuild: true
+ dependencies:
+ node-gyp-build: 4.6.1
+
/util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -12366,7 +12656,7 @@ packages:
cac: 6.7.14
chai: 4.3.10
debug: 4.3.4
- jsdom: 22.1.0
+ jsdom: 22.1.0(bufferutil@4.0.8)(utf-8-validate@6.0.3)
local-pkg: 0.4.3
magic-string: 0.30.5
pathe: 1.1.1
@@ -12649,7 +12939,23 @@ packages:
signal-exit: 3.0.7
dev: true
- /ws@8.14.2:
+ /ws@7.5.9(bufferutil@4.0.8)(utf-8-validate@6.0.3):
+ resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
+ engines: {node: '>=8.3.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ dependencies:
+ bufferutil: 4.0.8
+ utf-8-validate: 6.0.3
+ dev: false
+
+ /ws@8.14.2(bufferutil@4.0.8)(utf-8-validate@6.0.3):
resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==}
engines: {node: '>=10.0.0'}
peerDependencies:
@@ -12660,6 +12966,9 @@ packages:
optional: true
utf-8-validate:
optional: true
+ dependencies:
+ bufferutil: 4.0.8
+ utf-8-validate: 6.0.3
dev: true
/xml-name-validator@4.0.0:
@@ -12671,6 +12980,13 @@ packages:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
dev: true
+ /xstream@11.14.0:
+ resolution: {integrity: sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==}
+ dependencies:
+ globalthis: 1.0.3
+ symbol-observable: 2.0.3
+ dev: false
+
/xtend@4.0.2:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}