From 97fa94c2ac4111f04328043af25e9e0da7d45156 Mon Sep 17 00:00:00 2001 From: mikasackermn Date: Wed, 29 Nov 2023 06:25:47 +0000 Subject: [PATCH] feat: support Cosmos Snap for Metamask --- .eslintrc.json | 3 +- signers/signer-cosmos-snap/CHANGELOG.md | 58 ++++++ signers/signer-cosmos-snap/package.json | 35 ++++ signers/signer-cosmos-snap/readme.md | 1 + signers/signer-cosmos-snap/src/helper.ts | 157 +++++++++++++++ signers/signer-cosmos-snap/src/index.ts | 1 + signers/signer-cosmos-snap/src/signer.ts | 43 +++++ signers/signer-cosmos-snap/tsconfig.json | 11 ++ signers/signer-cosmos/src/helpers.ts | 4 +- signers/signer-cosmos/src/index.ts | 2 +- wallets/provider-metamask/src/helpers.ts | 8 +- wallets/provider-metamask/src/index.ts | 31 ++- wallets/provider-metamask/src/signer.ts | 11 +- wallets/provider-metamask/src/snap.ts | 81 ++++++++ .../src/signers/cosmos.ts | 4 +- wallets/shared/src/providers.ts | 40 ++-- yarn.lock | 181 ++++++++++++++++++ 17 files changed, 632 insertions(+), 39 deletions(-) create mode 100644 signers/signer-cosmos-snap/CHANGELOG.md create mode 100644 signers/signer-cosmos-snap/package.json create mode 100644 signers/signer-cosmos-snap/readme.md create mode 100644 signers/signer-cosmos-snap/src/helper.ts create mode 100644 signers/signer-cosmos-snap/src/index.ts create mode 100644 signers/signer-cosmos-snap/src/signer.ts create mode 100644 signers/signer-cosmos-snap/tsconfig.json create mode 100644 wallets/provider-metamask/src/snap.ts diff --git a/.eslintrc.json b/.eslintrc.json index 4c850713de..fad5b7ed87 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -21,8 +21,7 @@ "parserOptions": { "ecmaVersion": "latest", "sourceType": "module", - // "project": ["tsconfig.base.json"] - "project": true + "project": ["tsconfig.base.json"] }, "rules": { "no-extra-boolean-cast": "off", diff --git a/signers/signer-cosmos-snap/CHANGELOG.md b/signers/signer-cosmos-snap/CHANGELOG.md new file mode 100644 index 0000000000..c1013abba3 --- /dev/null +++ b/signers/signer-cosmos-snap/CHANGELOG.md @@ -0,0 +1,58 @@ +# [0.14.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.13.0...signer-evm@0.14.0) (2023-08-03) + + + +# [0.13.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.12.0...signer-evm@0.13.0) (2023-08-01) + + + +# [0.9.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.8.0...signer-evm@0.9.0) (2023-07-31) + + +### Features + +* Support for WalletConnect 2 ([faedef0](https://github.com/rango-exchange/rango-client/commit/faedef0b5e6fc3c5ef881cbbe4ec05334cc1c910)) +* support safe wallet ([d04cbcd](https://github.com/rango-exchange/rango-client/commit/d04cbcd2a612755563512d9dff6f2312088d8b4d)) + + + +# [0.7.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.6.0...signer-evm@0.7.0) (2023-07-11) + + + +# [0.6.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.5.0...signer-evm@0.6.0) (2023-07-11) + + +### Bug Fixes + +* better parsing of evm rpc errors ([f23031a](https://github.com/rango-exchange/rango-client/commit/f23031ae14e6e841ee488591bd1bf58cfa7ca15b)) +* fix signer wait change network issues ([e453db6](https://github.com/rango-exchange/rango-client/commit/e453db6ccf7736e36e5ada0c29502be32254fe9c)) +* show tenderly error on call exception ([c218f49](https://github.com/rango-exchange/rango-client/commit/c218f49f3330706d9262b0cf3ec8e293e91e3729)) + + + +# [0.5.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.4.0...signer-evm@0.5.0) (2023-05-31) + + + +# [0.4.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.3.0...signer-evm@0.4.0) (2023-05-31) + + + +# [0.3.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.2.0...signer-evm@0.3.0) (2023-05-30) + + + +# [0.2.0](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.1.14...signer-evm@0.2.0) (2023-05-30) + + + +## [0.1.13](https://github.com/rango-exchange/rango-client/compare/signer-evm@0.1.12...signer-evm@0.1.13) (2023-05-15) + + +### Bug Fixes + +* update rango-types and fix notification bugs ([993f185](https://github.com/rango-exchange/rango-client/commit/993f185e0b8c5e5e15a2c65ba2d85d1f9c8daa90)) + + + diff --git a/signers/signer-cosmos-snap/package.json b/signers/signer-cosmos-snap/package.json new file mode 100644 index 0000000000..1126ec42aa --- /dev/null +++ b/signers/signer-cosmos-snap/package.json @@ -0,0 +1,35 @@ +{ + "name": "@rango-dev/signer-cosmos-snap", + "version": "0.17.0", + "license": "MIT", + "type": "module", + "module": "./dist/index.js", + "main": "./dist/index.js", + "exports": { + ".": "./dist/index.js" + }, + "typings": "dist/index.d.ts", + "files": [ + "dist", + "src" + ], + "scripts": { + "build": "node ../../scripts/build/command.mjs --path signers/signer-cosmos-snap", + "clean": "rimraf dist", + "format": "prettier --write '{.,src}/**/*.{ts,tsx}'", + "lint": "eslint \"**/*.{ts,tsx}\" --ignore-path ../../.eslintignore", + "test": "vitest", + "test:watch": "vitest --watch", + "test:coverage": "vitest run --coverage" + }, + "dependencies": { + "rango-types": "^0.1.46", + "@cosmjs/amino": "^0.31.3", + "@cosmjs/proto-signing": "^0.30.1", + "@cosmjs/stargate": "^0.31.1", + "@rango-dev/signer-cosmos": "^0.17.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/signers/signer-cosmos-snap/readme.md b/signers/signer-cosmos-snap/readme.md new file mode 100644 index 0000000000..1d66ea3e2b --- /dev/null +++ b/signers/signer-cosmos-snap/readme.md @@ -0,0 +1 @@ +# @rango-dev/signer-evm diff --git a/signers/signer-cosmos-snap/src/helper.ts b/signers/signer-cosmos-snap/src/helper.ts new file mode 100644 index 0000000000..8662b28f5e --- /dev/null +++ b/signers/signer-cosmos-snap/src/helper.ts @@ -0,0 +1,157 @@ +import type { AminoSignResponse, StdSignDoc } from '@cosmjs/amino'; +import type { DirectSignResponse } from '@cosmjs/proto-signing'; +import type { DeliverTxResponse } from '@cosmjs/stargate'; +import type { CosmosTransaction } from 'rango-types'; + +import { makeSignDoc } from '@cosmjs/amino'; +import { getSignedTx } from '@rango-dev/signer-cosmos'; +import { SignerError, SignerErrorCode } from 'rango-types'; + +export const DEFAULT_SNAP_ID = 'npm:@cosmsnap/snap'; + +const signAmino = async ( + chain_id: string, + signer: string, + sign_doc: StdSignDoc, + provider: any +): Promise => { + const result = await provider.request({ + method: 'wallet_invokeSnap', + params: { + snapId: DEFAULT_SNAP_ID, + request: { + method: 'signAmino', + params: { + chain_id, + sign_doc, + signer, + }, + }, + }, + }); + return result.data; +}; + +interface SnapResponse { + data: T; + success: boolean; + statusCode: number; +} + +export const signDirect = async ( + chain_id: string, + signer: string, + sign_doc: { + bodyBytes?: Uint8Array | null; + authInfoBytes?: Uint8Array | null; + chainId?: string | null; + accountNumber?: Long | null; + }, + provider: any +): Promise => { + const result: SnapResponse = await provider.request({ + method: 'wallet_invokeSnap', + params: { + snapId: DEFAULT_SNAP_ID, + request: { + method: 'signDirect', + params: { + chain_id, + sign_doc, + signer, + }, + }, + }, + }); + return result.data; +}; + +const sendTx = async ( + chain_id: string, + tx: Uint8Array, + provider: any +): Promise => { + const result = await provider.request({ + method: 'wallet_invokeSnap', + params: { + snapId: DEFAULT_SNAP_ID, + request: { + method: 'sendTx', + params: { + chain_id, + tx: JSON.stringify(tx), + }, + }, + }, + }); + return result.data; +}; + +export const executeTransaction = async ( + cosmosTx: CosmosTransaction, + provider: any +): Promise => { + if (!provider) { + throw SignerError.AssertionFailed('wallet is null!'); + } + try { + const { sequence, account_number, chainId, msgs, fee, memo, signType } = + cosmosTx.data; + const msgsWithoutType = msgs.map((m) => ({ + ...m, + __type: undefined, + '@type': undefined, + })); + if (!chainId) { + throw SignerError.AssertionFailed('chainId is undefined from server'); + } + if (!account_number) { + throw SignerError.AssertionFailed( + 'account_number is undefined from server' + ); + } + if (!sequence) { + throw SignerError.AssertionFailed('sequence is undefined from server'); + } + if (signType === 'AMINO') { + const signDoc = makeSignDoc( + msgsWithoutType as any, + fee as any, + chainId, + memo || undefined, + account_number, + sequence + ); + + let signResponse; + try { + signResponse = await signAmino( + chainId, + cosmosTx.fromWalletAddress, + signDoc, + provider + ); + } catch (err) { + throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, err); + } + const signedTx = getSignedTx(cosmosTx, signResponse); + + const result = await sendTx(chainId, signedTx, provider); + console.log({ result }); + } else if (signType === 'DIRECT') { + console.log('Direct'); + } + + throw new SignerError( + SignerErrorCode.OPERATION_UNSUPPORTED, + `Sign type for cosmos not supported, type: ${signType}` + ); + } catch (err) { + console.log({ err }); + if (SignerError.isSignerError(err)) { + throw err; + } else { + throw new SignerError(SignerErrorCode.SEND_TX_ERROR, undefined, err); + } + } +}; diff --git a/signers/signer-cosmos-snap/src/index.ts b/signers/signer-cosmos-snap/src/index.ts new file mode 100644 index 0000000000..276520977d --- /dev/null +++ b/signers/signer-cosmos-snap/src/index.ts @@ -0,0 +1 @@ +export { DefaultCosmosSnapSigner } from './signer'; diff --git a/signers/signer-cosmos-snap/src/signer.ts b/signers/signer-cosmos-snap/src/signer.ts new file mode 100644 index 0000000000..4a5e496d54 --- /dev/null +++ b/signers/signer-cosmos-snap/src/signer.ts @@ -0,0 +1,43 @@ +/* eslint-disable @typescript-eslint/no-magic-numbers */ + +import type { GenericSigner } from 'rango-types'; +import type { CosmosTransaction } from 'rango-types/lib/api/main'; + +import { DEFAULT_SNAP_ID, executeTransaction } from './helper'; + +export class DefaultCosmosSnapSigner + implements GenericSigner +{ + private provider: any; + constructor(provider: any) { + this.provider = provider; + } + async signMessage( + msg: string, + _address: string, + chainId: string | null + ): Promise { + if (!chainId) { + throw Error('ChainId is required'); + } + const result = await this.provider.request({ + method: 'wallet_invokeSnap', + params: { + snapId: DEFAULT_SNAP_ID, + request: { + method: 'txAlert', + params: { + chain_id: chainId, + hash: msg, + }, + }, + }, + }); + return result.data; + } + + async signAndSendTx(tx: CosmosTransaction): Promise<{ hash: string }> { + const hash = await executeTransaction(tx, this.provider); + return { hash }; + } +} diff --git a/signers/signer-cosmos-snap/tsconfig.json b/signers/signer-cosmos-snap/tsconfig.json new file mode 100644 index 0000000000..579fb407b9 --- /dev/null +++ b/signers/signer-cosmos-snap/tsconfig.json @@ -0,0 +1,11 @@ +{ + // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs + "extends": "../../tsconfig.lib.json", + "include": ["src", "types"], + "compilerOptions": { + "outDir": "dist", + "rootDir": "./src", + "lib": ["dom", "esnext"] + // match output dir to input dir. e.g. dist/index instead of dist/src/index + } +} diff --git a/signers/signer-cosmos/src/helpers.ts b/signers/signer-cosmos/src/helpers.ts index f46dd2971a..902b8cdb10 100644 --- a/signers/signer-cosmos/src/helpers.ts +++ b/signers/signer-cosmos/src/helpers.ts @@ -81,7 +81,7 @@ export const executeCosmosTransaction = async ( } catch (err) { throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, err); } - const signedTx = getsignedTx(cosmosTx, signResponse); + const signedTx = getSignedTx(cosmosTx, signResponse); const result = await cosmosProvider.sendTx( chainId, signedTx, @@ -133,7 +133,7 @@ export const executeCosmosTransaction = async ( } }; -export function getsignedTx( +export function getSignedTx( cosmosTx: CosmosTransaction, signResponse: AminoSignResponse ) { diff --git a/signers/signer-cosmos/src/index.ts b/signers/signer-cosmos/src/index.ts index 972181865e..be75ae58de 100644 --- a/signers/signer-cosmos/src/index.ts +++ b/signers/signer-cosmos/src/index.ts @@ -1,2 +1,2 @@ export { DefaultCosmosSigner } from './signer'; -export { executeCosmosTransaction, getsignedTx } from './helpers'; +export { executeCosmosTransaction, getSignedTx } from './helpers'; diff --git a/wallets/provider-metamask/src/helpers.ts b/wallets/provider-metamask/src/helpers.ts index b8253a1c90..848f6efdc8 100644 --- a/wallets/provider-metamask/src/helpers.ts +++ b/wallets/provider-metamask/src/helpers.ts @@ -8,10 +8,10 @@ export function metamask() { if (isCoinbaseWalletAvailable) { // Getting intance from overrided structure from coinbase. return getCoinbaseInstance('metamask'); - } else { - if (!!ethereum && ethereum.isMetaMask) { - return ethereum; - } } + if (!!ethereum && ethereum.isMetaMask) { + return ethereum; + } + return null; } diff --git a/wallets/provider-metamask/src/index.ts b/wallets/provider-metamask/src/index.ts index e017da54eb..9381eca43f 100644 --- a/wallets/provider-metamask/src/index.ts +++ b/wallets/provider-metamask/src/index.ts @@ -2,6 +2,7 @@ import type { CanEagerConnect, CanSwitchNetwork, Connect, + ProviderConnectResult, Subscribe, SwitchNetwork, WalletInfo, @@ -16,10 +17,11 @@ import { switchNetworkForEvm, WalletTypes, } from '@rango-dev/wallets-shared'; -import { evmBlockchains } from 'rango-types'; +import { cosmosBlockchains, evmBlockchains } from 'rango-types'; import { metamask as metamask_instance } from './helpers'; import signer from './signer'; +import { getAddresses, installCosmosSnap, isCosmosSnapInstalled } from './snap'; const WALLET = WalletTypes.META_MASK; @@ -29,18 +31,29 @@ export const config = { export const getInstance = metamask_instance; export const connect: Connect = async ({ instance }) => { + /* + * cosmos snap (It's optional) + * If the user approves to install Snap, we take the Cosmos addresses and add them to the accounts. + */ + await installCosmosSnap(instance); + const installed = await isCosmosSnapInstalled(instance); + let accounts: ProviderConnectResult[] = []; + if (installed) { + const addresses = await getAddresses(instance); + accounts = addresses.map((item) => ({ + accounts: [item.address], + chainId: item.chain_id, + })); + } /* * Note: We need to get `chainId` here, because for the first time * after opening the browser, wallet is locked, and don't give us accounts and chainId * on `check` phase, so `network` will be null. For this case we need to get chainId * whenever we are requesting accounts. */ - const { accounts, chainId } = await getEvmAccounts(instance); - - return { - accounts, - chainId, - }; + const evm = await getEvmAccounts(instance); + accounts = [...accounts, evm]; + return accounts; }; export const subscribe: Subscribe = subscribeToEvm; @@ -57,6 +70,8 @@ export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = ( allBlockChains ) => { const evms = evmBlockchains(allBlockChains); + const cosmos = cosmosBlockchains(allBlockChains); + return { name: 'MetaMask', img: 'https://raw.githubusercontent.com/rango-exchange/assets/main/wallets/metamask/icon.svg', @@ -71,6 +86,6 @@ export const getWalletInfo: (allBlockChains: BlockchainMeta[]) => WalletInfo = ( DEFAULT: 'https://metamask.io/download/', }, color: '#dac7ae', - supportedChains: evms, + supportedChains: [...evms, ...cosmos], }; }; diff --git a/wallets/provider-metamask/src/signer.ts b/wallets/provider-metamask/src/signer.ts index d53ed39e5c..7c753e013c 100644 --- a/wallets/provider-metamask/src/signer.ts +++ b/wallets/provider-metamask/src/signer.ts @@ -1,12 +1,13 @@ +import type { SignerFactory } from 'rango-types'; + +import { DefaultCosmosSnapSigner } from '@rango-dev/signer-cosmos-snap'; import { DefaultEvmSigner } from '@rango-dev/signer-evm'; -import { - DefaultSignerFactory, - SignerFactory, - TransactionType as TxType, -} from 'rango-types'; +import { DefaultSignerFactory, TransactionType as TxType } from 'rango-types'; export default function getSigners(provider: any): SignerFactory { const signers = new DefaultSignerFactory(); signers.registerSigner(TxType.EVM, new DefaultEvmSigner(provider)); + signers.registerSigner(TxType.COSMOS, new DefaultCosmosSnapSigner(provider)); + return signers; } diff --git a/wallets/provider-metamask/src/snap.ts b/wallets/provider-metamask/src/snap.ts new file mode 100644 index 0000000000..ab5ed43883 --- /dev/null +++ b/wallets/provider-metamask/src/snap.ts @@ -0,0 +1,81 @@ +export const DEFAULT_SNAP_ID = 'npm:@cosmsnap/snap'; + +export const isCosmosSnapInstalled = async (instance: any) => { + const result = await instance.request({ method: 'wallet_getSnaps' }); + const installed = Object.keys(result).includes(DEFAULT_SNAP_ID); + + return installed; +}; + +export const isCosmosSnapInitialized = async ( + instance: any +): Promise => { + const initialized = await instance.request({ + method: 'wallet_invokeSnap', + params: { + snapId: DEFAULT_SNAP_ID, + request: { + method: 'initialized', + }, + }, + }); + + return initialized.data.initialized; +}; + +export const installCosmosSnap = async (instance: any) => { + let installed = await isCosmosSnapInstalled(instance); + if (!installed) { + await instance + .request({ + method: 'wallet_requestSnaps', + params: { + [DEFAULT_SNAP_ID]: { + version: '^0.1.0', + }, + }, + }) + .then(() => { + installed = true; + }) + .catch((error: any) => { + console.log('Error while installing Cosmos Snap', error); + installed = false; + }); + } + + if (installed) { + const initialized = await isCosmosSnapInitialized(instance); + if (!initialized) { + await instance.request({ + method: 'wallet_invokeSnap', + params: { + snapId: DEFAULT_SNAP_ID, + request: { + method: 'initialize', + }, + }, + }); + } + } +}; + +export const getAddresses = async ( + instance: any +): Promise< + { + chain_id: string; + address: string; + }[] +> => { + const result = await instance.request({ + method: 'wallet_invokeSnap', + params: { + snapId: DEFAULT_SNAP_ID, + request: { + method: 'getChainAddresses', + }, + }, + }); + return result.data.addresses; +}; diff --git a/wallets/provider-walletconnect-2/src/signers/cosmos.ts b/wallets/provider-walletconnect-2/src/signers/cosmos.ts index 31f2d67678..00778b4c66 100644 --- a/wallets/provider-walletconnect-2/src/signers/cosmos.ts +++ b/wallets/provider-walletconnect-2/src/signers/cosmos.ts @@ -5,7 +5,7 @@ import type { CosmosTransaction, GenericSigner } from 'rango-types'; import { BroadcastMode, makeSignDoc } from '@cosmjs/launchpad'; import { cosmos } from '@keplr-wallet/cosmos'; -import { getsignedTx } from '@rango-dev/signer-cosmos'; +import { getSignedTx } from '@rango-dev/signer-cosmos'; import { uint8ArrayToHex } from '@rango-dev/wallets-shared'; import { AccountId, ChainId } from 'caip'; import { formatDirectSignDoc, stringifySignDocValues } from 'cosmos-wallet'; @@ -102,7 +102,7 @@ class COSMOSSigner implements GenericSigner { throw new SignerError(SignerErrorCode.SIGN_TX_ERROR, undefined, err); } - const signedTx = getsignedTx(tx, signResponse); + const signedTx = getSignedTx(tx, signResponse); const result = await sendTx( chainId, signedTx, diff --git a/wallets/shared/src/providers.ts b/wallets/shared/src/providers.ts index f22981ded3..3e06b08a86 100644 --- a/wallets/shared/src/providers.ts +++ b/wallets/shared/src/providers.ts @@ -1,16 +1,20 @@ -import { - Network, +import type { + CanEagerConnect, CanSwitchNetwork, + Network, Subscribe, SwitchNetwork, - Networks, - CanEagerConnect, } from './rango'; -import { convertEvmBlockchainMetaToEvmChainInfo } from './helpers'; -import { switchOrAddNetworkForMetamaskCompatibleWallets } from './helpers'; import type { BlockchainMeta } from 'rango-types'; + import { isEvmBlockchain } from 'rango-types'; +import { + convertEvmBlockchainMetaToEvmChainInfo, + switchOrAddNetworkForMetamaskCompatibleWallets, +} from './helpers'; +import { Networks } from './rango'; + export async function getEvmAccounts(instance: any) { const [accounts, chainId] = await Promise.all([ instance.request({ method: 'eth_requestAccounts' }) as Promise, @@ -30,11 +34,13 @@ export const subscribeToEvm: Subscribe = ({ updateAccounts, }) => { instance?.on('accountsChanged', (addresses: string[]) => { - // TODO: after enabling autoconnect, we can consider this condition - // to be removed. - // The problem was if a user already connected its wallet, - // Metamask is triggering this event on first load, so when autoconnect is disabled, - // it's automaticlally change the state of wallet to `connected`. + /* + * TODO: after enabling autoconnect, we can consider this condition + * to be removed. + * The problem was if a user already connected its wallet, + * Metamask is triggering this event on first load, so when autoconnect is disabled, + * it's automaticlally change the state of wallet to `connected`. + */ if (state.connected) { updateAccounts(addresses); } @@ -50,8 +56,8 @@ export const canEagerlyConnectToEvm: CanEagerConnect = async ({ instance }) => { const accounts: string[] = await instance.request({ method: 'eth_accounts', }); - if (accounts.length) return true; - else return false; + + return !!accounts.length; } catch (error) { return false; } @@ -82,13 +88,17 @@ export function getEthChainsInstance( network: Network | null, meta: BlockchainMeta[] ): Network | null { - if (!network) return null; + if (!network) { + return null; + } const evmBlockchains = evmNetworkNames(meta); return evmBlockchains.includes(network) ? Networks.ETHEREUM : null; } function isEvmNetwork(network: Network | null, meta: BlockchainMeta[]) { - if (!network) return false; + if (!network) { + return false; + } return evmNetworkNames(meta).includes(network); } diff --git a/yarn.lock b/yarn.lock index c0ed240832..3c5875b3e5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1584,6 +1584,16 @@ "@cosmjs/math" "^0.25.6" "@cosmjs/utils" "^0.25.6" +"@cosmjs/amino@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.30.1.tgz#7c18c14627361ba6c88e3495700ceea1f76baace" + integrity sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w== + dependencies: + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + "@cosmjs/amino@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.31.0.tgz#49b33047295002804ad51bdf7ec0c2c97f1b553d" @@ -1594,6 +1604,16 @@ "@cosmjs/math" "^0.31.0" "@cosmjs/utils" "^0.31.0" +"@cosmjs/amino@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.31.3.tgz#0f4aa6bd68331c71bd51b187fa64f00eb075db0a" + integrity sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw== + dependencies: + "@cosmjs/crypto" "^0.31.3" + "@cosmjs/encoding" "^0.31.3" + "@cosmjs/math" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + "@cosmjs/crypto@0.27.1": version "0.27.1" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.27.1.tgz#271c853089a3baf3acd6cf0b2122fd49f8815743" @@ -1644,6 +1664,19 @@ ripemd160 "^2.0.2" sha.js "^2.4.11" +"@cosmjs/crypto@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.30.1.tgz#21e94d5ca8f8ded16eee1389d2639cb5c43c3eb5" + integrity sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ== + dependencies: + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers "^0.7.6" + "@cosmjs/crypto@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.31.0.tgz#0be3867ada0155da19c45a51f5fde08e84f9ec4b" @@ -1657,6 +1690,19 @@ elliptic "^6.5.4" libsodium-wrappers-sumo "^0.7.11" +"@cosmjs/crypto@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.31.3.tgz#c752cb6d682fdc735dcb45a2519f89c56ba16c26" + integrity sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ== + dependencies: + "@cosmjs/encoding" "^0.31.3" + "@cosmjs/math" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers-sumo "^0.7.11" + "@cosmjs/encoding@0.27.1": version "0.27.1" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.27.1.tgz#3cd5bc0af743485eb2578cdb08cfa84c86d610e1" @@ -1693,6 +1739,15 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/encoding@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.30.1.tgz#b5c4e0ef7ceb1f2753688eb96400ed70f35c6058" + integrity sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + "@cosmjs/encoding@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.0.tgz#9a6fd80b59c35fc20638a6436128ad0be681eafc" @@ -1702,6 +1757,15 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/encoding@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" + integrity sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + "@cosmjs/json-rpc@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.31.0.tgz#38fda21188f2046db4a111fb5463ccde3c3751d7" @@ -1710,6 +1774,14 @@ "@cosmjs/stream" "^0.31.0" xstream "^11.14.0" +"@cosmjs/json-rpc@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.31.3.tgz#11e5cf0f6d9ab426dff470bb8d68d5d31cd6ab13" + integrity sha512-7LVYerXjnm69qqYR3uA6LGCrBW2EO5/F7lfJxAmY+iII2C7xO3a0vAjMSt5zBBh29PXrJVS6c2qRP22W1Le2Wg== + dependencies: + "@cosmjs/stream" "^0.31.3" + xstream "^11.14.0" + "@cosmjs/launchpad@^0.24.0-alpha.25", "@cosmjs/launchpad@^0.24.1": version "0.24.1" resolved "https://registry.yarnpkg.com/@cosmjs/launchpad/-/launchpad-0.24.1.tgz#fe7e80734dfd60ea093429a646d7a38634c70134" @@ -1763,6 +1835,13 @@ dependencies: bn.js "^4.11.8" +"@cosmjs/math@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.30.1.tgz#8b816ef4de5d3afa66cb9fdfb5df2357a7845b8a" + integrity sha512-yaoeI23pin9ZiPHIisa6qqLngfnBR/25tSaWpkTm8Cy10MX70UF5oN4+/t1heLaM6SSmRrhk3psRkV4+7mH51Q== + dependencies: + bn.js "^5.2.0" + "@cosmjs/math@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.31.0.tgz#c9fc5f8191df7c2375945d2eacce327dfbf26414" @@ -1770,6 +1849,13 @@ dependencies: bn.js "^5.2.0" +"@cosmjs/math@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.31.3.tgz#767f7263d12ba1b9ed2f01f68d857597839fd957" + integrity sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A== + dependencies: + bn.js "^5.2.0" + "@cosmjs/proto-signing@^0.24.0-alpha.25": version "0.24.1" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.24.1.tgz#4ee38d4e0d29c626344fb832235fda8e8d645c28" @@ -1788,6 +1874,19 @@ long "^4.0.0" protobufjs "~6.10.2" +"@cosmjs/proto-signing@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.30.1.tgz#f0dda372488df9cd2677150b89b3e9c72b3cb713" + integrity sha512-tXh8pPYXV4aiJVhTKHGyeZekjj+K9s2KKojMB93Gcob2DxUjfKapFYBMJSgfKPuWUPEmyr8Q9km2hplI38ILgQ== + dependencies: + "@cosmjs/amino" "^0.30.1" + "@cosmjs/crypto" "^0.30.1" + "@cosmjs/encoding" "^0.30.1" + "@cosmjs/math" "^0.30.1" + "@cosmjs/utils" "^0.30.1" + cosmjs-types "^0.7.1" + long "^4.0.0" + "@cosmjs/proto-signing@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.31.0.tgz#7056963457cd967f53f56c2ab4491638e5ade2c0" @@ -1801,6 +1900,19 @@ cosmjs-types "^0.8.0" long "^4.0.0" +"@cosmjs/proto-signing@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.31.3.tgz#20440b7b96fb2cd924256a10e656fd8d4481cdcd" + integrity sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA== + dependencies: + "@cosmjs/amino" "^0.31.3" + "@cosmjs/crypto" "^0.31.3" + "@cosmjs/encoding" "^0.31.3" + "@cosmjs/math" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + cosmjs-types "^0.8.0" + long "^4.0.0" + "@cosmjs/socket@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.31.0.tgz#ffcae48251a68b4a1c37a1c996d8b123cd8ad5ac" @@ -1811,6 +1923,16 @@ ws "^7" xstream "^11.14.0" +"@cosmjs/socket@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.31.3.tgz#52086380f4de2fc3514b90b0484b4b1c4c50e39e" + integrity sha512-aqrDGGi7os/hsz5p++avI4L0ZushJ+ItnzbqA7C6hamFSCJwgOkXaOUs+K9hXZdX4rhY7rXO4PH9IH8q09JkTw== + dependencies: + "@cosmjs/stream" "^0.31.3" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + "@cosmjs/stargate@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.31.0.tgz#a7df1eaf1363513529607abaa52a5045aaaee0fd" @@ -1829,6 +1951,24 @@ protobufjs "~6.11.3" xstream "^11.14.0" +"@cosmjs/stargate@^0.31.1": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.31.3.tgz#a2b38e398097a00f897dbd8f02d4d347d8fed818" + 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" + "@cosmjs/utils" "^0.31.3" + cosmjs-types "^0.8.0" + long "^4.0.0" + protobufjs "~6.11.3" + xstream "^11.14.0" + "@cosmjs/stream@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.31.0.tgz#7faf0f5ccd5ceffdd3b5d9fb81e292bb7a930b2c" @@ -1836,6 +1976,13 @@ dependencies: xstream "^11.14.0" +"@cosmjs/stream@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.31.3.tgz#53428fd62487ec08fc3886a50a3feeb8b2af2e66" + integrity sha512-8keYyI7X0RjsLyVcZuBeNjSv5FA4IHwbFKx7H60NHFXszN8/MvXL6aZbNIvxtcIHHsW7K9QSQos26eoEWlAd+w== + dependencies: + xstream "^11.14.0" + "@cosmjs/tendermint-rpc@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.0.tgz#df82f634ff08fc377dfdccea43a31d92b5b0eaf1" @@ -1852,6 +1999,22 @@ readonly-date "^1.0.0" xstream "^11.14.0" +"@cosmjs/tendermint-rpc@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.3.tgz#d1a2bc5b3c98743631c9b55888589d352403c9b3" + 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" + "@cosmjs/stream" "^0.31.3" + "@cosmjs/utils" "^0.31.3" + axios "^0.21.2" + readonly-date "^1.0.0" + xstream "^11.14.0" + "@cosmjs/utils@0.27.1": version "0.27.1" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.27.1.tgz#1c8efde17256346ef142a3bd15158ee4055470e2" @@ -1872,11 +2035,21 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.25.6.tgz#934d9a967180baa66163847616a74358732227ca" integrity sha512-ofOYiuxVKNo238vCPPlaDzqPXy2AQ/5/nashBo5rvPZJkxt9LciGfUEQWPCOb1BIJDNx2Dzu0z4XCf/dwzl0Dg== +"@cosmjs/utils@^0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" + integrity sha512-KvvX58MGMWh7xA+N+deCfunkA/ZNDvFLw4YbOmX3f/XBIkqrVY7qlotfy2aNb1kgp6h4B6Yc8YawJPDTfvWX7g== + "@cosmjs/utils@^0.31.0": version "0.31.0" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.0.tgz#3a7ac16856dcff63bbf1bb11e31f975f71ef4f21" integrity sha512-nNcycZWUYLNJlrIXgpcgVRqdl6BXjF4YlXdxobQWpW9Tikk61bEGeAFhDYtC0PwHlokCNw0KxWiHGJL4nL7Q5A== +"@cosmjs/utils@^0.31.3": + version "0.31.3" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.3.tgz#f97bbfda35ad69e80cd5c7fe0a270cbda16db1ed" + integrity sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -10882,6 +11055,14 @@ cosmjs-types@^0.5.2: long "^4.0.0" protobufjs "~6.11.2" +cosmjs-types@^0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.7.2.tgz#a757371abd340949c5bd5d49c6f8379ae1ffd7e2" + integrity sha512-vf2uLyktjr/XVAgEq0DjMxeAWh1yYREe7AMHDKd7EiHVqxBPCaBS+qEEQUkXbR9ndnckqr1sUG8BQhazh4X5lA== + dependencies: + long "^4.0.0" + protobufjs "~6.11.2" + cosmjs-types@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.8.0.tgz#2ed78f3e990f770229726f95f3ef5bf9e2b6859b"