From ed03d04f6b20ed2d72d16c0e4db62ec536e38e48 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Wed, 6 Sep 2023 09:21:23 -0300 Subject: [PATCH 001/375] Initial commit for Kadena provider --- packages/extension/src/libs/utils/networks.ts | 3 + .../extension/src/providers/kadena/index.ts | 75 +++++++++++++++++++ .../extension/src/providers/kadena/inject.ts | 56 ++++++++++++++ .../src/providers/kadena/libs/api.ts | 38 ++++++++++ .../kadena/networks/icons/kadena-kda-logo.svg | 24 ++++++ .../kadena/networks/icons/kadena.svg | 10 +++ .../src/providers/kadena/networks/index.ts | 5 ++ .../src/providers/kadena/networks/kadena.ts | 23 ++++++ .../src/providers/kadena/types/index.ts | 8 ++ .../providers/kadena/types/kadena-network.ts | 56 ++++++++++++++ .../src/providers/kadena/ui/routes/names.ts | 27 +++++++ packages/extension/src/types/base-network.ts | 10 ++- packages/extension/src/types/provider.ts | 1 + packages/types/src/networks.ts | 2 + 14 files changed, 336 insertions(+), 2 deletions(-) create mode 100644 packages/extension/src/providers/kadena/index.ts create mode 100644 packages/extension/src/providers/kadena/inject.ts create mode 100644 packages/extension/src/providers/kadena/libs/api.ts create mode 100644 packages/extension/src/providers/kadena/networks/icons/kadena-kda-logo.svg create mode 100644 packages/extension/src/providers/kadena/networks/icons/kadena.svg create mode 100644 packages/extension/src/providers/kadena/networks/index.ts create mode 100644 packages/extension/src/providers/kadena/networks/kadena.ts create mode 100644 packages/extension/src/providers/kadena/types/index.ts create mode 100644 packages/extension/src/providers/kadena/types/kadena-network.ts create mode 100644 packages/extension/src/providers/kadena/ui/routes/names.ts diff --git a/packages/extension/src/libs/utils/networks.ts b/packages/extension/src/libs/utils/networks.ts index 8de9c623c..61c739153 100644 --- a/packages/extension/src/libs/utils/networks.ts +++ b/packages/extension/src/libs/utils/networks.ts @@ -3,6 +3,7 @@ import { NetworkNames } from "@enkryptcom/types"; import EthereumNetworks from "@/providers/ethereum/networks"; import PolkadotNetworks from "@/providers/polkadot/networks"; import BitcoinNetworks from "@/providers/bitcoin/networks"; +import KadenaNetworks from "@/providers/kadena/networks"; import { BaseNetwork } from "@/types/base-network"; import CustomNetworksState from "../custom-networks-state"; import { CustomEvmNetwork } from "@/providers/ethereum/types/custom-evm-network"; @@ -14,6 +15,7 @@ const providerNetworks: Record> = { [ProviderName.ethereum]: EthereumNetworks, [ProviderName.polkadot]: PolkadotNetworks, [ProviderName.bitcoin]: BitcoinNetworks, + [ProviderName.kadena]: KadenaNetworks, [ProviderName.enkrypt]: {}, }; const getAllNetworks = async (): Promise => { @@ -26,6 +28,7 @@ const getAllNetworks = async (): Promise => { return (Object.values(EthereumNetworks) as BaseNetwork[]) .concat(Object.values(PolkadotNetworks) as BaseNetwork[]) .concat(Object.values(BitcoinNetworks) as BaseNetwork[]) + .concat(Object.values(KadenaNetworks) as BaseNetwork[]) .concat(customNetworks); }; const getNetworkByName = async ( diff --git a/packages/extension/src/providers/kadena/index.ts b/packages/extension/src/providers/kadena/index.ts new file mode 100644 index 000000000..c4ae66163 --- /dev/null +++ b/packages/extension/src/providers/kadena/index.ts @@ -0,0 +1,75 @@ +import getRequestProvider, { RequestClass } from "@enkryptcom/request"; +import { MiddlewareFunction, OnMessageResponse } from "@enkryptcom/types"; +// import Middlewares from "./methods"; +import EventEmitter from "eventemitter3"; +import { + BackgroundProviderInterface, + ProviderName, + ProviderRPCRequest, +} from "@/types/provider"; +import GetUIPath from "@/libs/utils/get-ui-path"; +import PublicKeyRing from "@/libs/keyring/public-keyring"; +import UIRoutes from "./ui/routes/names"; +import { BaseNetwork } from "@/types/base-network"; + +class KadenaProvider + extends EventEmitter + implements BackgroundProviderInterface +{ + requestProvider: RequestClass; + middlewares: MiddlewareFunction[] = []; + namespace: string; + KeyRing: PublicKeyRing; + UIRoutes = UIRoutes; + toWindow: (message: string) => void; + + constructor(toWindow: (message: string) => void) { + super(); + // this.setMiddleWares(); + this.requestProvider = getRequestProvider("", this.middlewares); + this.toWindow = toWindow; + this.requestProvider.on("notification", (notif: any) => { + this.sendNotification(JSON.stringify(notif)); + }); + this.namespace = ProviderName.kadena; + this.KeyRing = new PublicKeyRing(); + } + + // private setMiddleWares(): void { + // this.middlewares = Middlewares.map((mw) => mw.bind(this)); + // } + + setRequestProvider(network: BaseNetwork): void { + this.requestProvider.disconnect(); + this.requestProvider.changeNetwork(network.node); + } + + request(request: ProviderRPCRequest): Promise { + return this.requestProvider + .request(request) + .then((res) => { + return { + result: JSON.stringify(res), + }; + }) + .catch((e) => { + return { + error: JSON.stringify(e.message), + }; + }); + } + + async sendNotification(notif: string): Promise { + return this.toWindow(notif); + } + + async isPersistentEvent(): Promise { + return false; + } + + getUIPath(page: string): string { + return GetUIPath(page, this.namespace); + } +} + +export default KadenaProvider; diff --git a/packages/extension/src/providers/kadena/inject.ts b/packages/extension/src/providers/kadena/inject.ts new file mode 100644 index 000000000..767d4bee9 --- /dev/null +++ b/packages/extension/src/providers/kadena/inject.ts @@ -0,0 +1,56 @@ +import EventEmitter from "eventemitter3"; +import { EthereumRequest, EthereumResponse } from "@/providers/ethereum/types"; +import { + ProviderName, + ProviderOptions, + ProviderType, + ProviderInterface, + SendMessageHandler, +} from "@/types/provider"; +import { EXTENSION_VERSION } from "@/configs/constants"; +import { EnkryptWindow } from "@/types/globals"; +import { KadenaNetworks } from "./types"; + +export class Provider extends EventEmitter implements ProviderInterface { + connected: boolean; + name: ProviderName; + type: ProviderType; + version: string = EXTENSION_VERSION; + autoRefreshOnNetworkChange = false; + networks: typeof KadenaNetworks; + sendMessageHandler: SendMessageHandler; + + constructor(options: ProviderOptions) { + super(); + this.connected = true; + this.name = options.name; + this.type = options.type; + this.networks = KadenaNetworks; + this.sendMessageHandler = options.sendMessageHandler; + } + + async request(request: EthereumRequest): Promise { + const res = (await this.sendMessageHandler( + this.name, + JSON.stringify(request) + )) as EthereumResponse; + return res; + } + + isConnected(): boolean { + return this.connected; + } + + // eslint-disable-next-line @typescript-eslint/no-empty-function + handleMessage(msg: string): void {} +} + +const injectDocument = ( + document: EnkryptWindow | Window, + options: ProviderOptions +): void => { + const provider = new Provider(options); + document["enkrypt"]["providers"][options.name] = provider; +}; + +export default injectDocument; diff --git a/packages/extension/src/providers/kadena/libs/api.ts b/packages/extension/src/providers/kadena/libs/api.ts new file mode 100644 index 000000000..27f5f5e6c --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/api.ts @@ -0,0 +1,38 @@ +import { + EthereumRawInfo, + SubscanExtrinsicInfo, + BTCRawInfo, +} from "@/types/activity"; +import { ProviderAPIInterface } from "@/types/provider"; + +class API implements ProviderAPIInterface { + node: string; + decimals: number; + name: string; + + constructor(node: string) { + this.node = node; + this.decimals = 18; + this.name = "Kadena"; + } + + public get api() { + return this; + } + + init(): Promise { + throw new Error("Method not implemented."); + } + + getTransactionStatus( + hash: string + ): Promise { + throw new Error("Method not implemented."); + } + + async getBalance(address: string): Promise { + return "0"; + } +} + +export default API; diff --git a/packages/extension/src/providers/kadena/networks/icons/kadena-kda-logo.svg b/packages/extension/src/providers/kadena/networks/icons/kadena-kda-logo.svg new file mode 100644 index 000000000..dde41250e --- /dev/null +++ b/packages/extension/src/providers/kadena/networks/icons/kadena-kda-logo.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/packages/extension/src/providers/kadena/networks/icons/kadena.svg b/packages/extension/src/providers/kadena/networks/icons/kadena.svg new file mode 100644 index 000000000..ba1668e12 --- /dev/null +++ b/packages/extension/src/providers/kadena/networks/icons/kadena.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/packages/extension/src/providers/kadena/networks/index.ts b/packages/extension/src/providers/kadena/networks/index.ts new file mode 100644 index 000000000..8f49cb497 --- /dev/null +++ b/packages/extension/src/providers/kadena/networks/index.ts @@ -0,0 +1,5 @@ +import kadena from "./kadena"; + +export default { + kadena, +}; diff --git a/packages/extension/src/providers/kadena/networks/kadena.ts b/packages/extension/src/providers/kadena/networks/kadena.ts new file mode 100644 index 000000000..1c3ce0aba --- /dev/null +++ b/packages/extension/src/providers/kadena/networks/kadena.ts @@ -0,0 +1,23 @@ +import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; +import { KadenaNetwork, KadenaNetworkOptions } from "../types/kadena-network"; + +const kadenaOptions: KadenaNetworkOptions = { + name: NetworkNames.Kadena, + name_long: "Kadena", + homePage: "https://kadena.io/", + blockExplorerTX: "https://polkadot.subscan.io/extrinsic/[[txHash]]", + blockExplorerAddr: "https://polkadot.subscan.io/account/[[address]]", + isTestNetwork: false, + currencyName: "KDA", + currencyNameLong: "Kadena", + icon: require("./icons/kadena-kda-logo.svg"), + decimals: 18, + prefix: 0, + node: "wss://rpc.polkadot.io/", + coingeckoID: "kadena", + coingeckoPlatform: CoingeckoPlatform.Kadena, +}; + +const kadena = new KadenaNetwork(kadenaOptions); + +export default kadena; diff --git a/packages/extension/src/providers/kadena/types/index.ts b/packages/extension/src/providers/kadena/types/index.ts new file mode 100644 index 000000000..7a7282871 --- /dev/null +++ b/packages/extension/src/providers/kadena/types/index.ts @@ -0,0 +1,8 @@ +import { NetworkNames } from "@enkryptcom/types"; +import type { Provider as InjectedProvider } from "../inject"; + +export const KadenaNetworks = { + KDA: NetworkNames.Kadena, +}; + +export { InjectedProvider }; diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts new file mode 100644 index 000000000..fd100f74f --- /dev/null +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -0,0 +1,56 @@ +import { Activity } from "@/types/activity"; +import { BaseNetwork, BaseNetworkOptions } from "@/types/base-network"; +import { BaseToken } from "@/types/base-token"; +import { AssetsType, ProviderName } from "@/types/provider"; +import { CoingeckoPlatform, NetworkNames, SignerType } from "@enkryptcom/types"; +import KadenaAPI from "@/providers/kadena/libs/api"; + +export interface KadenaNetworkOptions { + name: NetworkNames; + name_long: string; + homePage: string; + blockExplorerTX: string; + blockExplorerAddr: string; + isTestNetwork: boolean; + currencyName: string; + currencyNameLong: string; + icon: string; + decimals: number; + prefix: number; + node: string; + coingeckoID?: string; + coingeckoPlatform?: CoingeckoPlatform; +} + +export class KadenaNetwork extends BaseNetwork { + constructor(options: KadenaNetworkOptions) { + const api = async () => { + const api = new KadenaAPI(options.node); + return api; + }; + + const baseOptions: BaseNetworkOptions = { + basePath: "//", + identicon: () => "", + signer: [SignerType.sr25519, SignerType.ed25519], + displayAddress: (address: string) => address, + provider: ProviderName.kadena, + api, + ...options, + }; + + super(baseOptions); + } + + public getAllTokens(address: string): Promise { + throw new Error("Method not implemented."); + } + + public getAllTokenInfo(address: string): Promise { + throw new Error("Method not implemented."); + } + + public getAllActivity(address: string): Promise { + throw new Error("Method not implemented."); + } +} diff --git a/packages/extension/src/providers/kadena/ui/routes/names.ts b/packages/extension/src/providers/kadena/ui/routes/names.ts new file mode 100644 index 000000000..9904ac414 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/routes/names.ts @@ -0,0 +1,27 @@ +export default { + dotAccounts: { + path: "dot-accounts", + component: {}, + name: "dotAccounts", + }, + dotTxApprove: { + path: "dot-tx-approve", + component: {}, + name: "dotTxApprove", + }, + dotSignMessage: { + path: "dot-sign-message", + component: {}, + name: "dotSignMessage", + }, + dotUpdateMetadata: { + path: "dot-update-metadata", + component: {}, + name: "dotUpdateMetadata", + }, + dotHWVerify: { + path: "dot-hw-verify", + name: "dotHWVerify", + component: {}, + }, +}; diff --git a/packages/extension/src/types/base-network.ts b/packages/extension/src/types/base-network.ts index dbfd51fd5..dfcc2efe3 100644 --- a/packages/extension/src/types/base-network.ts +++ b/packages/extension/src/types/base-network.ts @@ -1,6 +1,7 @@ import EvmAPI from "@/providers/ethereum/libs/api"; import SubstrateAPI from "@/providers/polkadot/libs/api"; import BitcoinAPI from "@/providers/bitcoin/libs/api"; +import KadenaAPI from "@/providers/kadena/libs/api"; import { AssetsType, ProviderName } from "@/types/provider"; import { CoingeckoPlatform, SignerType, NetworkNames } from "@enkryptcom/types"; import { Activity } from "./activity"; @@ -26,7 +27,11 @@ export interface BaseNetworkOptions { coingeckoPlatform?: CoingeckoPlatform; identicon: (address: string) => string; basePath: string; - api: () => Promise | Promise | Promise; + api: () => + | Promise + | Promise + | Promise + | Promise; customTokens?: boolean; } @@ -52,7 +57,8 @@ export abstract class BaseNetwork { public api: () => | Promise | Promise - | Promise; + | Promise + | Promise; public customTokens: boolean; constructor(options: BaseNetworkOptions) { diff --git a/packages/extension/src/types/provider.ts b/packages/extension/src/types/provider.ts index 4ff1c9206..5266e0577 100644 --- a/packages/extension/src/types/provider.ts +++ b/packages/extension/src/types/provider.ts @@ -23,6 +23,7 @@ export enum ProviderName { ethereum = "ethereum", bitcoin = "bitcoin", polkadot = "polkadot", + kadena = "kadena", } export enum InternalStorageNamespace { keyring = "KeyRing", diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 477cf6b03..b390acfbc 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -58,6 +58,7 @@ export enum NetworkNames { Vara = "VARA", Base = "BASE", Celo = "CELO", + Kadena = "KDA", } export enum CoingeckoPlatform { @@ -97,4 +98,5 @@ export enum CoingeckoPlatform { Base = "base", Celo = "celo", Shibarium = "shibarium", + Kadena = "kadena", } From e39afd0f7674e56b383cba314e849e9f8b2c87e7 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Fri, 8 Sep 2023 10:15:48 -0300 Subject: [PATCH 002/375] Added Kadena signer to create account --- .../src/libs/utils/initialize-wallet.ts | 7 + packages/extension/src/libs/utils/networks.ts | 5 + .../providers/kadena/types/kadena-network.ts | 2 +- packages/keyring/package.json | 1 + packages/keyring/src/index.ts | 2 + packages/signers/kadena/.editorconfig | 10 + packages/signers/kadena/.eslintignore | 2 + packages/signers/kadena/.eslintrc.json | 68 + packages/signers/kadena/.gitignore | 106 + packages/signers/kadena/.nvmrc | 1 + packages/signers/kadena/LICENSE | 21 + packages/signers/kadena/README.md | 3 + packages/signers/kadena/package.json | 54 + packages/signers/kadena/src/index.ts | 40 + packages/signers/kadena/tests/fixtures.ts | 14146 ++++++++++++++++ .../signers/kadena/tests/generate.test.ts | 26 + packages/signers/kadena/tsconfig.json | 28 + packages/signers/kadena/tsconfig.paths.json | 8 + yarn.lock | 85 +- 19 files changed, 14613 insertions(+), 2 deletions(-) create mode 100644 packages/signers/kadena/.editorconfig create mode 100644 packages/signers/kadena/.eslintignore create mode 100644 packages/signers/kadena/.eslintrc.json create mode 100644 packages/signers/kadena/.gitignore create mode 100644 packages/signers/kadena/.nvmrc create mode 100644 packages/signers/kadena/LICENSE create mode 100644 packages/signers/kadena/README.md create mode 100644 packages/signers/kadena/package.json create mode 100644 packages/signers/kadena/src/index.ts create mode 100644 packages/signers/kadena/tests/fixtures.ts create mode 100644 packages/signers/kadena/tests/generate.test.ts create mode 100644 packages/signers/kadena/tsconfig.json create mode 100644 packages/signers/kadena/tsconfig.paths.json diff --git a/packages/extension/src/libs/utils/initialize-wallet.ts b/packages/extension/src/libs/utils/initialize-wallet.ts index 3a67d00ae..2d88f74fc 100644 --- a/packages/extension/src/libs/utils/initialize-wallet.ts +++ b/packages/extension/src/libs/utils/initialize-wallet.ts @@ -2,6 +2,7 @@ import KeyRing from "@/libs/keyring/keyring"; import EthereumNetworks from "@/providers/ethereum/networks"; import PolkadotNetworks from "@/providers/polkadot/networks"; import BitcoinNetworks from "@/providers/bitcoin/networks"; +import KadenaNetworks from "@/providers/kadena/networks"; import { WalletType } from "@enkryptcom/types"; export default async (mnemonic: string, password: string): Promise => { const kr = new KeyRing(); @@ -25,4 +26,10 @@ export default async (mnemonic: string, password: string): Promise => { signerType: BitcoinNetworks.bitcoin.signer[0], walletType: WalletType.mnemonic, }); + await kr.saveNewAccount({ + basePath: KadenaNetworks.kadena.basePath, + name: "Kadena Account 1", + signerType: KadenaNetworks.kadena.signer[0], + walletType: WalletType.mnemonic, + }); }; diff --git a/packages/extension/src/libs/utils/networks.ts b/packages/extension/src/libs/utils/networks.ts index 61c739153..91f546bb7 100644 --- a/packages/extension/src/libs/utils/networks.ts +++ b/packages/extension/src/libs/utils/networks.ts @@ -10,6 +10,7 @@ import { CustomEvmNetwork } from "@/providers/ethereum/types/custom-evm-network" import Ethereum from "@/providers/ethereum/networks/eth"; import Polkadot from "@/providers/polkadot/networks/polkadot"; import Bitcoin from "@/providers/bitcoin/networks/bitcoin"; +import Kadena from "@/providers/kadena/networks/kadena"; const providerNetworks: Record> = { [ProviderName.ethereum]: EthereumNetworks, @@ -56,10 +57,12 @@ const getProviderNetworkByName = async ( const DEFAULT_EVM_NETWORK_NAME = NetworkNames.Ethereum; const DEFAULT_SUBSTRATE_NETWORK_NAME = NetworkNames.Polkadot; const DEFAULT_BTC_NETWORK_NAME = NetworkNames.Bitcoin; +const DEFAULT_KADENA_NETWORK_NAME = NetworkNames.Kadena; const DEFAULT_EVM_NETWORK = Ethereum; const DEFAULT_SUBSTRATE_NETWORK = Polkadot; const DEFAULT_BTC_NETWORK = Bitcoin; +const DEFAULT_KADENA_NETWORK = Kadena; const POPULAR_NAMES = [ NetworkNames.Bitcoin, @@ -81,4 +84,6 @@ export { DEFAULT_EVM_NETWORK, DEFAULT_SUBSTRATE_NETWORK, DEFAULT_BTC_NETWORK, + DEFAULT_KADENA_NETWORK, + DEFAULT_KADENA_NETWORK_NAME, }; diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index fd100f74f..dea3552b3 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -32,7 +32,7 @@ export class KadenaNetwork extends BaseNetwork { const baseOptions: BaseNetworkOptions = { basePath: "//", identicon: () => "", - signer: [SignerType.sr25519, SignerType.ed25519], + signer: [SignerType.ed25519kda], displayAddress: (address: string) => address, provider: ProviderName.kadena, api, diff --git a/packages/keyring/package.json b/packages/keyring/package.json index f5193d0a3..7946b5896 100644 --- a/packages/keyring/package.json +++ b/packages/keyring/package.json @@ -19,6 +19,7 @@ "dependencies": { "@enkryptcom/signer-bitcoin": "workspace:^", "@enkryptcom/signer-ethereum": "workspace:^", + "@enkryptcom/signer-kadena": "workspace:^", "@enkryptcom/signer-polkadot": "workspace:^", "@enkryptcom/storage": "workspace:^", "@enkryptcom/types": "workspace:^", diff --git a/packages/keyring/src/index.ts b/packages/keyring/src/index.ts index 23725c3ab..6c6391588 100644 --- a/packages/keyring/src/index.ts +++ b/packages/keyring/src/index.ts @@ -17,6 +17,7 @@ import { hexToBuffer, encrypt, decrypt } from "@enkryptcom/utils"; import PolkadotSigner from "@enkryptcom/signer-polkadot"; import EthereumSigner from "@enkryptcom/signer-ethereum"; import BitcoinSigner from "@enkryptcom/signer-bitcoin"; +import KadenaSigner from "@enkryptcom/signer-kadena"; import assert from "assert"; import configs from "./configs"; import { pathParser } from "./utils"; @@ -47,6 +48,7 @@ class KeyRing { [SignerType.ed25519]: new PolkadotSigner(SignerType.ed25519), [SignerType.sr25519]: new PolkadotSigner(SignerType.sr25519), [SignerType.secp256k1btc]: new BitcoinSigner(), + [SignerType.ed25519kda]: new KadenaSigner(), }; } diff --git a/packages/signers/kadena/.editorconfig b/packages/signers/kadena/.editorconfig new file mode 100644 index 000000000..aa7d67e49 --- /dev/null +++ b/packages/signers/kadena/.editorconfig @@ -0,0 +1,10 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 + +[*.sh] +indent_size = 4 \ No newline at end of file diff --git a/packages/signers/kadena/.eslintignore b/packages/signers/kadena/.eslintignore new file mode 100644 index 000000000..e86ef8494 --- /dev/null +++ b/packages/signers/kadena/.eslintignore @@ -0,0 +1,2 @@ +coverage +dist \ No newline at end of file diff --git a/packages/signers/kadena/.eslintrc.json b/packages/signers/kadena/.eslintrc.json new file mode 100644 index 000000000..5f5bb7b50 --- /dev/null +++ b/packages/signers/kadena/.eslintrc.json @@ -0,0 +1,68 @@ +{ + "extends": [ + "airbnb-base", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended", + "prettier" + ], + "plugins": ["@typescript-eslint"], + "root": true, + "globals": {}, + "rules": { + "@typescript-eslint/no-var-requires": "off", + "no-multi-assign": "off", + "no-param-reassign": "off", + "no-underscore-dangle": "off", + "no-continue": "off", + "@typescript-eslint/ban-ts-comment": "off", + "no-console": "off", + "no-plusplus": "off", + "class-methods-use-this": "off", + "import/no-extraneous-dependencies": "off", + "import/extensions": [ + "error", + "ignorePackages", + { + "js": "never", + "jsx": "never", + "ts": "never", + "tsx": "never" + } + ], + "import/no-unresolved": [ + 2, + { + "commonjs": true, + "amd": true + } + ], + "import/prefer-default-export": "off", + "max-len": [ + "error", + { + "code": 150, + "ignoreComments": true, + "ignoreTrailingComments": true, + "ignoreUrls": true, + "ignoreStrings": true, + "ignoreTemplateLiterals": true + } + ] + }, + "parser": "@typescript-eslint/parser", + "env": {}, + "overrides": [], + "settings": { + "import/resolver": { + "alias": { + "map": [ + ["@src", "./src"], + ["@tests", "./tests"] + ], + "extensions": [".ts", ".js"] + } + } + } +} diff --git a/packages/signers/kadena/.gitignore b/packages/signers/kadena/.gitignore new file mode 100644 index 000000000..bd3acfe4e --- /dev/null +++ b/packages/signers/kadena/.gitignore @@ -0,0 +1,106 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +dist \ No newline at end of file diff --git a/packages/signers/kadena/.nvmrc b/packages/signers/kadena/.nvmrc new file mode 100644 index 000000000..7480d3c85 --- /dev/null +++ b/packages/signers/kadena/.nvmrc @@ -0,0 +1 @@ +lts/fermium \ No newline at end of file diff --git a/packages/signers/kadena/LICENSE b/packages/signers/kadena/LICENSE new file mode 100644 index 000000000..0c437d9d2 --- /dev/null +++ b/packages/signers/kadena/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 kvhnuke <10602065+kvhnuke@users.noreply.github.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/signers/kadena/README.md b/packages/signers/kadena/README.md new file mode 100644 index 000000000..2dbb35af6 --- /dev/null +++ b/packages/signers/kadena/README.md @@ -0,0 +1,3 @@ +# @enkryptcom/signer-kadena + +## Kadena blockchain signer diff --git a/packages/signers/kadena/package.json b/packages/signers/kadena/package.json new file mode 100644 index 000000000..cadea618e --- /dev/null +++ b/packages/signers/kadena/package.json @@ -0,0 +1,54 @@ +{ + "name": "@enkryptcom/signer-kadena", + "version": "0.0.1", + "description": "Kadena blockchain signer", + "main": "dist/index.js", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "build": "tsup src/index.ts --format esm,cjs --dts --clean", + "lint": "prettier --write .", + "test": "ts-mocha -p tsconfig.json tests/**/*.test.ts" + }, + "engines": { + "node": ">=14.15.0" + }, + "dependencies": { + "@enkryptcom/utils": "workspace:^", + "cardano-crypto-kadena.js": "^6.0.1", + "chai": "^4.3.8" + }, + "devDependencies": { + "@enkryptcom/types": "workspace:^", + "@types/chai": "^4.3.5", + "@types/hdkey": "^2.0.1", + "@types/mocha": "^10.0.1", + "@types/node": "^20.5.7", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "eslint": "^8.48.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^8.10.0", + "eslint-import-resolver-alias": "^1.1.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-module-resolver": "^1.5.0", + "mocha": "^9.2.2", + "prettier": "^2.8.8", + "ts-mocha": "^9.0.2", + "ts-node": "^10.9.1", + "tsconfig-paths": "^3.14.2", + "tsup": "^6.7.0", + "typescript": "^4.9.5", + "typescript-eslint": "0.0.1-alpha.0" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/enkryptcom/enKrypt/tree/main/packages/signers/kadena" + }, + "keywords": [], + "author": "ae.studio", + "license": "MIT" +} diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts new file mode 100644 index 000000000..ede1dc69b --- /dev/null +++ b/packages/signers/kadena/src/index.ts @@ -0,0 +1,40 @@ +import { SignerInterface, KeyPair } from "@enkryptcom/types"; + +// eslint-disable-next-line import/extensions +import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto.js"; + +class Signer implements SignerInterface { + async generate(mnemonic: string): Promise { + const root = kadenaCrypto.kadenaMnemonicToRootKeypair("", mnemonic.trim()); + const hardIndex = 0x80000000 + 0; + const privPubKey = kadenaCrypto.kadenaGenKeypair("", root, hardIndex); + + return { + address: this.bufferToHex(privPubKey[1]), + privateKey: this.bufferToHex(privPubKey[0]), + publicKey: this.bufferToHex(privPubKey[1]), + }; + } + + async verify( + msgHash: string, + sig: string, + publicKey: string + ): Promise { + console.log(msgHash, sig, publicKey); + return true; + } + + async sign(msgHash: string, keyPair: KeyPair): Promise { + console.log(msgHash, keyPair); + return ""; + } + + bufferToHex(buffer: Iterable): string { + return Array.from(new Uint8Array(buffer)) + .map(b => b.toString(16).padStart(2, "0")) + .join(""); + } +} + +export default Signer; diff --git a/packages/signers/kadena/tests/fixtures.ts b/packages/signers/kadena/tests/fixtures.ts new file mode 100644 index 000000000..9a97e3466 --- /dev/null +++ b/packages/signers/kadena/tests/fixtures.ts @@ -0,0 +1,14146 @@ +export default { + valid: [ + { + description: + "Everything should be made as simple as possible, but not simpler.", + d: "0000000000000000000000000000000000000000000000000000000000000001", + m: "06ef2b193b83b3d701f765f1db34672ab84897e1252343cc2197829af3a30456", + signature: + "33a69cd2065432a30f3d1ce4eb0d59b8ab58c74f27c41a7fdb5696ad4e6108c96f807982866f785d3f6418d24163ddae117b7db4d5fdf0071de069fa54342262", + recoveryId: 0, + }, + { + description: + "Equations are more important to me, because politics is for the present, but an equation is something for eternity.", + d: "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + m: "5e9f0a0d593efdcf78ac923bc3313e4e7d408d574354ee2b3288c0da9fbba6ed", + signature: + "54c4a33c6423d689378f160a7ff8b61330444abb58fb470f96ea16d99d4a2fed07082304410efa6b2943111b6a4e0aaa7b7db55a07e9861d1fb3cb1f421044a5", + recoveryId: 0, + }, + { + description: + "Not only is the Universe stranger than we think, it is stranger than we can think.", + d: "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + m: "4d642665c81dd2d6fc3d386ee018043e1f38c5def0a9925febd766f5b15fdb8d", + signature: + "ff466a9f1b7b273e2f4c3ffe032eb2e814121ed18ef84665d0f515360dab3dd06fc95f5132e5ecfdc8e5e6e616cc77151455d46ed48f5589b7db7771a332b283", + recoveryId: 0, + }, + { + description: + "How wonderful that we have met with a paradox. Now we have some hope of making progress.", + d: "0000000000000000000000000000000000000000000000000000000000000001", + m: "d507058c2f1472fe0de2ba3b4efe629505677440ab3a7032a9adeaf0ebda74a2", + signature: + "c0dafec8251f1d5010289d210232220b03202cba34ec11fec58b3e93a85b91d375afdc06b7d6322a590955bf264e7aaa155847f614d80078a90292fe205064d3", + recoveryId: 1, + }, + { + description: + "Computer science is no more about computers than astronomy is about telescopes.", + d: "69ec59eaa1f4f2e36b639716b7c30ca86d9a5375c7b38d8918bd9c0ebc80ba64", + m: "24833a5c2c927c9876d7a77e400577057598e0d7b0c96587ee8a37ea5381bede", + signature: + "7186363571d65e084e7f02b0b77c3ec44fb1b257dee26274c38c928986fea45d0de0b38e06807e46bda1f1e293f4f6323e854c86d58abdd00c46c16441085df6", + recoveryId: 0, + }, + { + description: + "...if you aren't, at any given time, scandalized by code you wrote five or even three years ago, you're not learning anywhere near enough", + d: "00000000000000000000000000007246174ab1e92e9149c6e446fe194d072637", + m: "1eb6e69ca54e38a9b30d4e80b7f69f9dbb10f81579e635dc49557fc16f21e911", + signature: + "fbfe5076a15860ba8ed00e75e9bd22e05d230f02a936b653eb55b61c99dda4870e68880ebb0050fe4312b1b1eb0899e1b82da89baa5b895f612619edf34cbd37", + recoveryId: 1, + }, + { + description: + "The question of whether computers can think is like the question of whether submarines can swim.", + d: "000000000000000000000000000000000000000000056916d0f9b31dc9b637f3", + m: "179fd85cbe8797f314f07f732438db0682da502c7a9aa9da87af39cf126aaeb3", + signature: + "cde1302d83f8dd835d89aef803c74a119f561fbaef3eb9129e45f30de86abbf906ce643f5049ee1f27890467b77a6a8e11ec4661cc38cd8badf90115fbd03cef", + recoveryId: 1, + }, + { + description: + "Everything should be made as simple as possible, but not simpler.", + d: "9c7fc36bc106fd7df5e1078d03e34b9a045892abdd053ec69bfeb22327529f6c", + m: "06ef2b193b83b3d701f765f1db34672ab84897e1252343cc2197829af3a30456", + signature: + "b4abe4ecdf93a1b8b22958fd70bdb10ef0c05e391fb58ef2b67c8fe38dcf887566eea005e0e32292b0a70280afc20d8341109bce79df004529bcc8598af701c6", + recoveryId: 0, + }, + { + description: + "Equations are more important to me, because politics is for the present, but an equation is something for eternity.", + d: "85a7464e3d385e445d05a6653686d6e0494f5a040403e33cdfb298f0dfc81b13", + m: "5e9f0a0d593efdcf78ac923bc3313e4e7d408d574354ee2b3288c0da9fbba6ed", + signature: + "539825cf9532fc9ba16e6f71ea0140768621ce908a7a88b6fa2184db14802f81477eb2480cc732370041af5de20818c478e6d0768093d9c12582eb548c1ec7a4", + recoveryId: 1, + }, + { + description: + "Not only is the Universe stranger than we think, it is stranger than we can think.", + d: "52f9dd5e40e93ac097c7550b1d812cac8cac1dab5d8d471e10952da763ed4edb", + m: "4d642665c81dd2d6fc3d386ee018043e1f38c5def0a9925febd766f5b15fdb8d", + signature: + "f3caed96084874665027847dc5b1f34d8acb375305580be42cf88da3810cd9a040ae93fd80d61b08e9c6dd3a2012ede80b619e92b676aa72f85ccd4156896589", + recoveryId: 0, + }, + { + description: + "How wonderful that we have met with a paradox. Now we have some hope of making progress.", + d: "aba9ad83795cb662a4ec3214b780c4dbdf8a32f4b3b4967f00257ae81a18f2d9", + m: "d507058c2f1472fe0de2ba3b4efe629505677440ab3a7032a9adeaf0ebda74a2", + signature: + "3121742c83f31bdacf06ab29a4f016365240d98069e9ce8c53dea3caba5694cf42f2af2979209725fb690d9a8d1aedd8808409697da4bbf58c847b6836641c3f", + recoveryId: 0, + }, + { + description: + "Computer science is no more about computers than astronomy is about telescopes.", + d: "ab51604553e2a35df7e0fd32169a5a3e5dfa1bdf2455667a15aa3eb8696a3d16", + m: "24833a5c2c927c9876d7a77e400577057598e0d7b0c96587ee8a37ea5381bede", + signature: + "06a02f42890eabc89401448debc5525b98f3cafe9f800d34179f1108cdcfcaec225c46d5280244429866d50446b4664c19f72a5f25ccad982fc54b9500a03c3e", + recoveryId: 1, + }, + { + description: + "...if you aren't, at any given time, scandalized by code you wrote five or even three years ago, you're not learning anywhere near enough", + d: "fab0b9902eb61423df7aea8e532fe409f014dca8b55da1e13d283d3dd58d84c3", + m: "1eb6e69ca54e38a9b30d4e80b7f69f9dbb10f81579e635dc49557fc16f21e911", + signature: + "23fac8b0b25d73c588da91d848d7ecdde1873e140f953db44556f9b83ff25c16635f39f10fff1dd15b4b958de19e1539e344d7861379d5beee98fb00fb5d1012", + recoveryId: 0, + }, + { + description: + "The question of whether computers can think is like the question of whether submarines can swim.", + d: "3c1384240303d12646b8b7c550524a3bb55c44bd620d379acda1149ebf3b9d4c", + m: "179fd85cbe8797f314f07f732438db0682da502c7a9aa9da87af39cf126aaeb3", + signature: + "beea15563a85842ca72fa8e5fe4a63739f40849aff294d0f1061b1bf28f85cc826e81a26dc398a0619651983f1c9ada2dc93de348dafeba40c27fa4c007d2b8b", + recoveryId: 0, + }, + { + description: "Strange hash", + d: "0000000000000000000000000000000000000000000000000000000000000001", + m: "0000000000000000000000000000000000000000000000000000000000000000", + signature: + "a0b37f8fba683cc68f6574cd43b39f0343a50008bf6ccea9d13231d9e7e2e1e411edc8d307254296264aebfc3dc76cd8b668373a072fd64665b50000e9fcce52", + recoveryId: 1, + }, + { + description: "Stange hash", + d: "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140", + m: "0000000000000000000000000000000000000000000000000000000000000000", + signature: + "919026f3e239ea52cf530eb6d345dc2b56ef0928f1e9ad20d8f360284dc6504814395e7137e2204f15b69239010f3c34fbb3c858a29b0d106b1fa65bc0047263", + recoveryId: 0, + }, + { + d: "2bdbaeb8139ae47b603c684269f765a088397adbe65c017dfc6d19819b44041d", + m: "3574cabd6d7c35e2657d7736e5971d99b12f506a81772097b3ed18b893b2624c", + signature: + "2fc0aa6e71246a10252e542ee365b793c7c53f634007937efb0bde8d77c802b07707ee733223f98a19044b24e4471e498b288d98f9413e5eddff2248438e62af", + recoveryId: 1, + }, + { + d: "c0c77d7b7c24cf4ee08d8c368a3b0bcc3ac17c949b6a8455287cbe065cfc088c", + m: "9811ebd6296e6078940504347735f04ae42da831f793cd83cb031980543c5ad1", + signature: + "13279d8fe6a260963cf6393d98691fa536ff5202997ef3b86399ff0e475b599175c23a6c62496b37819fed5a8355520e80d06db6697a3d62ce92a1ddf12bfe94", + recoveryId: 0, + }, + { + d: "4d1ea461044a8e1fb6b69818c30a2f0127687f9a373f00fa22bd274df8621899", + m: "ebf5d101da4e1185ba9e204f0f280a512fba063e24ccbb20f1e152274036cbce", + signature: + "75bd3e5f601a831d861c27f28f3e4eafa44cf4104eaeed1ee29b4b66f79e69a104b4fa577fd9b13669d5a6b57e62f6e16f7eae8c09541f8f4d57a237cad4e4cf", + recoveryId: 0, + }, + { + d: "135d8451af04bdb69cc966aaed1f551e6fc035a35878b90b3e0e6e4df2eb4daf", + m: "8604977c6fc25e99c91f81667d4ce5edc66949d3452b08036729ae1601443140", + signature: + "bb8d1f5ee3dea825763b0f175acab73ef7d798550b63970e4779d50e7b26080f20bf03b7a25cdafef44a46fad3155f6e381daa9995f433581976f3e7604d1854", + recoveryId: 1, + }, + { + d: "60913e6108d46c8abbaaaa537133d6c59ee28c7e5fd2be555842d683638c0aeb", + m: "d243fc8553596a13cb772250e4608183f86ed42e3316941e2ffe1cab62d39aa9", + signature: + "09b24d3265d512fdb375a9737398a18ee6f2fbab8795148d1b9264ed1a50afdf7d4efa80e1ffce1f7066415f6e6695c982d1dfc42a71f920db69f9e545a890e1", + recoveryId: 1, + }, + { + d: "43b37b94e2a491c221db72760fea410b2fab79a136cb41c43598c6afb9391258", + m: "df8e1382d17bdac18f3c854815071226385803e85f06114129ebbcfcef991278", + signature: + "ec8cd8d7dcda4ff770c2858bdd93dd64806e218b11bb1971a4a09b065760b0403ef6a30aab254e9e4d4d3b9c79054d369c57d98ac833e8dad081e50ad73f40ce", + recoveryId: 0, + }, + { + d: "b894bb11cebfd3e7661545ccaad1a89e85d281c81c7f5b0d442eec23f5c4c5f6", + m: "d5844bdf856d3659e14c4b09f685f3e010534a9824e9784d124d9fa5d109a121", + signature: + "8dbe7251b65d3a0d56f241709d8f9d3d497f5a8d0f207c6bc56e99bf0003665b0082b75c1872902713dfeb5f7c815e0de969bd98b85769becd668bb32f562a15", + recoveryId: 1, + }, + { + d: "b4b1938d1f6af7ef4ee191b334e84c2b88759e43b4f24413a615a0bbd9a6d06d", + m: "f2cd992434cf8d8fa9664fb643cc3e51eb2018e099922cb13f1e6bbc7e12b0a4", + signature: + "207cf0094eaad241a1570a5eb1656ad5ababd7cc8117fb125f95fcd3adcb81d341043d044854f0b8570dbd198db7b554404d1442af884c4ced5c2925811cb108", + recoveryId: 1, + }, + { + d: "a336c77e7096b4bb8f8fb5289cc6fd4f1b0e703bc7669c73f5281295d539f82f", + m: "94c1679e307c21892b003e47e57e696091438c64ec11d8538e0ac4cf466d3dd1", + signature: + "6c8b6b49022d914aac370563459dae5340268f4e144350e608f3337cb4d4842c6acae06f982f2ff5a28bdbd86d202141ac0c2ed6b4778fdc52a5336f7f49bcd6", + recoveryId: 0, + }, + { + d: "2705938e3b45c89308355d9365a754ad547ae16bca4e46d41c4ca1d76821739b", + m: "7e3bea7a0704f2536463bd5d7a9adc6d96c4660d44776831269deecd2050a4cd", + signature: + "d68bef62702efadee5f135eb9dfb8114afa793d15a678037520f1b87dab90a6851b824b191f232a604b55b0841de74472e604147194f7ece289ddba472b0c4c0", + recoveryId: 0, + }, + { + d: "ebbcce6d150e34c22d3705ece398b2e8543390c0df30e777c1f72e5b06ee0cdf", + m: "49cd47d7656cb26f8d85f5fe27c50fde937a21d480f3a5af83fb5068f1f66ec1", + signature: + "1a745596cbf6d49135ae8a2de2f2be536fc10240d2315fd35454487fed76a23b5d52f1036f0e70a958af8247006007945f901760b793a6db5c78251d83d64929", + recoveryId: 0, + }, + { + d: "9f5302a79b31d8b69206ac6178259dbd98ed6d7ddd290243f5d2b12721df0ac5", + m: "ae00695a8d87b5331c0b3f4950f9e841e0d7fc746e0bb718e87ba2108c7e6187", + signature: + "92fc130ed0d11c255cd3cb18805d6c1e6092a20a8c97c975798a6a51193dc114369dd32ca8e2d0ae98b93ad0afdcbcba6c43b800a4fd8deb2977e1030fbe633e", + recoveryId: 1, + }, + { + d: "8503943024b15b11c6734f96791f045448563b1427caeb6efee6641c8a0e6a0d", + m: "fbf531a9e88aafd03c93582f75f47fa202e95985024d717881d382ddf5a92792", + signature: + "9ec89d40858b2c3adad210bf451baf1a1763d6058706684e3d6464e7f15066e3287a34927cf814d7d9fd0bac7266bcdc4beaf7088ac840b31263f1bc3d4f992e", + recoveryId: 1, + }, + { + d: "acb56a35f83b92e3c1a6a31583407dc9d95357d95af96a7befac16f3059a6648", + m: "d2a0b9b06b910d46f967d39c9c01b416de05bc0d27d0453cbed48e0b5afd0225", + signature: + "75752c5dbffb65828b4801a9d2e88dfe1622301eb202010c23625846f8cc51cf1fc26f77b2920974a92cf344c700a9faf45a522d945e9b0f1f2eeb5e217e7ff5", + recoveryId: 1, + }, + { + d: "bc73c98a65cfbab8b4ebbb349e4f926afdd915555360eb1b91e300a85a710c96", + m: "feb4086834573fa7474095603c7c2eb1732868e6fe883efb737ec58927bc90c0", + signature: + "18047d6a5fd00e052d303cd8597cc483e459e3805f621a6c304a83a1ea9f7b734539cec0bec1a2df1877d1b4a9e388dd8dcb5893cc9d5ab0770361850327670d", + recoveryId: 0, + }, + { + d: "0647594f6aa9dc9948c780a448ee4e37130df2c2323107f287feef39720a09d5", + m: "70972c6756953e7918996dc7a4a5ac7fd4117872c97cdad2cd44c67a5743c49a", + signature: + "f1b64b0bb584827e56b443741a14d88d6d476fadc1400819520c12568131f50a6d2839e4dce7c912ff0968e676bc9811d17ef254714850c2513e9238ee9afb6e", + recoveryId: 0, + }, + { + d: "0bad6f69e22c7ea3d0a5b0040b371a00a541fb4e2c3dfafb4c3e298e8e72452b", + m: "9ba0c779ca23f9cae6df54859f221dba3c189b5e64e7899585a8cd23f45ce955", + signature: + "25463609fd4001372317c4c9784a85528d5a02ddddc508027acd409d401ef5ce37b80f477d6ca918a4e29863601fd21b47af1122f68be5b28f099db80b7ff89f", + recoveryId: 0, + }, + { + d: "cb9ad7e8a172091efb220d34e85754fac6ad36610eb7cffe18bfb26d5f078e34", + m: "3e9d20ac066043836425eb13a81755a0c0022775c4d2ad18d709bb00a8508141", + signature: + "83b22c84139cb15f4c0c57a3f486f87582f047e55587e6c964d0385fd67b3d7105b2944e992a288c6fdd649268a0a57c9742993f0419525bbe7cf65f125ced6e", + recoveryId: 0, + }, + { + d: "5482223d03ea55ce92a7e20159c66230aef4d9efdabd974a02fa0f7239196f83", + m: "4f8becb549b61a4a2497a7a84c8f8dc1d1ce0a817bfbed12f3a8dfe4ca0cab2a", + signature: + "34189de6c9a5a2a922ba37ca2ca3381ff3c5b3e0423dd5c57432441fbe84e7d44c9cdc1bcc99dc95c946577c9170dabb92074dee27d3d862f7004ddf2e2fdbca", + recoveryId: 0, + }, + { + d: "2d187396af6d5d49122f32cd7cf94c2f71132035d0bcc0bb6b0b51cb231dfc20", + m: "655e8b9dce1283dd0b7b2e234e9af3f711c0e073128837533d3cfaf8f5500332", + signature: + "edb4d667ee21912bd90cd96c3f1b6773055c440150e4ca7e4a7ebe3030d9067e6a29aabdb56ce310b541e2f4232e773b9d643936c1dd42f36c0d680df1a204a8", + recoveryId: 1, + }, + { + d: "93f60310b3eecec1c19e51f556c92f402fb413ace6e5dc72771f055e36883fdb", + m: "b85ad03b13288294993a291f12ea846b13f7a368c2ec98a0883d28289e77de3e", + signature: + "75cf765565d804813430bdb2f828f816c8e593833a71332f35eb763126eae9ce4f7a2c6b327d8cea25591d4d23d4bbc27d354be6740102aa337f35b17a7749af", + recoveryId: 0, + }, + { + d: "e0ed1ec54ecdd40307d1784b04046c8fb3c931c7536117f34da26a5365159bbf", + m: "83459bfd31a8a0e9abc2ee729531c6e44f242204b8e3ef304c60d5e43628f4b4", + signature: + "c2e52bd9e2cd8a9686eb037523055099ef22f9615c45219103a295222c8791dd2b73358294467b464be1da4a0d9f543f3a420db0575a645f82072bb758e8f31f", + recoveryId: 0, + }, + { + d: "dbc52870bc8b85bf0f7bcadaeea331dcc1799c6931a1d09b1e47f563ed964971", + m: "f6fc7fd5acaf8603709160d203253d5cd17daa307483877ad811ec8411df56d2", + signature: + "c26276e382bb104e7d3297da24218e363b9569639dc96a1534ba8b8d4018b6427a5f06f66b1b44fcf09e438e42fb4e584f3254c7507386a557265fac64164055", + recoveryId: 1, + }, + { + d: "eb198056ce28450cd8582268c1cecbd0adb853228dc7a25a95e14693d8165de5", + m: "2e63f49054e1e44ccc2e6ef6ce387936efb16158f89cc302a2426e0b7fd66f66", + signature: + "bc2536b469cf15b9d2dc01b45a426790e6275512cdb3282dd0b34d7244aec30f76a35554f00e7a0ede690088d85da4a01629ebbcd2d93d97c6e054a4df08acbc", + recoveryId: 1, + }, + { + d: "0f785e3b1a4aaff5362c1e03dea18c9b48390cc1b3b889e9aff9d32b93644a44", + m: "e3973b272a082c25cbc27d374105697dd59f7d66e7aec1b86a33933920b743a7", + signature: + "75168f1b1d80f2a043e67b6f4f705d0aa24f904e24784a1b29c564bc3eb2f02d17a85185810542d4e309c830fa8efc4f1b04de7e04835cfe8a07b799eb50a2f1", + recoveryId: 0, + }, + { + d: "15ac95c3e8afbc8b3e31908e1341b79ece54109e8026040bdb08dd4dd3d9affc", + m: "00ee9128cd8a3e149fce6b45f2cb2f8c7d23b73e1bd2786ea22f1b8f75ca3c25", + signature: + "bf4002b1f4dbe5b40fa75d4e603925934e0785d797e12b427848f46023b66d1f420c8ee23e0ee617237d75f0d0192ed5c4aa8c9eaf4f40ccbe2ae6362a0d9031", + recoveryId: 0, + }, + { + d: "facb0c6985801ac300a56e242bed573c0f5b75e3305ab1e1e51c8798f4637d39", + m: "3074b14cf91c38ccb40c2b0f033942e1801f9a6887b4b34e41c7459eadcb93a2", + signature: + "78b1f7322df52727f4650bcc5780cdb6e8d2ebc5b44c91b6fe6f18b9c2684bc2567dbc4eed5b9852c67b702a4b6f367debe035776eb10bf052f87505f7aac9b2", + recoveryId: 0, + }, + { + d: "3bad6bb7602b0e656679484bfd0ad07062d440c18d7dc3efa0fcc0fc50ba24ee", + m: "312408095881cf252db4251587c1a24557ce082cdd06f71e4190529180b3ec95", + signature: + "6ba9260dd1ccc74921dcb3df5b7d0400acc5861f92e868fcf6018e2db7d17a7f5453bff2b84195b61e7363f09f543b2f4ab62b0b279472bee63c4cb3959b3a39", + recoveryId: 1, + }, + { + d: "f194aa5bb978a97efe300fbc24a49a41b2790cd937484614e94f3360976eafcb", + m: "92b8127bd3e15158fe96b467d681b938ead68c1bb82c4c6151d210d94980a891", + signature: + "f1f23078d2c4817eefa295348f1c5a16e96b352b5dde0d73858821ca31e3901453000ce5503a4e3ab42f38d4bab9cc29731798d904b43375515834b414b95d91", + recoveryId: 0, + }, + { + d: "9a7ed8fa6a63ac2bda82a5fb7f7c053c22858ef2f52066ac20c6393595975c5e", + m: "78cdc4c7bbae84a4d3efb2d060d069aa208d3e33cb558728f3f44b9c47178810", + signature: + "8e0942164c1dec404d49b35438a1c4a5979e69a3de800096b28f958d5cc1ba5c606696185a005888080acd5950811307604d4ab44b16b74d0bf8b3dbb4ba1ffc", + recoveryId: 0, + }, + { + d: "7d79477a8c0fc6147e935f804c40547d3b7be653a2e000cb23dfdce522149558", + m: "c3088a788fba9dcaa84ece15a4cc3df6a824ad7b19f70a1993947304ca6139bd", + signature: + "18d8d85e6268b2baa45cea81272a415fa792d0271a5a5d9ea1befcd4b0008dd00052bd2ff5719346879de8b787312f4c9b7f7f4d7ec0657285377b7cab0cf413", + recoveryId: 0, + }, + { + d: "816e73b4fe59407e230d50f957fcd8cc4273268db5873b7dc6d673e8878af0dd", + m: "fdcabd7b848586da954dc8256337646eb07d6ec49214a41ecde08f28ad4db44c", + signature: + "c79b5ecadbfbe005eb9f6827db7662017ae99dac1c6e0f8154157d08a88fa0b06fa57b457f08c559974ca1cfc2d53b4495c353f37adedb8103cbf6d5f3db1c3c", + recoveryId: 1, + }, + { + d: "0a2e765805cc4c25e44a47fa2ce22c72949f464a4746184a96c733eeb1acfb3c", + m: "32c5ef4792ca1fece75b7994d8f8eaedf98b3b1634b1d84ebbe8536059da70b8", + signature: + "0950a13de39b70a89ff44c9243830d4f35e35c0f6d56f252e4039b2579caed5a293ccdba82ebdd30dec429716f0383aedd49f277719e1458af13072956fd5a70", + recoveryId: 1, + }, + { + d: "be3d83887b2df62627c571c46b7576b374256ff5abbdb0d283cef1272927db44", + m: "13c3caf472181f52d9bd55ca4aadca4cbb42260cc6befa9c33bdc4effb815a82", + signature: + "c592f4155b9b54f2344e4df0fd13176ea415d06fb994f4b133b399e891e771d5527ba50f30bfd3f52fd2197773d2b38f36502bf55a3c56617ddaf3a1697ed53a", + recoveryId: 1, + }, + { + d: "12123475ca94dfc45ca89d9b58ae43b9a8b945276fc4b704b3eef2678edeeb72", + m: "e4527a6551590eae5f1501d9e2abd488861041a1fcb6340eaef86278baf37bc2", + signature: + "ee0f7886802fd2ab3da3ea85e01e4ed28f9bf1d666de3e377d2567b95d07f6d00e1489a8917cf3f5b2ea73511196053aec5ecbce1cb1352090068d5ac5eb94a4", + recoveryId: 1, + }, + { + d: "90234d50380708c98d1eb2f33e1190b82e575ba1fca3406191aff2da8401cd26", + m: "54f68b20a8b5457ae4a44260a473e71c69acdac53e54e0712c809d05fe5ea34a", + signature: + "0f11ace0eaec4c8d4f4a041ea06f355658a9c38706e0ea3f151fae9d7887bf59156e75edba78bcc28a8ad8e015045836084901233f2aa5d7f2f86d0704349cd6", + recoveryId: 1, + }, + { + d: "412e6e717979b6d413780c1261ac91c06528994eaad27de520386247f272a23c", + m: "12b198ccca94344ad5cf8ab9831abd9bb1e19e172de2f4b03e1684c13cc111fc", + signature: + "d6e073803ec319420397079ce7329d1b80d6f7f98dc924fce1c32451ac5105ef02002339f9d138d1b69177e68e2842302e80d6469b8a843feb121f75cfd536c1", + recoveryId: 1, + }, + { + d: "0dd9be92ca777e6e961b908e433b3c9921024aa1700d8d9a4a5617eba674aaf7", + m: "2fcdac12d30f92d9b37e3c56a80ebdc45abe2de0567a92b74eef986a1ea13458", + signature: + "9d7872d41bf86a7c74a129fc0495be432559d56345a37b42399cc518d9a62c5c2e217815c11e64a7c8d7e46e3a97609b67901c99d6e55a428ef523430f959f88", + recoveryId: 1, + }, + { + d: "4c1a6278ac95fbea855229c8d6ca6ad01da6520355509f8d9ee67c1771a1eeec", + m: "046676b4bdae1469fa72dbbc34e08dc4b141f9111ce66852b8851c311214d6fb", + signature: + "5ed6ab48209e687d74014a46231135d48ba04e59ce365bd12280c00834c66825222fdb1caacf11253cc1a373a0329c3d47c3a589fc46dfdb9e45d4d8653a2e00", + recoveryId: 1, + }, + { + d: "02400f5d6fcaf74d7ed2c227e6e245aadc78e461987ceac14bdcaa30c4ad7208", + m: "d0fae4b82d91599b41853c1ab76a2e2ab1eff6577e8a5c8bfda173c7342b090e", + signature: + "845ae621f92b5fd79d263e2e64c7f7fb80ce152b5fe02eec9dbd3841508bc32262921dd79b23ba51c8c83d4dc703c6924da0cfd768d19e95946d7758797fc711", + recoveryId: 1, + }, + { + d: "9f747c75f130d5c313f07a219f1bccb5591c7ef908ed59b81f2072d55e27fbef", + m: "5d625ded5d0db07cf942571089f378468b1982f4ca915e230d64053ab415e4b4", + signature: + "a49310d804b4c916594d083a33ac69431e7c9029423dd00d819cd5c023e25af80b5a540ae2e2c4133ec564679d37c831dc06a9f834b84171659720e530f9331e", + recoveryId: 1, + }, + { + d: "ad584cd39a5b020560025d46d3449847f79685de8e487f4acb019b90d4820186", + m: "036cc3ac8fa95b6fef7f95f62944fb18c32bcacda34a2caa510952c85d27c490", + signature: + "8a2ef8b7d941e697d84e08a3ae8cda4590b9b804e5358b0f4bd5ab9e5b13c4403fffbf8ae20384893785e1c834e3b0bfc0e8efd56b9def0d79c6e74dc3267903", + recoveryId: 0, + }, + { + d: "bea6878fc351a709457da9c541e2780ad4657f013a90510880b84cee233aea9c", + m: "8849d8a3039a41096a066e8d13e4cdb5d9e3ca4675281618a0874f7d83011467", + signature: + "0b9ae4afe0c8d376d8a09ba2dedc60a1349a2dd027db3e5efbba8d573f232df0302a0083cce3a111ea0249f206ff075756857448c647c2b8006bbfe252185d96", + recoveryId: 1, + }, + { + d: "f2c77298324ae1485d65c2cb8a4a6a1ea3a8ab70ce1bfaf3b351f9dfa4fbbef1", + m: "01276f94021c037d8f96baac118d0b4334574c69c26845ac2ef8372ceffca680", + signature: + "0aed9f09ceeba66e198cf967b516daca33c8d07377d92438664cb6f0f8ca4a394844ee1328658969aca6fb9991ecdb892eb3c75063f3b7251ad56edece14c44c", + recoveryId: 1, + }, + { + d: "bba4dc7c3f82c529ca8839fe13e38a0267bd70299c087a09df9eee12a07d4a73", + m: "81e2ed6d7b0c88cae41fdb652aee3975caedd9dfdd5f9c4298c3dd96623ce178", + signature: + "be4ea8efb417d3c1185bb32a741bae9842a38d466797efb9112c686c3cce0dfa4d2569dc41c8f31c777b7a2840abf4e5c2fce3133dd9304f853e3cd0c6a8ef7e", + recoveryId: 1, + }, + { + d: "6761a102dfc901ed5d7e53ac9dfdccb79d04425b5366c9f302da967151e0d952", + m: "776dfb22fb9b9a5398261411e0b011eda8d3e979cdd61994a5c02b96c1fe24be", + signature: + "b771d92d74ee8ae399cd5399fb72349568e215572645bfff50a8c7b937bfb24049fce3cb6e23ac6c55f3b3a4c07465bdb4ac34013489039ce3fd04ecff0e0291", + recoveryId: 1, + }, + { + d: "98f074e773c68d33c4ca7406abcbcc6c1abe36c94ead033b1e2a9aaaf50c95e5", + m: "6ea18e2c39a308801eb8973393413c116d1d453e5b927ea51e54d56009d61879", + signature: + "c37ba1a70992b3e9acf5143c4fbe69aa1009dd92b25ef887bde8b0540373f336535d304fd7b8622374f95446159936c358fa464573304fd51cbbf28290e1c974", + recoveryId: 0, + }, + { + d: "99202b43138a30861df6011bed857c8e217c1800efa5b60e2b3ce25eced35041", + m: "b03380a304f3aee7fcf5dc01b0468587c0d652ef5bea7d2059bce8df668a0b6c", + signature: + "96b344634c5fec22b9effd1681f701c9cb662b5b004c7e97d9731aa9a3bd70f86c070167c89b948a6a2c72315d63866c98012981955bdde7f71d1a31812be06c", + recoveryId: 1, + }, + { + d: "50f8c5f830cc9bfb03a9b1a6f811f5e8e80ebfae78b303574ad9fc1e7dc7c879", + m: "ce8896032049327baa27a407b634f2143f452050ca8f4685a5d4ceb27d5615c2", + signature: + "a7b687b4e3907cf7e28e8828bdf2a926264be9c85dfdd7795c84e1eeb7c3583a3d0c47514b40fb89e9ac0fe3d0aa105560a5c408975d5c9da6225a5ce7d78d28", + recoveryId: 1, + }, + { + d: "cc6a0b971cefa1d6ac93b51ddf2ca96b3e5c12ccdeab0221b21c1a1352ae8e25", + m: "cf6642bb15aece69d4036eb1e7b0ed02e0b5a67b4e47e19df96f5588b998e3aa", + signature: + "3372af44506ebd045e68e814acea1c091a1ddddba2ec37988f5546b7652f19e87646118ab554166f6ff8f6bc897d71c4512774aa06a72ae7021bac8f28c91d33", + recoveryId: 1, + }, + { + d: "64f8728c933b63e6a17d7f624d23a55df26490e32ddcca3eefab1915dca01a48", + m: "1729cdf3fdefcbac3ad6d9a2edb6467818752e0450499bd20603b29e41ec5a10", + signature: + "3d63af6cfd0030ea0ad785ea702b261c791c39d3012bf13c8d6b285ce6322ac1045e46602f8a23f840a9c001a00a08e1685dc60fb3efdd7403455a234243a93b", + recoveryId: 1, + }, + { + d: "c34c249d6796be5e644cfa486552af739e61fcba5f2bc3b028324ee211434169", + m: "0ea9ac1a32e933321b4d056b349c3bdb0a96f5496b46a6908b49bd3b88c3c523", + signature: + "3e2aacce4dccdc0f4406c8b6a53961db7caa25c8822e8e258e83db6dd5afc85541c213f5e17d8e53cb9051c8248881543cd4cafc0e52030595a10ed7ab3c60b8", + recoveryId: 0, + }, + { + d: "586171eff2e9c11df37eca5bcc19a077928f2fcefc9206cc2727028fdd6125e7", + m: "2448aa74c5afa8f81a1133dfbc11136866cb52fb83a44d8f4e28aba17b7c273c", + signature: + "1cd2204a9966796843b502ba38c8621dc2e3ccf3a82de32260fe41fbca989d065f751d18077fa67871f45425fc9385a0ca809013ab9e30d9245ff1762d8eeb44", + recoveryId: 0, + }, + { + d: "c601b8212f835985a3871d1a5e48739745955fc7e5cb71c0718c2bedd4651b66", + m: "125f07b369fec4efc196a63709a975fc3d6a5e62146c357413a4e027c4f7aa49", + signature: + "85f915df6e3dae35c7208165cc5d63258620425cdc293c94b8ddeb520e780cc433ab36a4ed661f6d2701fae08ec0d8dd1f3e61a53cba45434b6e1806640bb04b", + recoveryId: 1, + }, + { + d: "6200ed4f48a486f3827cb7d88fad25f44aa56f8e70b0cc4ebbc8fd2237e42d7a", + m: "65ec80c62091102107494ebc9f2dd9e6a5e0be861240d99ef729a481ee2175f7", + signature: + "7ada0a8c77dd765ffdbc025266982c7ae9731a2ecfbea53bd918390736ec4f2a06699c532695fbde29871556eb50e88f9a17aacb1cc445eb4af26586e525330c", + recoveryId: 0, + }, + { + d: "f5b6a7d4a1f8cf4d89e724dc6903865f51c0ed5541ee7853dea284ddcc1cc02f", + m: "01ca3916c6d12c9bb03b3c62aed0b285edda2c4caa3bafac1c6bdd31924e3a17", + signature: + "5654d473a4214360b728b4c14c567eaf0ee47df1ddbbf319486f57d37fc3abf57b2e4a4c8744dda6a5b3cb6367bea467c4e23d5a87a3bb06bf668ced187c4497", + recoveryId: 1, + }, + { + d: "597c894f2cc3b7698be7396b6596a8394b26ba8274a08e2e033b5b62cebef972", + m: "4f8dc419e8def4f6fb8ad3745b1abb7bd0a6cfeb1a7a5c15b14b0e5d141dc40b", + signature: + "ae63553c26d979bb6208ff5b9a76b2c1673ce9d4ffc9aa8f8946caaf05f3bf253d020f7f46c3b586bb0381ee492acd4dc6cb1f0b6cd08479480243068ea51cbe", + recoveryId: 0, + }, + { + d: "721732e20a799f21d01ec5e4da7d31d8b8b0bbca63bc32ad2663abde3f0f0872", + m: "13f71cf0fe66385b3911caa1bf233398c834f07c460b189defafa58961f6f30c", + signature: + "bcc4af042b2a067d786e1d8e0766365f6fd4adb3e2d2f1b90ccbb5b2980312e50a14ec02db9b3d7d24f667e1352f232bbccbf623cda59918cda9eb405abbc9a8", + recoveryId: 0, + }, + { + d: "38b771c33884399d19fe810ddd87b8f61a187934f9ccd956bdc6a47f6b682f3b", + m: "af77670dbfb387447b112c5a27189179daf4b5f2d18b0c58970e7cf0e1f924f6", + signature: + "d1029292804b0618502fdb2fdfdf8529ca3413855e3071a64c0ab9d860f0db4d1d4d0ca5f8eeb9859244019a133df334b268e3ebe996e26b8039ca698668c32c", + recoveryId: 0, + }, + { + d: "fd2ee4b3efed0309846d77c96b1426214723ddd200b2ded1f1473503a7b8e463", + m: "68cd2a52882b69dfaa385c0e87e64688f4336d80b00098423442ed0a0eed5718", + signature: + "33693fc3b6b2f8f9cd6f5e10fec40a45a312a73a5519508c9ab8e793650dd7d74e314354fd178c6a97b476590044370636a0ac7d33f949bfcd386770a08543b2", + recoveryId: 0, + }, + { + d: "fdb6f511f7f6e14f6fd44931f0a1f5e70a3d02404af512ecbe4dcdb2109aabec", + m: "397c29d069c1322887fce5aa4eb7afc256465e49067af7c1be5748cd1d78c468", + signature: + "a6ba7c4e1f6bd4b29ba7180d61a9b9f209485460ab91644f67ee7d6ecd29e5707cc493105316f21b1075c17c1f94a296a2c32bd9f102179e1df1bfb50b4fa321", + recoveryId: 0, + }, + { + d: "dbf955553c6722a3a074f774b54da8089ac53395c082d4fd5ff51210c6989607", + m: "6cdc172fa2bc51dfcfcd58a8e128315a9d85441996e35244efc29cae89b2a55a", + signature: + "141973dff0f0e0ac6589cea50f8c3bcc176e25a91b880984bd7e151e47b3751e381cf054af1be2fd986c80b687f3188133154fa49e24a76792b9ac158450fbfa", + recoveryId: 1, + }, + { + d: "ca1b25c2c0cb3ce74830526f8c01d2879511ba5eb37387fc41f454dedde0a276", + m: "bef8402369bfad74ac090b61f35e26cff7b1414a85fa883792651036722bd79a", + signature: + "754ef393d376e9f2ffb20717e32f544cfbed037838920c7dca6b8d86e69d14c86874af3deab471859673e3a69ad22d3baec20ffd29fa641c7d9cc5485ffe2997", + recoveryId: 0, + }, + { + d: "37b520e0dac5c3a67fdabfee38f17069ddc435e9d2a96ab588966de0d13e93b2", + m: "67bb3f66c3be596f775f81acc2c4237525f4a724f911c60ae1eaa387b3bcbb20", + signature: + "3f46fe3ee9101ae8ea711ab14611adeddcac99d0bbca0cba11d243ba0f28dc8b6775f62f3c77b027cdd41612d86ec3fbbf565bc44aa1df434202410de63e5438", + recoveryId: 0, + }, + { + d: "f7d85ab66be6cacf18dfc04a26d1b7cd277f14c671ba6a51855f8629c617c299", + m: "3bb859cf36d7c80fb7e0919b0249a499a22762062f79f67239c08b7baec879a3", + signature: + "4a6c91c0f241514ef034c4d13fd737377a023d3d100fdc3cc89f29af1296fdb4652b84a7c10d410304acd7068fd41e991bdabf58db75e2b774271a03105faadc", + recoveryId: 1, + }, + { + d: "20f23ed2f4436bb928ce2eb3e3b63b567f00e2637ec6e676243841f4f19773db", + m: "558a438a13dfd28d7208779a6dc2875b6dda931ceb0baa83de5af9132506c4f6", + signature: + "8c8c4254ed5781cfc1fbf53f29841be226792a8ecf7ebe67614fe2d17e17266c39ade2a823ce48a7b92f035a2f8c26b408e05848711bf9a1591b7531a9944d1d", + recoveryId: 1, + }, + { + d: "5ab0f18953efe0f414f37a7360860e7eef81623dc242b7c63f7c57d87766dfef", + m: "b7b1cd9f59789c875eb91d53ee3e2887dc93f4f0b3fc65dc6d07d5b508875734", + signature: + "47a291464f56621863fb11b183ba59d81c49295e4c5871dc0028d20b3c08b3c46bdec397c2b45f3b5feff860654f550b87bb0375aa5d79c731dea8560fcdfe4f", + recoveryId: 0, + }, + { + d: "943e5f534dd7982eed6861c73461d4079f53e5c1e36e3075398de5dee932ce3d", + m: "0f93992d2bcf92ac2d73f02d85c034e5b3d2fd041e5904d85bba8eb6a04e58bd", + signature: + "ae9f5c178f3e23843b33a802259e6fe7895185b6a6cf6300a7860e887106dcaf2d3d55d4a2a33bf2622117d7a39ef9f936bcabf4f4e7522830d78d59fe47ab39", + recoveryId: 0, + }, + { + d: "8e1f911dc540d985fd026762da7efa4b923034a031ddc0c01259550406d61b82", + m: "3e3971370999653bbf9fb642154d5cf057a4434806c392daef342f2a02106ac8", + signature: + "23bc931335b5ed7667625f92b349f14c47cbef051bc85f5ce9626977975f970a2a45b76786b6f18827889f48fd073669ae0fcee10ad9d8bcb9d9dc27e43cb957", + recoveryId: 1, + }, + { + d: "327eb784c853e92217a6a04374fc510dc2d491457acbee9de03d13c7f3c666dd", + m: "640186af0d1c1c2421bccdf7d49924fef2656b0592514de9545b8c40959be118", + signature: + "15ab6c7d3b8635845f0ee53aacc699e0c27364b555aded9f3da1c056bc1f77cd7322aa30d8257acc8f662cbd7c869ee6028afdbf934bd73c4de201a602306769", + recoveryId: 0, + }, + { + d: "091f6c5779e1888904c651e3f5c31db5f3c7b027538e77772be10c81a1267db5", + m: "1b263cfa26b3898c160182b8ee45875c9ce8d347b7e1ee7feefcb647ce3cadc7", + signature: + "5c0fb114f692f5aacc907741ebf2614dd5b2ddd223f2a7039d98cf2c2a836ca55af0c75a97aca875b99c525927cb3093e41dfc9b5f9d2ffd165e1bad283b3857", + recoveryId: 0, + }, + { + d: "0c7e44917fb484f0d5676f902a23fcce638213f9780fe3d026488693818d68e5", + m: "f2e8f985d3a7db1fb42c8e6b209d884b8a5e2183fbe8c52fb400fd6f65270600", + signature: + "f39ddf5659490979bec6b5051ff5ff598aa00e547171d6864bb64edd50a0b0851cfb4d22b74d6a5ef7ea890bdde91524fa0cada31d2ec4996b0aa1c1eaf097b2", + recoveryId: 0, + }, + { + d: "38cc78b060e031b591a197d205046b2b82b962cb552efed486816e4545ef234f", + m: "800862b6754fd5004c768943aa53ef26b9c46ddf80076acc6303bdc6edeb26d8", + signature: + "c581efadd58bcfd6742fbcb289ff16b23079ee18ebe27a702f9aab48444e97ec6030cb835798789137c322c174ece7d5a5cf7ef48e57729450491da75407548a", + recoveryId: 1, + }, + { + d: "bcce9419725564480361d9b2be892cde3298d41b49b17ecede3958c5a76820f3", + m: "e980a623e1c237431f5fc5b333a1717081900b839e7ad0e03e4afa17f3ceef8a", + signature: + "4a7e4c1915b67d4ec6f7381c4176ef98b34fc852e8cd9e99248cf7b26b62603d0d73e64aef57dbe332eb733957dc861e6fbde781ab7e0e570166a9def74e8b2e", + recoveryId: 0, + }, + { + d: "c42ba03c4e8926faa7209183610782678368b6302eece248816859dcfbca4f75", + m: "f157e12e58ca13166dee7e2b69aa5c385542cbd26c6145a5933c5c7346c3958f", + signature: + "e31240d46a97da90187c06fd687d642bd98e4705d03cf4bf9e7f15b9df69e7b536f212df412065dfa0fb779b402c04a603a45b1f4920998728f111fd995d927b", + recoveryId: 0, + }, + { + d: "87a69582fbfeb59ae428c69e361b078f31a21916fa7b9754f7991348202c47ed", + m: "8bfa2f2967114d11b7652e2d96e2e239c3131503047624d302af5264c5a97171", + signature: + "111d56e5ef0e4f626e573c9caf427cbe11f7ba905247198f6d1e5038b363e9fa51a3e5fab802ee85f513de5ddaa9319798df259b9faf4ad0bc9cfd12f296f561", + recoveryId: 0, + }, + { + d: "57c5e181fe338bfa8442aba50d1d58821dc5e653063c50a25dc99a872adab855", + m: "3ea7e6a47f9070d4291a44a65116d4a673c0187ee289d084d0b57cbbed1aa097", + signature: + "792e13f158bcafe15143d57aa428db74a4aeabad8f4896abf22f383e64eb13b315e49f35673e0f70a02b6a92b778e2679f6524fb97b4fa8000542829127f776e", + recoveryId: 0, + }, + { + d: "29f42728c7582da77c43821a022ab331173537c5370a56c5ed29558b22cd1054", + m: "b1a3c32207d83c90e0a163d2a4b3e3b676e2c0d646ca1f15ea8a4196859b7fd6", + signature: + "033535ac37489281b671cea56bc9ae54804a4b3559634f38a526d7bc9c54318c610f154a41c684cffab7d3c4ce73168f5ec7cbbe656e614c24048dc5406f5f5f", + recoveryId: 0, + }, + { + d: "307657e61b4677c0d9dcae95ed347d938513f29f8d69bb632a15857a2f9ed87a", + m: "d8af8c0ea29dcd677243f13afaa8bd277654734721c8f1d33e5774bb1540e704", + signature: + "fe11bf3a6317d3a9cf99b4d838020a03982b883a2d97f2e1a46651314eb9c1101501097f1e52512a72c69dca5d2ebe17019f0b063ef47d9dd3da74cb3a33c648", + recoveryId: 0, + }, + { + d: "4e737a7fa78ee278c76eeebf26a8d971233f57ac9763d919a8b5590740fa8b76", + m: "d757b5db2def81deb5de9a60c1fba3fd48069ad47dba2e3decde0bda9f6f578d", + signature: + "a01282550db71b745489efa8c749eeefc43793c36c76c8844336768ed7b09be23ec2cb57c99c3ee9926fc1e23e26f6753cbf0af25e4021842345b912c125bce9", + recoveryId: 0, + }, + { + d: "09ef6eeff7e7bba5eb9b0458835f23df631f181192febaa1a79b40c13e596cfc", + m: "98187ad1604f608a43756dd065328bd9be5a8468534edd9fddddbbe5aed5f66f", + signature: + "482b751c74d932c3fab45d75069581a271e4dd7dd9d00bdb4f16c455d761665544e7325105b8daa8d41f5dffebbefdd7fd48612b84288029e3b83d45469fd28b", + recoveryId: 0, + }, + { + d: "973201ddc070b2a05c6824208d2e47fab86abc7ed16c0b25761113fe66d061fc", + m: "31056639ead3c2cd2d78d842231c33c719954232a21f5c0003f8d2ed728f17e0", + signature: + "8bf77862df3464454d62798f1864606fcd2641f4998bf46a66a0d7e642de700211391e9ea8a6df17c8d1d18fe40de24a3aa6d973283ed87ad37c7a325db34a01", + recoveryId: 0, + }, + { + d: "5b4c958102026ad407d8807e662472dcb6c85309eabca13fc7e771bf4c28351d", + m: "f09876c9c2ed655531dc08cd3042c8c57d4ac34a8ec635bac4df0faf5881de14", + signature: + "39d0a3477af4dabd5fd7bceb576777879472aed162a36b2e224e6ca567ad36345d7e2015e888086f664236a765cec2e387ce173ada9a240510a48027cd0d639c", + recoveryId: 1, + }, + { + d: "115c39b086ce8c9a7f5658c3ee186b5d0cf4c4d5db6ec33ef2dda856c4873188", + m: "780b66865ce1e33c66793da3541bcf9f9324afd3819a3f38cd3da60ca4c38355", + signature: + "cee6f6059308baa6fe62555f143abd985d119aff8e2a2db0c005721ad19e4c7a232b6a55612834791d178e5dd4b1a80d84838dfa5ca7374585cfdb33b95a2f46", + recoveryId: 0, + }, + { + d: "0ced6fc358f005d3a683d21545acc74b600a1545c76be77943d368bebd40188e", + m: "ea2466201e2c7266e1b35aced2dea17337236801f721e2b5c256b673078b6275", + signature: + "9cd4686e869b337bb0153b76142d0318bfd1e90ff7f2765b288765082388c94176903aeff2047059de15bb0483059f9aff71886245e0e8afa5171ff8587499e4", + recoveryId: 1, + }, + { + d: "4d76ab9ec80cbe2568d8a74b30d50f774df6973c004851e774dd1bda4db1aeb2", + m: "7520d2509618bfa9762fafe30ff7d032d8b15f366be309aa0f0a3e0b019bbf82", + signature: + "2ef3b2a9fea3501647d5a4a55b964192c359be13412f19511e2003e7db1ae0866780609f145bdae066dc26aa8414c77519443ea964e4b1834337247c4abf89ee", + recoveryId: 0, + }, + { + d: "37087e978bcb0633abfcfc7aa390b4377eb2b8ba1908d1117dd6bfa0fad41ac8", + m: "f134074560eabe587e194ab071a89dd446b9aa652bdc6f103f588966f0a42535", + signature: + "7268cd7190e77c76c0c30546d2a342a315c17add40a4dc1cca069a851e8287545b277a9a2c98d82610d1c4c5db3365c656feba526d08117946d5e158868af9fc", + recoveryId: 1, + }, + { + d: "873e0012a5f454a794ced4786b266dd66bc91d5282bea8903305693d59907bfd", + m: "801bd7569c139e01d76580bb11050cf18278cfab83101467a5f85eb4109458dc", + signature: + "41f8b1f7edf367c84b45306f7a8624e5121e291b64686179d66d405bc5ee1e4d5dc8c4aaf166181a413d4b084d1f0b07e95de6c63fd6a6d77ee0befa593b8f3a", + recoveryId: 1, + }, + { + d: "2a35cfd3f68978978273aa4fca6f5d87a174c3addc5f4aaf28496dd0fd41a8e8", + m: "9b221bbe44bfb6f163465c0dfa832dae296d94fea5abb2c783a9104684b37aab", + signature: + "6015f444b1ebbb81356a930187de8e81736c493b4dfed4892ef51cce92ce0e3734effd61a7180b96c8affe7909f41a861891e39c62804bb9f5c0256e22106050", + recoveryId: 0, + }, + { + d: "8e2d8492d991a69306d3d84a3d0ec13f155eb1129440e7b984c920d40ee93b01", + m: "622924c104d6fef3d19f7a32e1a8bc0d28e18f57e0117c175082b2cd443d34d5", + signature: + "dc7d2d52cf8ed307bd3acf3a6a25120b422ab59656c058eb4e7aed533e7c278e605d8c1d0d5703288a2c81602e446b2553349cce8b116f5f7789866e8f370f1e", + recoveryId: 1, + }, + { + d: "d880cd8765184ae0b552f9528ef944aee250ed1539827e756c592f7df2317f2e", + m: "7b7613b2adc274b79ff8ee317bb1ba5868709b74d1f36022c577dbb3db301bc1", + signature: + "cf03ad9081277606f9470834b36b5673d30969f084f25f5307950cc8c6e972c333b6ddf811afffc032d5cf44adf5f558aa25847e8333a9836f9d512b2f655d6a", + recoveryId: 1, + }, + { + d: "9b2013f01886299479cb36c931e1274b3dd8a41ff3178767b9aedf16003842fe", + m: "021cb293b3ba046750eba867aa83dc4e8d8f32170ecb2c8b2ef960fe7483139a", + signature: + "b8c7fa171c49d50a2e1368c74cfa447fa79618d956dc60a40c6e2acf809d4b325a394fb78f73f19b7087d768af9480b9a1b3bfbaee73084bb7641a4e9be9f2db", + recoveryId: 1, + }, + { + d: "58666ac1a8f652fdf67ecf657e783c419138ccd2a386d4c43004979392457701", + m: "7a9c91b45208c4853662847be9d04c2b62b32d61f9c9c3531267a2e8427c0b17", + signature: + "56b766e3d8d02225516b8adddab2c5ab2d1dca4fc49f901e66950f87551a42d557fb30cc384791f786389441b882a1e335b223cebc8d9c2e676451a7e56efdce", + recoveryId: 0, + }, + { + d: "425c4c367dd8dd2794c809df2408f8ba614e3c8a68fa47d6970d0ddfb648f2a1", + m: "b6e1d47ca80b418ac8fb4cd2b9833ee8086bc40dd38e43299f9f185747f700d0", + signature: + "9bb07f8e757e53f44be30b8b1756068aab6b133e08990af137560361dbe76e93728cfe89fc36ed936d4338c01db6d7a364c89ea31728bfb9afc8402cec1ee92c", + recoveryId: 0, + }, + { + d: "bd8a174c454379ede5fbd768f48c2355910f9a3aec9cd63544d995292dddc6cb", + m: "1c6100cc371b3910bdca30c03f16242c3af8a342a7ec5bdd6036b71e0a028620", + signature: + "8e54da44a5e795a710d3010a0a0985aab7026fbe6b70407e03175d3b528ffaa00297e1e33ea4aba4a57b83c5624cf9237aa436ee3ac3fe9926bb1c3f52607519", + recoveryId: 1, + }, + { + d: "b09742befeb6a00fd107f423d192c738822528614fb7f9467f8628639f2ec1b2", + m: "a434878ce3962c7799b3551e0d76be870ea047f2f3abfacd48ebd98c2ef9ac0a", + signature: + "3efb2fb2aa933e1c71a95a130baf280b3528263e5c79f430fc34a36c2a70c5bc2484da93aeb452828cabba052a1ef9fc6cbe2f7322d0dcda322d0c808ab17dab", + recoveryId: 1, + }, + { + d: "a1ab673b197c7072377d3dc08a7c4b0bd65911b3f75db8455b5254ed89ea0301", + m: "d360c6c292f83842d8c057d08eee53d332bf4de2dc04af26339d0e2acae9c355", + signature: + "c095e4527a68d71932471ac14bfda17256b7e635901a0918dd4fbcbbdb6c745a19d62c528706cdcaedec4cfffd6b75368555b18d07acc7ff5d28610ac5e5cc61", + recoveryId: 1, + }, + { + d: "9ecc587b38686ec99f2fa60651014abba6fb548427117d3d7192ce6b4a8ff448", + m: "2d31e55b0cbe96ed551d4297d0cdcb8e61694fa29a2ede62b6834a38d587e1c3", + signature: + "34bef6dcc0512a80db3dbfc1164c54c95de625a3e47b3d60cde1b53fda309c2d770a79387efdd18c3c23d126ff6e77917c0d6ebbe793c3f1870a7541669e8634", + recoveryId: 0, + }, + { + d: "aa5beb7ebfc99a1d3c3b3fed23d1293202f42072a2c2d2201a94925dc2718d29", + m: "443747d6b80d9de68034431d257a14b711181aa377f88e7dccc515846bad5227", + signature: + "b0885351851ef852e0dd071f8feedd8f9d39dd26811b9518f30881174301d694605ee2f17e0f2e899dee3a48e08b458157d40611ceef7733fc21c23f2db39c32", + recoveryId: 0, + }, + { + d: "8e8cc7366d6983036cd2b749c25eddcd9dea4543f500a002c8f7025ef4832e80", + m: "2625e225b8fdade669a4f58bed4e9439a027d0295cf1b515ab905595de77b230", + signature: + "60e52e379cb2b118dc464d7e78d3c89f59284f5378c4535b82178e32f0b915d514300576e929997c00ec1d7ad29a9f0b21e5666cd9c1539a8dc521e7d30efa5a", + recoveryId: 1, + }, + { + d: "8bbe8ffa14ef2113fcec4af71b89163ebe59fde3265051dc160ca3a088d00746", + m: "1ab25269f6fbdb3e89b90aa3d02aa3c6508c871a6dc4624737609d114049e641", + signature: + "5719ea1fc7f60ee1f06c8019ffdf421f9debe54c87308276fa70d0a5327b9fe556947679c10516931ce8cbdabc1313a20712cf77c215b8529326b90e78e27c9c", + recoveryId: 0, + }, + { + d: "be6fb28c73b437e3a76889a2e9014bbd5c9b70ceae12b3aa538771093d92e967", + m: "e957b823674906f609be9446cc663023bacbb62337ee3efcb2b113b24b4a432d", + signature: + "ac83207757b056745909157f845a208e4f7992a95bbc22a54cacabb28ecdda4533b1949535f734fab7fd1671b0520c9b7ae0fc09d9e61c6578001fc1f9d4d3a8", + recoveryId: 0, + }, + { + d: "115461d36ad0a09c2b2cb2274d981de24021c7dd8aa2b29f3be6b15a2b7716bb", + m: "4ca644ecb447da3c576522e51362f6b66c484648ecc339fb38adb23cbc30a735", + signature: + "c79d0db945a892534ea3d62d751a38be396ff33c6abc8b5c624c0d9b5ab9acb10f2cf8456d7bfa2ca3b2542964f39ef3f5077fe369579982e0300eddc24d8519", + recoveryId: 1, + }, + { + d: "546cd63259cef6699c8d9e4438c457f516d3d2cf1e24573137ea9691a3847176", + m: "0a3d8d1cc6d6dbd9a54bba8d2576c613e3c65bab74bab788948595c4f6dff94d", + signature: + "ba79dfb145f8c892052ad2573aaaf055741e631651b69d6448ed179558adc8e755083e9d836045c8f0e40011eba5a2d3de7f2745dd6854ecea04f94afd45559b", + recoveryId: 1, + }, + { + d: "9143b57339fb88657ca94856d623547c1ff1cbb759fe4f73538d50ea07cae4e4", + m: "029a33870b37d2dd04885964a5dcce5d30bd868d831699e020bc44166c48e41d", + signature: + "9de099b2a765f3a9c484328d853f5c1d0a1cdecb3f3cdb205e0c0f1239f5ac313f45d79ac050b90c943c97ed5106175e0ab1eb7a15588b26418dce6c881ef417", + recoveryId: 1, + }, + { + d: "4bf7cf6bf5ae000a3b8359422ef1abc7204dc23b429d86dfe993a48b0bf04c98", + m: "46e84226996b8c517fb9b4fe19224573d547e2fbd470038505a94a92215fc39b", + signature: + "a9ab22e12d1fee4cf1e10a54b42e6f0122b4ac9f14970cb94a90184ff03aa7eb13702589d7cba8cb6d7d167c3a5566a5c3310f4c9d5467c3877aad14f0c5da0b", + recoveryId: 1, + }, + { + d: "dae5fd1eb2a5b85b97a05fae6ba62eb74110d295a10a60a40f6751f62d80093c", + m: "dfc2fbc16e6cf3b1d924495e2b8d4a8cd7caa340142c6a0f1e8673edeb9065b3", + signature: + "650eba45d730513e7675327bb31c473aa3d41ad6c8dcdb98d5e62ea2d42f7795795b8a37121a6e8bf56bb4acaec751be7acf55b73c1cf4912e183b8e1e0da648", + recoveryId: 0, + }, + { + d: "ea412fe0c585fd1193ac380ca24c25749606b6f46d39487fd9f8e180e6f0740f", + m: "8489edde0deaed3a2d5ae557bae284b7abf63bdf9cc1468d9494ef896e31f2c8", + signature: + "8ac52c2352753d7e70d2b127af2bba5aedca4b5f8be627df7759fb44ce070b1c75c7fc8b07887d869068f38d4d4491ea3d3f97b24f9afe0344684c74500a1cad", + recoveryId: 1, + }, + { + d: "54bc00ecfee7b17131408099622e73182d5ceabd41d6dd85c7e9a606670c1ad2", + m: "c5058aecd1689ed690690d5a13970b59a1bfa71572a47cc4d282ebc949f657c8", + signature: + "85e4eca79c7665335a01b2ff4098cce5d05a2bdfc74330d7a8948d5a8130cc4a423142869db576a41e98daa0d7dd99529939aef3aea413da09b407d7f266f4bd", + recoveryId: 0, + }, + { + d: "5e34a9d32146a20933f306f3ba9fb3b4ca037436a10a5954034b7b6fe6cbfb84", + m: "decd999331eb1f5465be132f2b180c6dbb16933ae4bc4e894ece60bc2bccdd5b", + signature: + "5600f99db2a53bba8e51ed87856b632bd22f18fd4a7d06fc512d20efeaa6947120d1ca00730c5235410be2ede4664452ed03812a8147e666215960e9a9dc862f", + recoveryId: 0, + }, + { + d: "76ac14f4327e5c3add4cb485afc569c148a09ca3a71b4c6ee31cd264bd59979f", + m: "0072498f651b64cbde513ca8a77c0969c32cdf3db3dd572c68c4d0fa08f2611c", + signature: + "650564ded45d78fd2ecca9ace2caa665508ac42a31ad8e600145c60c68e916c065478306d6931d43bb6493f039c9aad424e19f4b8b7b753ba7191ea6dc20d01d", + recoveryId: 1, + }, + { + d: "d0e1c0d734ada730979701134b46e0b4789cc6e459c3737c79360926e61c84db", + m: "2d9ccc655db3d62a980e658f5933a59118db9806f75d7cfbaa6c2e9890de35bc", + signature: + "fde72762065336dd8b44b92c7b2fbc2bcbf5f4427d966a757a4ea2b685f4f29334a9f5797b249459e0cf6fce0a70d517aa26a555b1e55430585212f9df00e8c6", + recoveryId: 1, + }, + { + d: "6284ca81b546f19b2c9a2d8f7a75da282688086c0794f3294911417660381dae", + m: "0d98efd7fd6ed9151876a01918d83618fefb775ab4eae1502329c51d42386316", + signature: + "cd96cec81405bb7c10a1f185574573c11dc831b5ca60973a8f5c1f9a226856870d01121b82d3adbbf9e16e786e38e3d89d2f8f50c76366b39276747a4cad1468", + recoveryId: 1, + }, + { + d: "81a77d6e7122dd4a4758664c8432ecfe92fd3c4be5c55ffca9c3ba35cb5e14a1", + m: "a042bae04371bd6a417a17e380bc290572f75764768f4c707dcb74f7af16f655", + signature: + "7e957a1e77f6248947ed174dae4fc81942febcbf748b9824835db6e98905ddfe6a52030a312c350f09a28920edf817f15c928eec8c1aa0b788e3c9a9f1e4570b", + recoveryId: 1, + }, + { + d: "7198c97e9e4f3d0b4a59151d54dbf63b2c1c03953710da6f49f3b4d658fdf514", + m: "9c317f2c066a90162a196dc042105d7c60821e8953ec8039efb4065a9f3fc911", + signature: + "2aa4356229a39c9a928e7e736308937d40772640bacb317b874a9edb41ef3a80305347110dd97c1761a268e67cb8af5e88995676c09d3802e57a9adba5cc90d2", + recoveryId: 1, + }, + { + d: "c1d8f4803d9e2930f4daa9543a3a8138627d819b6ccb4ebaa27e8ccc9c9b4565", + m: "52286f339933fba07be6ae318a5cb1520ca1d988eb99700ac69b1a676e772bb9", + signature: + "69257e38512d9c2c0e06524bdbbb345affed272fe3c1b986f02ed4f13c4ef93709571e8929e06b66df5bce854b4931279183828560e1cd2496ca1a4263f6ded1", + recoveryId: 1, + }, + { + d: "a792c11d53e3e3059f49e95f935041c8b8d11fd27f2c38a4e6794d001d877d06", + m: "6b7f467c61a72e326ef2a9295f2c2688b76bf9acf00f537491b77dc5c7565fab", + signature: + "3b45c8694d1ab5dbb2c04b7794de99e81bee219479f590893ae02843cdb5d13250ba9f38f71fc5ddd9959fdd2e9ddff302e098ccef5047621dbf33e57384da13", + recoveryId: 1, + }, + { + d: "0f284886f1da8f6b0843458668d78a91210cde7f2c96e7415ae680b71086933e", + m: "05454ae50ecc409a46055ebd812c09bc9e5b1da6470eb8dc390e5744709cfc71", + signature: + "71b48ee695d82776e7448692336395640bcf678e9c70d55187349cac6046525923ce5c49de8401a9f1bfa1112773cbb8f9a797d9fe8d20c3cf282a771d7c9622", + recoveryId: 1, + }, + { + d: "dc8246c4bfb18c234caa3c438e88bf97008ab2998683d464c3652dd47065cf09", + m: "99915fca077aa5746698c719c639af382cfb42ead2318d2833052e1c4460962f", + signature: + "5b295ca07db65c317b50ab65891b0f394e2e758b5be39b8814b2c6b8709e9a637806820f7a60964c56ac877ee64984f65747bb921737c0d2f68d1cf331880641", + recoveryId: 1, + }, + { + d: "af3963cf41fcf0e4e614855acd8ea1952434f6642a097e4a703cfbda5e7551e2", + m: "b02b6581f1027ead3631a8460a862212e72dc543d2ed569e28885bf0d3762694", + signature: + "ec43363a0c246138778c0519127bcfa489b8f2b29b90768bf9fab9b390d029046a254fb15ebb10f0a3dae0ea3823d8e4ee13619ec275b2258bf2d6cc178a8dff", + recoveryId: 1, + }, + { + d: "30763910a4d82b1e72c2bd1b85421385da731774f0d22308582b08c9888bef7c", + m: "a5645612238e72f26ca9c953764165f9819ffd35e59638388304ac44080ec5ed", + signature: + "a7b6f3a9b258f510bd94ccb00bc623fe19d54f5f6e37b9df785c6a11680f357a465dd8543bf6e137f940cf5f2ceb6c0d9d0b1fd01e4accd0dc5e8846a11f9a70", + recoveryId: 1, + }, + { + d: "354d08b3566e951f44e18d0b235ba9c1ca2c7887d7506e3308f7e6fa0db8de69", + m: "90f7feb89af57506a091d603d22e19c01bbc07b52b1e0a3903a9444761fd2928", + signature: + "3f5a6d1bb9dca3c190541babf14b150e2ba48192753228d14f2f9d1b97dd184b1c9cad7bdf433c71d1c73fdd7620c0d6a2856fd9b169898ef51b9d31189afdd0", + recoveryId: 1, + }, + { + d: "cb1f38021c611465a44874f5d7712100f3e569a7fd2de097d2d424a0c382ad48", + m: "b59985a36f40299ddd3d0f143989fae030198772319634819704ce5d6fec2598", + signature: + "86b3ed414bbf67e071af1bfe5e8ce29328c6a4c8cabf80de4e34c4cf922739e014f4ffe10743cb7b8536047b702c0286cba4ded992618deba45934cebe5f2d02", + recoveryId: 0, + }, + { + d: "817f9c148531138e047f7a581c2723b1ace1ca3b67be95c9f9eed62a9208d89f", + m: "995856c54f6849d5428c3e7e085545ab0ea5ee0d8069ba34316d8811bfceab9b", + signature: + "fee235c5aeea0ecd9a7cabeaf0f013284b77b87054250df6656721e8e259a4895e9e7afb80e79495f640e8d3693e383e605d398096dabb4f84574d95939cabc8", + recoveryId: 1, + }, + { + d: "9b4871ed42908d2139e872b86e1856b7b37b45a3d589dc1fc84bf160dfe7d2e8", + m: "ec2622d50d80a7b0cbbfe9a58e3f23106f8f55444eb1c7b1f7b6567accfb4f0d", + signature: + "d6b78ee868b23d9eef6a151af0332db4b30e1ca2e348d3f2439c324cd41511643689fb7f41de5a844f9b437c7bfda396d5fb5936317304bf298deed5574dd84f", + recoveryId: 1, + }, + { + d: "d69d0a2f7ddd03f842134fa20ccb4c2d21952b7f8b6ef93ba51899d6594dc9b4", + m: "6caaf6fd59a6138303970b64360ab67f8ed76a3d33d3397de18f64a7fd57c8e3", + signature: + "bf9eff56c1c4483f1d1a21bbe7e74e86fced5516aef2e41de7f246028769f4694079eba240d675992c6c2f77e265e890ed3d5893f4cf919ad168399e0897b299", + recoveryId: 1, + }, + { + d: "96eda144a17ccdb28329ee0da5125f49ac6e422c7ac901e7bb562d8576896e56", + m: "f1e8e14f0c49c82229dcea1034e9687e22d9e7b8a7c714d383389be1c45e1103", + signature: + "26211d605f54012d43a31012f1d17d048512d8ac28f995fcf7ebdc6d84e8b4cb4ade45f11100b091741c6c4f57db98b83185ba1f16912b8188a93cf893cf16f7", + recoveryId: 0, + }, + { + d: "eec5542c10d161f9ecd58c50d1ac0ec851592798e8427e55826a796ad941abc6", + m: "bdde96521d79669d08c3c027c56d18c34d2abdc1792b47ee4dc81881a7fac9db", + signature: + "3b9e182a3732f8d1a644820e8d2c13c7f07d4074f0c6229dc34a1c0a00d93d520af64f614d949f5a62bf7fad2e440500552e16c15b203600261227182d31e37b", + recoveryId: 0, + }, + { + d: "dee93f61f1d04d8c05de3fb79f8ff1fe1a60295f27ab4ce392996749005a228e", + m: "75482f7f9688c1edf01ce0ad6dba72867b737f0a3cc22176159db0058c1eaa79", + signature: + "69b594bcd33a891380e305e09386d0a83624337f7ea4adf91f2c36c49da215276d0065d03fcdf0fbb7bf4fdb00fed2c6a70c1aa7a19e7fdfe0dd7efba4fa5736", + recoveryId: 0, + }, + { + d: "d4dd91c6f751a8ead0cf4ab4a51152d1d6daa68df8e462ba00375f387d4aa3e2", + m: "ddcde5f1791874ed1464c4d5ba5b2403c8b2699d06b13c6e5eded5b2b15cc134", + signature: + "274403e6f35fd010eab0b03ef5d6f0bdd90b76776a2b56a03aa9bb3a49e1381718181d73584e97a9cefb4f6fc411af2c62e75713797b5e6b003379ccd65d15cb", + recoveryId: 1, + }, + { + d: "bec8e6529f1d9a559cce2ee7da4eeed524ed6c05b833ceb4c120910dd459f0f3", + m: "cf4ca6bde4c9054bcd96846b916a4ccc305b7ce880128ea100975addc1ccf07a", + signature: + "fbc0a1c28ea076eb8abcfde560cc1679dbf49f61e9cdfbc5b5be2cbf8e0eeae166591d66bad30fc6b82fce5341cb07a1affbda78d353d2eed546d6db3c8f7e4a", + recoveryId: 0, + }, + { + d: "15b00d15b12ece0b2cd409c5c617b3dd8545f5c8557f85981e504b74ca0e3225", + m: "b608d8b602160eb32ff15e4400ef15e62c93af2ff498c3076a6b8efc9bf76e5e", + signature: + "3bc312065cc15334f32d91f177ffa036debfe766796f31b19fac71082d6c33187578c07fc8be58232bcb5f3b7e9bab8d2de016de6f10d02c492bf26a6a7d9e5b", + recoveryId: 1, + }, + { + d: "aa5fbcf1bf474a668a51aa4c6590f0eb4081fb6cc490d50de57c74b5da0cf73e", + m: "6e7fbe937627df60b7fb7c9cd6c4f5090150ea24450901b2f741965dd2d35ab2", + signature: + "e719b6e9fd65a657ba4f19a87ee65da6b6a171351e92e255070fe714339fe2940a49f39a8ad68271ba9bead21679160714da3e3f1939f4f102e1fd29e5cf5a73", + recoveryId: 1, + }, + { + d: "aa6ae742db7fe34761e95ecca87265492c7976bcae4d01ea9fb0781c76e3d481", + m: "3757bdd7b91ab7d88d1db262c6c22b31fd62a632d643e2e82e476adbe9f95e0e", + signature: + "028f4e28d6d328e8167958bd53a085a8577466ca02725718f0ac9dfcad9c14837acc914675923700c44ebf53f51b6676455c97fe6838e92a893c6762b931a7c6", + recoveryId: 1, + }, + { + d: "c37154cffc08e177c39c208ca3e4541d42fdfae46d241f52383fb14eeb350a28", + m: "836a6ba7ba8abb263f247f02fd9e3078cd880254150759f5630b99b33cc519af", + signature: + "19b03dcdedde83c3656d699e06b81b785648740d053649eb0fa5becde77a84743973747c235320807614de8254b233175aea2ece80ece243f4280a1e97a02c52", + recoveryId: 0, + }, + { + d: "332499547cbaa55471a3c3268eb7e018823b97ea903951c2da79e222b89a2b89", + m: "5627d5f61cb03c6af05f35f1e7af6b81a82383a100ed4930e240186523009360", + signature: + "66e94f868c406701fe5f4157869d5acbef1909c27e34b7f78294ed220fa997685bb9f281edd8a9d7bf36c7819b06a72e6cab5ac14ddf080ffea0fd2db03b5edf", + recoveryId: 1, + }, + { + d: "38850ff86dcef8010b2276cb074f465e036342a9af5293d562512a4517edee91", + m: "b4bdde9f65c5a1c0214a63c49f9aa6a78d26c7b8a0025d283e4eb1aed1a477d4", + signature: + "1b4d08d74075a25423a47727a2b20f4bb376911c5e6acabda98b8b0201dd8dd67e0e85c04aba3cac9b50b2fca6334df45006bc2b37a3ddd118b2c27395a7b1be", + recoveryId: 1, + }, + { + d: "eebe40507bb2d7783629744487edc86425f987adb1127e1200dff7a4e73f3b9d", + m: "e45e30a176b5250ff400f6291dfaa11879cb666afc0115cf536b8ab4fc6d8096", + signature: + "568c211d1f17520ab66b5e4fbbde992531ca523cb1d511ae1b83a055111dde334cc344277691975e8728f7e2ebc5bff210cce4ad7ab7c3ab88fbbdafd2c911c7", + recoveryId: 0, + }, + { + d: "1f365e31fa91da35f7cae4808568cd5838bfcbc3a46649e2257086de142174c9", + m: "ab4e88eaeb13b2db4506501cecda624a836377a462a770f69e0b68fc88835360", + signature: + "899d33acf2c5a3fcd632792f906d69859e4f16a6406c7067e29ceb5472c4358918b1b5bd4df7c6b96a03b0c61296eebb23b7f25d399e5d9af4fb529e7bf02462", + recoveryId: 1, + }, + { + d: "9b15d726fe1a229ef67b7190ea3dc4326e1064cf41a49a82f562f68dec0fafd7", + m: "bf6c174f83e1a93f39b480f9f6378aa0131d1ddba70087e32186541c0117cce2", + signature: + "f3fb85b885a0500a9503d3fe30167535d6908b332bc83acaf658f46000661057577f63863f263cac03327a856fbd5a4805362c9b6ae677c307bd70f452a212e5", + recoveryId: 0, + }, + { + d: "58943590c2ccc4c1aec5d37a6cbfcd849e1ed3c0e626746ac156640f23759b54", + m: "a5aeb8a22ff496a4ac6da36ed3aed57c95c465b8bd22a7e4d60c35cca0e05a4e", + signature: + "e91b8c87208185c218b33fb1d439a90cc887fdae1a50ba96ac92413c1d718b9c3c9bdc3058be8e54a51475d45611e43564acc56163ab375544f4d1e552a36601", + recoveryId: 0, + }, + { + d: "100f209590bd47e5ad912f18e0c432eec3a852d1c70df2c4a27f9e270ed94481", + m: "6bb9c31963c53760ae02c83424764700b928e2e1c349975fe228b40aa9ac24cb", + signature: + "30ced3d8ec2a140dd8759ac81cf835af71102a7aacfdaaaf26126195a831b7c41014a1e3b4822419a5f5487b2b2e33fbe199e972eedc2812875d084f36d8d05e", + recoveryId: 0, + }, + { + d: "310a530822d15f90f9893f9ccd5fbba9f275aeec90e296e89dca4128b47ec8d0", + m: "86bd5d88ccaebe254758989ea258f0f0bcda7b6ad8d067c4ac1d4473c14244ef", + signature: + "c66f7e1423714764029a0a0ca91e001a20aa9c64743dde120f2b714a1adac7392fb945eecb55d6cfe5f698e526d8ddae73d09eaa5f09abfa451a5aa693469252", + recoveryId: 1, + }, + { + d: "786c12a5d0512b9e1451443c54a2225c1dbeaf898170e6474e6584930cbf17d9", + m: "de6b3edaaa585310ed117c12563942ae9feb13ad7dc3e73a75bbd864bfac61cd", + signature: + "c88aec10c942ba1fab7c0d891d99c246573a6707fec99451d1f0b292073fb88a7dea9978190cd33e36b0821bf8a4c1d24fdc7eb5bf1f5aaa7a33b8bfddd63cf4", + recoveryId: 1, + }, + { + d: "c996efd346f34e0174bad23bc9b01c0172f0dda7a27644ea6668546ebdc243c2", + m: "9d651df2d4347ef2e1812ebd79ce09428ebf50233c745d097f5da2e3119b792e", + signature: + "146afad36b755383be243adc0aa0d7853101561a5dd950f60a6e36e89505566b297f1abb682ff190a80b6c96fff0925834ced321e26c36d6819fd282b971a0b6", + recoveryId: 0, + }, + { + d: "3c136d57105315713d22f4446d253db59c3b72a904230596805389fced347c77", + m: "1c273700714c1c4efc9ff3831ff5f12e3c7b4a708bccc3221139c88acdefc1de", + signature: + "460c2cad6ab124e5a18e80600fe0ee60fcb4165e8a290e50108a4f946e17d04b7d8b67abbb173f1528db08ee978b0a4221fab5683d4e7e7fa1f52b9fa80f808a", + recoveryId: 1, + }, + { + d: "593c621559beca76fca28c83af9ebb3a4f6d4a49a00eacdbc41427308b2a901c", + m: "deb983ae5e31bb9b58c8a73409cb543d3264ca2d03b3012a417267e25bd88aea", + signature: + "16197460a8466628b2159fa590e40ea392c5c85c61567da62605cd8488cf333c64e45fd09a0d686712b8ce54ab7e82f8e737887789fb48ead60cf1fa7936a274", + recoveryId: 0, + }, + { + d: "5b875abce72e2d033c07d7eb7ad97fac1af0a0f879b80660774dad7dc929cb48", + m: "42b0fb3388a2e7fd9715d655aa0c2d55e7aff309b2ad5863b737c3f3a22e22a8", + signature: + "d50f12db407a85be13104d9a6d060d4563b7b86b60e3e78d0a1592deeee1ca196fe5714865ea3cf8b89e22e78e29acc30ca865cdb846cf648b30aa8f0d113afb", + recoveryId: 0, + }, + { + d: "796f04f4844657d477daee01a72ba40aefc7d72815394b6a129ea2b45b478bf0", + m: "e15f51a26b0670817691c910daa13b1e370303b49e452a35c4d86723fbe38550", + signature: + "36f15c99d15f69f73330eef62263dff7f0062085e300f6d446f07ced280a638d176ef78e9075746313069fd19bff7a728224e987b3652376350297368005319e", + recoveryId: 1, + }, + { + d: "5db0ef5def67aa4c10678504eb7c9a78988aadb48d184301ce1cbac220be3a45", + m: "c3957c374a0dfc4a6752dbd427941054e61f6a957652337318a1a9db3b0d3b87", + signature: + "db1915445adbe39119d935d22efc1f15cd9ff9cc2c735434bfd3b59e8bdd95f54d41afd6fd1b38f16ad07ec9c9f139e7f427a7b698d1b6ecc0083b202fb1ad18", + recoveryId: 1, + }, + { + d: "07d7dd14b07ca671b5766c16ca149bb08a371dcb11bde5d295f306058f27a60d", + m: "75bc8b97c67423d7fe0cbea07f050970ddca70ddee4c552240ae7329021a125b", + signature: + "ecf011190769cd33519f3fdd2ff4c04da7eca7dcb2861480049fcc362cb5e98f386eb6d411c21f1f2dbce16fb253a572f88ac1e45c87c16964862513dec3f352", + recoveryId: 1, + }, + { + d: "4e9eb6b4bcc8e89a854034eb86c329563956ec51d04062658f0d049a573267fd", + m: "424651edae8f20adc29bcce86b08f539ec349044b193b5ea5577268d23838225", + signature: + "5f9949c1a8999ffd1278c2b53660d89597a255e4a38bb4e1621fa56e3cfe285c10a16a88c7a865644f5e72d105e7e3eb2cad6e36e5f0c2858b89c51e7460f6da", + recoveryId: 0, + }, + { + d: "5c769967777a9fc36378cf62bcd02fd443e632489725b210649b369d8ef87f4f", + m: "255a902e709127443bdb30b1db41d69ac2082c99fcf92c1d8cfd81e166314d78", + signature: + "057bb686c8b15c9a724f192c4d2ae2f1d66262f39bd03b925f4b41f651cf673d43218e83c288c8e6923ac5c0b14c7dba71dbdaa8c72a2b95d1f93a6fb0ba27f1", + recoveryId: 0, + }, + { + d: "d0e26ffc2c319339deb06c1b5b0347e36c2f53e834dfd93b900d3f1c5241a0a0", + m: "6e0a01238683ea9d230ee8f0cd4128382a11e75ecb3baf5508378ed139d89feb", + signature: + "19c3d00ed3df3679ddd072f777be087447522c8c395ef0e6b25dc056eb0279f2508bfd394def42719b87f2d3e5e96169e5fbe06d87714074aac2aefe24190304", + recoveryId: 1, + }, + { + d: "7c593053606807aeb6021ee9ce834ff15232f84a98e224b8ec45a6ca7e94b89e", + m: "3d81e09950d41d9d9bd0d6720916ec99dd484907b113342a4f00a07eba5c953d", + signature: + "556b8968ca9c6434ae98620488c36c1dbf5449f648afa836a9b0f44a5f2b00815480242c949829b8965619e8963545d852364e6ce93ca6f26c908d3e9a4078a9", + recoveryId: 1, + }, + { + d: "89ea86d0f22d75819345cdae9cf157af924e5cdd5a5df5a4b98b366055c02e4e", + m: "237ab36f99790feaca7cb7d97c485a27cfdc2f3e475e8dd12e74a110603b69ae", + signature: + "10cba926f17d3cd72811ae60339f8592f04f0f68a8ffaea108b5b427d81f612a50abcd4d14c9c534d25508ffa785f3645d95998caa1dc1e780dca83e48f1372c", + recoveryId: 1, + }, + { + d: "b64825cdd7316f5781ba34fea4c10cb0b2e6f6e76c0dbcfd83c643732431250e", + m: "74010ef96fe53766ad5903edb2ea44920b29e5f208b28e28a928147815fe5ecf", + signature: + "93ebff3a7ac9a3b4a902614e9f8065df58cbb45403b4b08167e87211ed05bc60151befb749cf2a2f42b62b40f50f87d4af3eb270dc5914405c8073693ec45f36", + recoveryId: 0, + }, + { + d: "c56d5be9ad34ad46a7e0e00125c8b0dd12913f1fa3cd6a4f1801e99dc4cacded", + m: "1878dfad75f780e3c396ec96f5da88eb9c222f1ed0ca940f07df64eb5a09be72", + signature: + "88401decbc1d611dd252c91494513011e502b63bbe6b65c6ccb8bc18f4596b7672e7b66951c4fd08978329b88c7b4729a854acfdd6f0dde31607d2e885839a3c", + recoveryId: 0, + }, + { + d: "aaa781e053c1d08dc29decd812d5a92464d4e9773874061349880f1b8b99ea36", + m: "8219236a9e2c5a29b3edc7af649494cfc7b89784be9293b2116587765342980f", + signature: + "42d816ce04173ccb3739949e12cf5a545a53e86fa4b232ad44ab7ba618dce3bf020b65eb78d6f333a8edc89a8dcc204f9baa8dac2ba17e4fcfc3c7b8b15fd128", + recoveryId: 0, + }, + { + d: "c3a749754ab020372574138f9266d1b29639c39eb069d3aa1bd0728b3b04ad38", + m: "a7001bd4917b36d7e43efeb8aad972229d6aab58013b457fb63066d516753bf2", + signature: + "f53538eb39cb7544e415ac01434ceaabaf6ecd35d3495f1dbf6933099b9e6d1f39b03571a4a631ca7a97fbea45bbc24aa45138080908ed55a6c06c03857c0448", + recoveryId: 0, + }, + { + d: "34f3f6e1aa4de0840bdc513b4d5d8173a825d196e63adbc998c8ee6819014564", + m: "a3d2337d282ae62c33c22330447536dd1ed875b2cd16fc52864a888862c0e202", + signature: + "e87b3ed670cf2419c6ea4add94dbb51a9cf183e7604a4f8728e1ad24820347bd24bf115578227bdf7b0a839fe49f7c4b6fcdf01faf525bf1c9d7c36a4c06d0ac", + recoveryId: 0, + }, + { + d: "001159050437af252f391000a77a5f4596c1a4e41cc3598b74d6afb430aa9534", + m: "052397e45fae824d95a0a829b63467c8acfeaf64599a739317f3b0d338a00525", + signature: + "adf3d81c9359fbdfe684d69795810253fd645d1bbf05734d43069458289a75a12c47a15f77fe5dd6da99f618d25ba8ac538c827e1a139ea6c1ae617313258c52", + recoveryId: 1, + }, + { + d: "12a484e07358e166e01ce1633753208f1b3ce44d30137f74526cae95ca0da052", + m: "4327471f7d5b110d1d63bd5d6516d003dc064d3b974109babf285f2b95f05f8e", + signature: + "5775e74dededdd645174eb679e3b801c89430b19dde6fdb7152234f6c3b550d05350db22289a7d9460c397ed325e497f1e2630dd1bcc68e674aa28507dc80e6e", + recoveryId: 0, + }, + { + d: "ef7e8093d6ecae32d8924a1236db5f99a2317efc4b296a267737dd329763e401", + m: "f8019215f6f109f1ae69eaf3e0545893f7b8c08e61244f5e9d7842b85ff6209d", + signature: + "f1f102fde608accc5506c51879a93c63beea3f8b7e6cbdb9c9a6852274fb7ee9539162d8d9c2274fdb7c40d849e6a89572bb6db7fc05ee79cd840765be3d4b58", + recoveryId: 1, + }, + { + d: "eae1a189f18caab36e9fd73b218d69e0c49be3a22e636c9458eaef438b21e7d2", + m: "e7e100a17773d40fee987a7327ea9ae05bec6efc825a663644d2125f60c646aa", + signature: + "382587559afe35df3fa02da3c18d9836e34495d550b1d429eb68816fd7b529a664d518a302156246b14b841bcd07acea4c2ab35e3d4123254eeb92fd2fb61f0c", + recoveryId: 1, + }, + { + d: "02fb1889cb59844c2c2c8539338f79a5adbd976d865584c3ecb8b838371f116c", + m: "08c83ab2041acfbcae9d5dc249710ff0de91f188e848450bf8fb46404fece3ca", + signature: + "9767f13a8dc98f84d755d0a2e9f6f0647b18140c8160377c7b3f68d478f690916008829add5e58c9fe3d243ff28d1c58221939a940a3227fd16a0e0a485d06f4", + recoveryId: 1, + }, + { + d: "00e7a0ef1e97113e79695b758b457dddbd1d0d91f792a583941840b042b38e8c", + m: "b7ce69213d2aca061036d778ce6e61c4f54f2b56d2460664e13db2cde170fd67", + signature: + "61a2168273b3cdaa92a2221d1a34f60406364d886c8cd0fb5926137a475cc6e81b0fbf957c971ada8eacf945b0f7c25dd26f98b6045eb0fffc8c738cb965f672", + recoveryId: 0, + }, + { + d: "ee66e73d6728f25453b786f72ec024154bc6b49156cfbc3804e7c5822e35b30d", + m: "a7b29ec402e6f00b08b1f4f3275a6fb9456feb787cd4c563b3fa40c1845b46bb", + signature: + "1b3b81309746c84a054f9f09dae4dd0cf1554dee3cb3827cba834fca5a5a67412bb91cd3b68d03b3007e56b0161742e1e5abb14b71a76255cf6bf66835e6a594", + recoveryId: 0, + }, + { + d: "d3560da7fe9ced77c89f9b46dfae5117f469d831c8c1a849c63c669c10e99697", + m: "f95ca4154204ab772079a81230cea6316cce6acb78d38a67282832ed64d0c6e5", + signature: + "8ea80317eb0b89fadae416b930319a3b0bf8e06b2cd1e75fb8c0a2ec15cc4b841351318c05c0268244b0d738bfa79c4c9c55fe64b122c2c0756e3e3545064971", + recoveryId: 1, + }, + { + d: "78420dd6d44766335af5a9d98982fe77a0484cd75ee845ab94b1bdb88d76f155", + m: "05b42093cc9c24578a0314e61e01077939df7514a76ec301115ec7cf28d02ae5", + signature: + "da069be38cd293e32f5a2bcbde7bdeabf3bafdd75ff074981272ccf8bbc02a237cd40f570cff08b17d51bbbd23e116ad33d07e762e4aa924ed70ba4cbf1a2dbc", + recoveryId: 0, + }, + { + d: "f4ce93400c82ddaff70f7cf274963eaa787d0356d2a266d498808533303303e7", + m: "8bc6fb9cd582f4a6da046d88b0083b8dcc4107ba050c9c378b55bac35bc1b373", + signature: + "5b36bb7c8221f958431030d0a353ee6db54233a9f484bb13f5d19700de897a9d362d6df426853180bf88cc059177d039fa014a7b095f4d14b0df0eb07ad56d95", + recoveryId: 0, + }, + { + d: "c46269cfa48b4571f126d4d789b781d87590cb07f3969cded1576a5550c14469", + m: "be39b304f4525e3d9d6ff100e90c5f665c7c81c88cddab2b0c2cf175bc9ae0de", + signature: + "fdc7256cf668c4bfcafa98725de0197fb4df8479bc278e68bc50f8fba0d35e5a0867744ef6f9f8252062d167364b0787b13423867bff70d15a6baf60fa5cc493", + recoveryId: 0, + }, + { + d: "a47dbb0e629b49632c620d55a8e721d061bc1ddb5d80d9d5e2fc65e2cd746c7e", + m: "cae324cb40710d61b7d222eb8eafc784add1cfaafc4d1f0b18b4f9ab673c2e27", + signature: + "1e3233c3895140449034f225449f3190e1c859efa6f78f208da1c6e36c549b1234fd7203a7e2fc3ed65a3708a771c45ca3ca841e6e59811900c185de6dc3fddb", + recoveryId: 0, + }, + { + d: "7e310d70e0f4a67c58ca327fd6ab92d17a6202ef0a86e130cab2f64eae15f40c", + m: "437ab0f402b8df13c712cd1b5d5e6685f31183d0322e1596891cd528c8220a97", + signature: + "235fb2143d8178622fdee55fdeca990dd596da12b62700fa2c8d2700ffd9130b1c77c2d5e5206681c84353a53e67ad449d8a09f291f5631d7bd61ec5cd526413", + recoveryId: 1, + }, + { + d: "f82a04a809dd9afc2d7120a258df94ec4bc164666552188aab851f67bef09421", + m: "04c4eead176c62b0a4303572dcf9a6526fbeef9a9225eff6f29d0e30f1f26c55", + signature: + "4b55254c1b18548e080cf522b572255e251bb3f02c351c087b2142748eae8c58506e367607b02742b20386302a1d915e6819d4bf5f8226c835558c33a434fb72", + recoveryId: 1, + }, + { + d: "42ee99463d57b68e05a2e2e4cacbb8e1ed8f5fa36fba205c5f1a870eaf04b058", + m: "f276262abd266a480d4a6ee4f6f7e32b38538384fe704da0bbf5a860dabb47e9", + signature: + "9f1ad86012b195923d42e01db3e969596b75d7c21771d4b881db3cc7f0726f9b0d724da80f74fb7ae537e1769185165b8b153f580324dcd03087719042d101fa", + recoveryId: 0, + }, + { + d: "906b4a121527c6ac74a7b8ed42f921a791f4af718ef90388552f258de903ba72", + m: "997935f77b2e64583bbb133178d3ecfa6ed014c81a96f9b5ed7a1af212d65c14", + signature: + "dbf17d78f314178831799e076967a09bd82f574c1f7c96efe1cf7628ba2a3a416d5dd944ce120b826652fa3dfedaa10f8de005d7c8ed2b0eb1f9c1b915fefa0e", + recoveryId: 1, + }, + { + d: "9b95d57c577329ae0dee792b2e0391e9dab76488aea127c55f1c17c6d4c52d80", + m: "cf4224c55abc5d1dc793854883298a84fbaf7de518baf184270b1817e3b064ef", + signature: + "afa310c7fde365573c93c7a8dfd6f1f78ece13abed9d5f493db71c9d9765644f310ae9867cf4276d13a4bed7de73291500b5a181558a5eeb27f87e0caeeb723e", + recoveryId: 1, + }, + { + d: "200d878773448d566e4d47f57abdeb1f234cc8d00f64ec7d96573070aa902bda", + m: "793bb8ae70efa9a8db3bbddea365eb0864671c695e7456a939f5f9500c13c05d", + signature: + "c5c1f49a42cbc8a1029647b2e4ad7ca90fce413d00c68823f9d0f377eef1dcc850938f322fe53781491d643a58fe61457f181e15d87a1eeacb1229f248d9595d", + recoveryId: 0, + }, + { + d: "a2a69cd6e57673956b7f77d0e34fe0a329db208e2f49e2d39d87f3748e01ef6e", + m: "38004d8c0a47bf85d038ad4447aadf251943a35856e5a8b9e5881e199be7b655", + signature: + "517cb91bfc706e32c14e29dc2c4956458508807e4a2f9a05b115173fefccb8d35c06668f8a1f851bfbe97b862cad7ca7868bc37ba29023b3e54541cbed9fcf54", + recoveryId: 0, + }, + { + d: "40a682fdbaf29cb90ab92098041e092408cb7af29999a8bf58b95fca03bc7161", + m: "6e482673c2991bf903e4c797c3f4bf16d9446fcc76a3de2ca35e0d2d8b2c5cfc", + signature: + "1e7f2a1ec5fd0a4205c16d10f27a9a26d4a8bf7f205e4c2141aba2eacea6c2963b3a60661e6fedabe7e8dfd007a92487adde925083c19a3225ec74892c927d4e", + recoveryId: 1, + }, + { + d: "0ade39a6f9b723a34b99e91b60e127bf81a195cb18c8011de4dd03ac37ded211", + m: "e87c75b81bddf6c942d31cbe591314e20ef6b3d84fc8f3cd9dace767dca37676", + signature: + "af07cf2f842c5439296769d6451a63f8337e817695cb1debef6942c30241eebe2d1c02cae859c6ef2dcad0bcf25186b5c5d3b0ec276454cbc5f2f5abc4f1b89b", + recoveryId: 1, + }, + { + d: "2c7095364991cb32095b4d9b2af71b48be4ce621ce5aaf23902747a1da15b858", + m: "58738308ae1ac2c852be0f88c6b62349ea2c7e73cfead0ca6aa3f701622e3796", + signature: + "ef0ed564523e70a21cd70cfe5306b08831c75c582f11ec4801403448b51d32e35f10d3593efe995542c378542bf284f74b44a6cacd7dae2757cd9e5d769835ef", + recoveryId: 1, + }, + { + d: "870e17bed2dfa07d7796fc08f5e0d33c737f59debdee7aa11ff08973a537d49d", + m: "2deb49fe0e9a6e579391d7449cfd4186540da430922e45f35af08ffd8115dec1", + signature: + "9f7ba3fc97e2a40cca98c31082bcbf6abb773bc8e7f2fb1bf188eac9d443d48903126de62ee47786aba7dffc9b20acab5c91497330f0e4aba3f17f54419c49fb", + recoveryId: 0, + }, + { + d: "87264362629128e7774ac75b482e5582f0dd958d204d2d9b151e877ebde6d60c", + m: "34e47a7e6cf816bac9f962078ca6ca2bcc21f37af9aa637a4d74046a41bdde41", + signature: + "2fc45bc67219beb7afdbdfdfa0a12776d892cd1c557687506f435ccade318cc05e571b6dbb6bf630e1c058214322855a2d92a373134d631033bce7681b7d166b", + recoveryId: 0, + }, + { + d: "14c19ba8a034ab1137cdcc21184af5a426bbc92391dce698d6fa4b09a5b4ca4c", + m: "3cc102cb477b4f5802d98cb95a0a87295c33ced55d036bb3b2cf046e68fb502e", + signature: + "00ca910b689ffb58af7034e768a63a660a90c55a381aa0dbdd0f68d959deb9f26a62224dff0ef65f1f22ec2e559297b40c695fa60015cc54d467510ee075699a", + recoveryId: 1, + }, + { + d: "308ce4df91a565ca7bf69d0e93a0ca7240f135d4a6b754770e0664316f023a11", + m: "ba9eebb75a6484a4a8338ec3372497bcc68fdcb1c990d94f7f45794e02cd5da7", + signature: + "ceec22319113b7ebe58f76c38ed1c4a656b1321ad8f34c1062aee9a882adef92499cafa95182020b55a6558c0b77602ba8ccf7fdbe4d9f74dff1040042a6a4e6", + recoveryId: 1, + }, + { + d: "51a97234604dab62c851ebd965daabe21bfd47adc47904555d9015a7de66770e", + m: "d8becf201b3446932f33f8744a78887592990dc35d231d84bc90e0c0c0c3d088", + signature: + "38e85aed6102371814de3653e8adc466204a8ed457391f1ce2cc9342c23aad8d6d6287939e22e608b89194613310dd9ed674f37904848b579340cca5da0e836d", + recoveryId: 1, + }, + { + d: "012cf34e7bed245dfc8d24e895b438c1147d2999ed0d81dd38fb3453c53e9e30", + m: "162e9ecc0008c9cd952d96f81bc400f694840124ef86a532bbe08cf90a66f28b", + signature: + "7c12127206e902273c0b2d168941458be0e4d68e62b8e685e8491387434d43696afadf28bb679f14d1929e079fce23f2d9f873ffec8a85c10340f77d354274de", + recoveryId: 1, + }, + { + d: "cefaaf2c89d606804797550f04ee9a92743f28ec205b609565eee48297e23e00", + m: "a130c452846906422fae04e9b234a10c98d6f1e09e56b048590222c2c3de2305", + signature: + "e11529d21b7a2bed1bf7f0cb9b45530a6b2367550145261817ed6c065e50b9d10d6f74c23e11f0e346054a3e240e4d45dbd8956e7793a6c7b1671c1e8b7c6a6c", + recoveryId: 1, + }, + { + d: "cbc8a60b36bb1a36133ed74a786e715b1bf152730e7259b58a946e54ca50faf3", + m: "975dc4e54c688dc6f2c99796ed608bb8998756ce6303e450090ab864216617dc", + signature: + "ebaabf0efab98d64807c446c7e428f05255a6aaad0e5337ad34c8eb727dc50ef4c8cb42f5afd6ed3bf3482c0fbe0461532dd3d5a873cb57f221adbce7ad4dd5a", + recoveryId: 1, + }, + { + d: "f1501674d297390454c5e5733d8bd5a1462a6a4acf6079ce50b841cbf85664a0", + m: "0e4e7967d8ba036189af7e5a01ca2eb438c1269fd0f3f651138c90cec1a9650e", + signature: + "596c5f3aa6cce00d6de5aaea9dafe2b1db3839979b470fe948ca0a4216db243b01154f8565d7152ab3633cb8e5774f9357e4cf530801da51048d484636e48271", + recoveryId: 1, + }, + { + d: "6bd589219c8f68d1153acea18018056b5ac7b8d1ab9aebb9cb461a0a4ef34ce3", + m: "9c7ccc5aea86e56160b770045c88532ada83b2e846d1fa8a175b3d863a2c4b18", + signature: + "9d3cb61aaa6f2a66fa2b5dae82fb72f2257659dc9d284bb3525c02145e768fd635024b58eb4d27667af22b4fc3fae1036310fc5324ff10762263451be9aaa44e", + recoveryId: 0, + }, + { + d: "987b77fc3c014e745ac973e8d0a582f83bb7c15bde8a2eed5cce6cb203dd968b", + m: "652d9a7bf161bb211852eb64ba93868ef0353bd90c163f71945857396276bee3", + signature: + "9e05438496f1d244b7a0ac7d22f3313d731214ffb11937f2faf0f38e6ac5d8b26559d21acd1b40c0aaa261e6d0968107dea602696670fa5a50ad813a036873c4", + recoveryId: 0, + }, + { + d: "e061131d08b18f02387ff69456cd64a3ed4ef649de6f0ac5c688720cbd412aa8", + m: "b0d944fd9c101bb1ea7d43329f5400c53e6764cde1baf1207b705a2e7837d427", + signature: + "dcbbe531ba9cd3c788abe6d24796191b5e6cc5052c5e4e9819a1d112f082804c270de50ba53d281621a39ef77dfa6dacfb305191526d655f538dc1304684594f", + recoveryId: 1, + }, + { + d: "c65512d6b5af59a42f1f5956053c7998cc095dbcd5c63b85ace93c25d4f4bbde", + m: "a6bfca03cceeb96c0f0bf15a57c87f2e167ac5726ae38b44deccb2130be47d68", + signature: + "c800d3ddc749e8f03b7fe0199e7895371e167e7f5ec9b971a9bb9b8c2daf11f926f8b485a3947a492eab3ac3eef1f0c0329ecfea6f8eb955fe0d1712e7932b46", + recoveryId: 1, + }, + { + d: "fafd9cfc3298df03d2dcbb217c4d6b6ef349c3538af4b009e07758b91852db1b", + m: "b3762c946a907b18e5d700cc0e9da7ef35b293fd979ee072c1e61dcafdb1a067", + signature: + "c4b8eb4f9731e6b916de4912f338b7947f8317b4bcbba99670d86b15ace44b7a54b82bdafe5dd206032337dbdfbb8495365944b37f260f33a455c6965e7d3cee", + recoveryId: 0, + }, + { + d: "e6064889151b571eb5e326a2c3ad6043695d3bbb707374f791c50668c760265e", + m: "ed232a46e95e379c2a004dc5e3110e6439ba26c6e96135a25997d7974fb10cdf", + signature: + "b243940719988fdfe3e1b607dea49ffa110b388421732c567d3b88c1c7b9e2b87b040fbc3b707d5ec66ada4870b683df82082229fe5c3278bd3efb79ecd0bdd0", + recoveryId: 0, + }, + { + d: "6e4d4ee5a8628bdfc4eb3719b8224f3275a9f159e6f751c5f059479c57612e99", + m: "762c3e09f191a62e370f317171b73ab5f8f89498f3fa93e101347118f32bb4dc", + signature: + "e9c5373039de9293037d6786bfcdbc9585104dea42119ca68cee748059e0f5680f911e179733fb1e9457b4bbde91695032116f6d50f650c741154b8d618ddffd", + recoveryId: 0, + }, + { + d: "f6847ee0029d16369c1dc7d5c2bbb59852cb164a5755e0f22a4474f0871433fa", + m: "2bacd0d624085f681cf328f4360765b94da1318332566a4b9067d04d07a2eef5", + signature: + "6a02b7dd33d157f19c83bbb73ee391fe10b402e203834795d192e895e5174d0400374b8a918d582d2880bff7816e2a932c97d45ae1a093c2f28ef9841678cfb0", + recoveryId: 0, + }, + { + d: "110659f860e72bd081c2917647a1c6e6cdd31882992de3469a70ad964725b945", + m: "b439b576eb59085ae7297383816595c492865fb8c78e20166fa02b05a870d973", + signature: + "fe2ef58fbdd6846790b09183b70fe1fb0082e717752a7d8b587652f93223c49632c3579c8c9df9196b43fb7ac55a470db018fcef18fd8548eb0182fd50608a30", + recoveryId: 0, + }, + { + d: "ac6c494277f636f62dfd369457bbf03490df6529da56271d52f7a212b87de0e3", + m: "480387d25a7e93ba1d2a38e8dbeb492bab83c73915c6e21df61a2579c0b4a4cd", + signature: + "bf267998eb527c535d97ccd81ccd6e1d43761340732ecd899adfeba4d988c4d67bc6c29294c1dfb432b60355eda943322ccd922676b713fc7806f54a65cb0295", + recoveryId: 0, + }, + { + d: "efd2ed48ac5370b0485d4773e8fc79c1d697d7869270e3e0b2279a16838615c7", + m: "f78009d3e54f28cca9a43c8fc97e5d982db27bb84f36e2eb67e9a20a971c0919", + signature: + "0b87369507b7e4a9ae8446ce633da1f05d2b38cf52d45545404378972e91a04a453230de494a797568fd27a8afc51653f8d6767b7add7b0a79a83993841f0a88", + recoveryId: 0, + }, + { + d: "b578f36109dba2b8b2bd473808901022148fe230e03fd4bb125de86ee770999b", + m: "6d0c27ea916ebdb004ad03c18a049dfa673a368676fae3a786f8f43b55c3392a", + signature: + "f2b93dead9086e95a09c7e73e558f60bc8254de7c2e9e5e03b3064ac12f4585b10c9097224848c2e6890409939054437c369b155035e8027ad699409fd4b68ab", + recoveryId: 1, + }, + { + d: "9be0416819e78a7c6107aa5d77b8e98438d669e97dbfbf3c80e9c89f9060805f", + m: "a59929e9eb1a46f63839f066d53ca4dd2ff55d484daabd5907a1c537078c82d3", + signature: + "7c191fb23722e23d48991a60a3236d633bea92629a15fb0586d321e7ae946ac04dff17beed55613cc79754d0bf3965bb7424818bd1b09c362d5adb72c23ba3f4", + recoveryId: 0, + }, + { + d: "bb1e7cf5dbf21768ba7ae5d73569b712c92b4c3e0c1cfef7edc8c374ca7451fd", + m: "adabb22d2b8abbcb5924a0acc8d68661573eec190225608c5ce7f25ecc4338d9", + signature: + "95099e83e7ffc35a92f2810a5475529b461d7bd9380f6f42cc0608969e6a363855c0b9ec536a8173c662c84b08e2c099d4eb933366e0b23453e072f007875b15", + recoveryId: 0, + }, + { + d: "877f99d6fd08a8c35948f48884648b5c27c50552c07048419ab41b5ef05f7477", + m: "ed8ea2bb49a3fad13aed9abddf2a5b6e4b34b44b0f15723d6f937876124e8cd2", + signature: + "2c2b497432739899513e978610405ab601fb9332ea7207b286f287fce8a80fa46c05ae94db35a229d430a0af0f08e17e0f0573874312231e081bf9650d50a89a", + recoveryId: 0, + }, + { + d: "c5c1ba597dea8bce6ec91a4da968d801a70bd8877e6d02cb4691bfc968318482", + m: "6ce645d2459d3c68c67648cf2d0ed6f3646f76afe352b6e5bfd62d6a4f59cbb9", + signature: + "1cf043aeae37aabb579bc17cdba0ba87da85e446b056e6c21fd6ffeb184464b94b63a631fb7715f7941c0b43ad0060f5909c94738734080c9869342bfa5e4601", + recoveryId: 1, + }, + { + d: "a2df0fb135bc00cf9b30c19312c1f5db7ac68bb72592c4267020e8c04f23a704", + m: "4544fd8890f9ef6388f3b2a38e24de1f9e477586b0d18f16474d68fcf1f6222b", + signature: + "78c4f8617217bbfcf4403720ca97e600bb1cdbc3806dac129fa346554249a18542a4d0badafc6cdc5ac815b906e712e961acafb14e072306beb3ae07a73b5780", + recoveryId: 0, + }, + { + d: "de297b8fb1a2b9ce85b90b69355698e0a6ac8df4211b7f06de372648a7507311", + m: "56f6bff468ac949ea229ab798d676b238610f24e3cb6dc093fa05a572dc45111", + signature: + "a371677b89a1fc6ec7685c88573a65d1e3d850953225f9ee6a09399ff48c888e6ec8bb14bf48b112d4b5f3f6ddc9a1fb2a71241225c275134c7e5d373798e782", + recoveryId: 1, + }, + { + d: "29cb8d4174a7392912ec9cd2c1965b117483b48f20feda831654454ca32aad2e", + m: "bd52878cc4807df5e0f4dd5a51df5bfcb929acdbb5ec7978f802fe8163cf6a26", + signature: + "5bfac947436c5c120186e5a0395be25df42eecefb7c19e09728796cd9e96dff037acc24125cdaadf889629d23448883ea9533944843517590a05b8b477a3d04c", + recoveryId: 0, + }, + { + d: "535adf190f50ccf9944747bc52fc869addcac4155a3c8ba16ff922a3aa3fc5e2", + m: "496717ba1e670cca28fc5340a56cc8b51e2350733b3de03bd10386e3aa8f08b1", + signature: + "4d998b4fcff05d02be8a6a4345a144f029bb1c489d81641c8413a5772ec950aa4df8efa50b542afed3db6ee7cdcd2a78bb4886e2d0fdee7d24f9976f5d226d3d", + recoveryId: 1, + }, + { + d: "8578004a69a4543b33a6791f20e14be55c7a72d6ec6c3e6015a636ee9ec1ba15", + m: "bbae67487a9ca5f7729b8160830ce8cc9c304f030c92d1967474b92c3a9ad782", + signature: + "73e321766126d1dcebe44491636210238738771570f999f34e230dce1cfc213516eef9916556708ec8f3715828456cda83c859f978907a6089bad783b8ddd73a", + recoveryId: 1, + }, + { + d: "b0bfeaab78a67186f6a381b00d86fa4775a9c230e0becc88c93650299b17ea71", + m: "14e1d28f83585441f155fa2e656dedde4ccbcbad9021fa9c1c6961312225307c", + signature: + "fed88b496d3e3ea7ef55816f6dbd15e61937b765e1ffeca4bee7c261ac178d587e80f9002f9a8a38fafafd8a2c166e7cad6c9a8841c124819be569262f7b6284", + recoveryId: 1, + }, + { + d: "3e27e7ec53cc81422d9bdd319736cba85a9f1a101f6eb1fc3f7555c3e6bad13b", + m: "4a36a52f2fbfb3614317c285e56c3357291300437be53a3006cf0159336a54fd", + signature: + "345a5c27f14a70a7f5a9d1e5eb6851580108d1c338bf33cec163f07a5458c63d40623cfee200366128428199f19cea925d936ceb18a3735b89b66e4628999d7b", + recoveryId: 1, + }, + { + d: "16592d4f618ad1d91b84400beae09aa9073cccc7581a2d31ee944539436c65cf", + m: "44df2288fb9b8b7da48967b0f3eff4e8095eefdb32d5651aafbdc078d2fe9118", + signature: + "1bf58e736b96ec72eb22d98bc59de0d22fa8b708d12551549de3371dc1f9c4082660094e4159a007d9982aea76bdfb6b9a851ffd8f8e20fd40a76feb0928f075", + recoveryId: 0, + }, + { + d: "a7b7439276f6fc6c4d17e216a973cf2b45864744c05b8f0d6c0477165d933b6e", + m: "67cf7e00cdcee30eabc55dea53a6837725d9eb6a68a7ba0359f4e7ce82951f20", + signature: + "679d75a4d489991d515b8a79ccbd4a53c01af87b4a4e0c52f02295e4700660293cdff051c082f5e6975040decf6703046f3159712d90edc1caacf8bae2423d09", + recoveryId: 0, + }, + { + d: "dccaed6413123a2a4b9fcff641894ece8efc5af9ee0d34cbd07e8988c361af26", + m: "293a8582c405f8f63cb6bfb8380700126b9470aea35fc9e0a75b8365a384a5ef", + signature: + "0dd734214c2fb7efddc0f5bfc0c43a6555e3980b3cb4635a8c4885bfbefb9aa4243dc8d322d179480b9544603d0f75ca52957208ecff187ddcf8e2731e454bb7", + recoveryId: 0, + }, + { + d: "beee806741fcfa57f8118d679499c66f1912a44d99564547a5c9279a40bbcfc4", + m: "7ce4e579ed864a658320c3aff05093fe1fd9743b11e14a1df0182689c8b3e778", + signature: + "28de2b80a744853886fb0df4447d34fddeaec78214827184969389538fcde67e4746deee525b114e4074f7a6f16d08854360ebc6b141d836af32353ed915007f", + recoveryId: 1, + }, + { + d: "c0c38e6d0dd6a10ba9de323484a3c1e60d27c14cf5c2111c8032bac4728a1f33", + m: "69e9de6850334e1378ee4c143b3c1764d5593f4098d56374ce16e9ec32f6155a", + signature: + "4a6ce42275e243e44d8de4e2c219b2e6647acf25a7be532d4e81ff81e57aab88124e6abd1d766d833bb50991977e8c2ff4055c986507149d9318700ac3d8f50a", + recoveryId: 1, + }, + { + d: "7e22a224d25327caab0d2195d0acae5235b0edf35bbe00083fab6e3cf1a93119", + m: "5bc257cd7b55f40079e14c50452b39169e1e93645829a60a14da96ef8eebfdeb", + signature: + "646107d16dc85c982e76207413957439c7f21311d4d1cabc955906ad8b81365d64022b1b080e1e6d6682cce8ba26a2cf22014898c48a8e42c56c4da6922a77cf", + recoveryId: 0, + }, + { + d: "e7172b83fa86ed248ac212c65f85d24225f2fa207d64a3b7e38982e8a1742408", + m: "2bc038a081e4b8ca28648a59c1432fd13cdd007c7b20c20480eb2125d6f906e8", + signature: + "c4f38220d0814fffe44518e5b6770db6f9cc38d8d4551b65e632b5199bf02f66296b456424656ba5b1a1aa72c496e6c1e79df778e9ad346a0255c90cbc0720c1", + recoveryId: 0, + }, + { + d: "1a5adefef1ec1b33df51ec1863cc66d459af06ae72a721d7d2d257e611e2a978", + m: "dac450952cd7c89329954acabaaaea35f40d2144d502977b2bab767600dee258", + signature: + "85d2a61742381e415a7e0a50ff5b40ac912accd86167a391385bf117460beb793961289dbf17c164e8521b9b937ab719c14fa79f8e1f34e63898c4b1b23d08bc", + recoveryId: 1, + }, + { + d: "3b6de90d77bdd538d8c3eb9b4f150bb7e722b4a2197bb5cd4c4a7eac13e4ac1e", + m: "7199f347c880a64179c68e20502122c26b9a067211bc5fef9cf8587690a69074", + signature: + "fb6d4a1b920b9cb6df3c111d96142fb7775f14a67b3db51551e5f5072ff53d327caffa2a0e8cc6329cb560da07e98b53cb66678cc9207e93b3f9bd56c5923d7e", + recoveryId: 0, + }, + { + d: "0b1544c6a864b42bbe6085b1fb14fb30dc3e4ca5a71f4a5279d2f379a27ede74", + m: "b5be45979e3706e386e6b56c3aa65ec2fcb147332a7306ec3f4ffeb74add4d1e", + signature: + "d117384a52162430f814ac391ba7875cedbcc4bbc10bfcd1663442539c93ce9f6507404a56d3c930e37e7d674466361b3320ed9f5a889df06410e1698ec3359e", + recoveryId: 1, + }, + { + d: "f8e0cdf67438f9a8d9afb1f44d0d97b32f4c42f30ac474cb78c7567838e24b00", + m: "7289e9ec4f301281f8faf5c9a5217a5d20ade5601ab6218cf45d2a409c1a6233", + signature: + "f0d667e1c96f1ec41dcdbf6db068e34a67e9de675acbacceab149e835f8dadaa38716bac85cf24ba6fabd9951111482ed4304ee4624fe8d8dba3dc2ec863416f", + recoveryId: 1, + }, + { + d: "0340e1e83fcfe4ea5715d6140c1934bb3147323873ba233fdc15e70261d761c4", + m: "a7a002c79696dc7c48ac0dee1b8797ce340108ab93cb20f1338c55bbfcb33c81", + signature: + "1085f075934a558aa8cf7e3cfbaa2e03085c66bbeabbddade733dc7d9c6cbecc38e07201b965491ea212ebd41ac3a438fe311c0615920e61d2f69fb047675d06", + recoveryId: 1, + }, + { + d: "42d294665876fb6dccb19186958dfe83f8a33fcefca8bb9fb17b15bf558ce760", + m: "10c0d823bd0da1faadfd1f68bb773ff7588a2675bf6eb8738ffe94b5c4f9410c", + signature: + "cc84afa6bae965689575e9c032f87a1f298ab4b5d3c46b3cc04d15fa64ddb85c5487871d8d7758de57d6d543b61ec64c0c7217a91b9650e79350122d2c1ad190", + recoveryId: 0, + }, + { + d: "222dde07a88f9d31b18cd34c3d82a7446b6b7f29b12ce9f93500aab3314b95c9", + m: "0bb92ba67819a60f0f2726d3280ddf5aa4002ff55406f9c2882eb674e3690179", + signature: + "5e3f4f8a9f312902255cf1f99299490cfb3aa5362a66dc2bf03ce34b998fed6f0f20f82f759ca841d1bd164239d5c3343eb481b792e30cf76c0cf80b21046c24", + recoveryId: 1, + }, + { + d: "be6141aec2143a4ba2bab7e726280b99af5f5cd917c19c3c8f77d207138bfe9f", + m: "68dd73f2b2b759e6cddf0e2214ca19f37545004b229f6de3cbb56bcad2b3f841", + signature: + "750083611e410540f6711590b795dbd046582ed11b2bb28f175103b0b1c5dce817f6ddfa2297c5e1902a231b37f4072bd58ac03cb0b945562401809eb38f74c1", + recoveryId: 0, + }, + { + d: "48689a574286f02c99420b36c1c398569a4e1c609090d966772d868921e664a4", + m: "57fbce8edf33caa8e0decabe2dbbe8a4655b09f701153cf2fe654696e756a81e", + signature: + "ca479baa4fa805615546c68b0efdf41b41702ea22e01286881e6f374db0f78eb2d289e813eecb3a43fedd1dee4be18c06d8a46f10d1a14c51c200b31e4a98bfc", + recoveryId: 0, + }, + { + d: "40855a20faacd38169e35edf4fbfeffd2d967e55250a6a991caff6a5f0a306d2", + m: "f007ebb150cea5f773f39dba962b0d9572e3fec27ca5af7a99026a3eda9988ee", + signature: + "b0133f631211d6dc47dff13aa414a2e11e597c747bd2a3d61271ddb8a5335efc1b79918daca3e68655d240071515a13549d2aa0edcbf107f2ce871d4039fe7a6", + recoveryId: 0, + }, + { + d: "fc19e684f3642908bc7423bedbfdb502984517adcf0ccf88bd8d6c18d2b5f6e8", + m: "2fc58dc4c998cc4ffc2c44a0a80d4125692ad737ca298bb59eb277532b3027f3", + signature: + "65c8bc4d291462b95b724b737f26e18e77fad0d45fde4e85aee56e52fd8fedb365963b4a49973ed6c72109507b1e8c2c14b93af95a4a4379095c46e4adf7919e", + recoveryId: 1, + }, + { + d: "668c279fbff3295aa96f8465a1f8f610112b9d6613a4b1c3e71eb0f8511bc242", + m: "486a368a0bd10340b94d1cca6613d4eb4d86510b2f2bc7a0f35686a17923f342", + signature: + "c3718528fec22d432e2a0d9a487045d38cbbb93695bbb26650d6e8c8c6ba3be72674169489c66f7927b3f1e321fe5e1825fb402331d5f7d2747e2303b01fa141", + recoveryId: 1, + }, + { + d: "0ca6047cdf10ce56b53e02e3a25633bc832b663a5757f29726155559259b311c", + m: "a09370dc94f5cfbb66197e1c81863faf785e248af2bd1697a86e376147f06ae1", + signature: + "966f743fc6e23a1eed81bbb7173973221811faab78dbb5a232bf13e99d133a2d5f53734b75943fd44c7600112e880efcf55881542aa6da015c335ea01338b19e", + recoveryId: 0, + }, + { + d: "fa66d807148a36b29bcaa20cb77fbe43cd55c5b7ac5f24f476744aac625e656a", + m: "315f65bacf6f2228ce6a9636c532c83341d561f68cfb0fca2ec754453df7957b", + signature: + "db1b12bec3fe6fcc053388d6a344685d62fa7f4193a0414f764a9d4e81708c6851c6584bdb2cd6ea59a63cf5385460b8c03a302db80f4c35bdbe2d1ef4f0a156", + recoveryId: 1, + }, + { + d: "8ef89f28e690d47530edd5863fa6d6a96b751064162cee858b209656c2eb735c", + m: "b3a8d77d520ff872e2712666609af04b3f40ca9ed51ca719db6542b9a61c1f10", + signature: + "8f57deb0c81be8c3b657faac69cd6f5871426866dca4e1f5c76b3cc8debf65f15b96f877f6f6ecaeb779f4f573fc6d7d507c2b9666105e06777a8913c0628350", + recoveryId: 1, + }, + { + d: "597101d209a5caec77b819919344149a358170f1452d9f805edf62a7355a298a", + m: "ebb70ada22b7cbcec08e947a6c290762e4a5b8988cdff4c11e45d0f81f0b5584", + signature: + "b12de9d7d843ebb3b098a932a41ae7569bc0fb8cfb6b662c55ef4be58aa28e6f0236abd102913c5070dd1d7f6be5e873b0f5e198d61e7279728c483aea28d554", + recoveryId: 1, + }, + { + d: "0dca5719ab9a936353be66bbb633b56305fef2ad66d68cc6c0c1360bcb9cd42b", + m: "0cfed44113a612e4337a94e5af390bc7b0c60ca40006743cc3d4a36fcc02b4bc", + signature: + "c07c216bfc833bec48b7f50ca38276401854f6303e30741187b1d401de38be562804731162d3fe6927b5ad2b47ab6e1100766b4e40c97128d67722a558495c63", + recoveryId: 0, + }, + { + d: "7605d163c762994965fcec99219034b92667557098d32ffb99892032847a92a7", + m: "1a0fa88376eaa36cf73f5f0191fe2f8f15bf9aa1c3141147a99a3716da1db650", + signature: + "85df97db1dab02f22640a95bd06e326a035ee8270b8707dcf5465434dde28e847938aeb8fcd3770e3c30f556d137a98896921c0d4bea8782d2f79e07029b4cff", + recoveryId: 0, + }, + { + d: "907275f05bb4b1cdded4dcd1b78fc53640706b906c49cf85b92e39b784bbe85d", + m: "cf00396b013ea57a20f74e2c7a1cba70fb382bc7f9fed910d1aac0a9635690c4", + signature: + "40ce8f02c0f73bab549f3848e5fb670daa7cf1b4a0b33bd5911fc1e27d7c4c8374d077b75fcc54433bf63a90de22ce5252e05324f707dbe2d78e0237e8504828", + recoveryId: 0, + }, + { + d: "82014976fe52c56750e34ec4d56eeec4dc1757bd3ba28b8ec5c56a9608617a8b", + m: "6772b740fb94259c85fb47af026f6b08c83865bca8bfb483fc3333e6efcd7587", + signature: + "b345d850822d2fb2b84932ac597cb8beb996669530346a0dd9020ebf8456c5036a778f667ba1f791cf614493bde1518d457470c3fd1a5bd8075f77448471d071", + recoveryId: 1, + }, + { + d: "233ab00c8e93bf7feaf776c575591cb4dda063a14480b5087f40d44a67d50f69", + m: "9d846bbddcf230a4ca4258a54c20c129697f05b0a067c860b3f3f3176f6325cc", + signature: + "7cc7698c21018fae50663325673080a892818475b4b44430c9b3042bfb24cb2e00fc6a5994c7ad31ad1aa4d708a2c31fff74ab10f5d446bd0fdb24feb0c2e3c1", + recoveryId: 0, + }, + { + d: "b302ebe58ce1f7aea373dfcf8f0bba6472e862c468410dcab3dfcd75129c51b7", + m: "1863d4eac841d30b9cb9a1d4ccc96b5ef0734546280b73abacc37eb721998a54", + signature: + "b971358fa57d3d578257da1dc7b6bc3d6e604b876bf4bff278880848aab46d7f761d4c3e5ebb59fc7e02a3bd29e7f49872d3e9a495cab24aae9ff3c4b39df3fd", + recoveryId: 1, + }, + { + d: "cdea207e2747185003f34ad6fe6855396995765e236b8395391040e7e784e097", + m: "cabe83adcb2405bdecd564747bc31f49ad2982b55154d6b8baf267482e3aaf6d", + signature: + "ac8123bc8781b883b7fbfda1bd0380c23de530a4ff009e5cece10566ccc10c525e9abc5a173ce9a72ae7e114ae13642a33804dab679fc8fade52d4f897720730", + recoveryId: 1, + }, + { + d: "f14b9814561ee9a2c76f47f1c846f65f9bad371bb5c358cd21783aeafc77e26a", + m: "693bda1cdbd0567eb88e00faf3bb92d37e10f60d1611d92cf930b64dab275bc0", + signature: + "3641a3d3525a49ee4a3bc4b3240c406e13f7247470a539c3f021c9c253cd348473cb42717e3c27e4017dd353b47fa329f601f33f595507646f16268e0273c246", + recoveryId: 0, + }, + { + d: "288da46ff7250ab7d63bbff48eeba4ac22d3ce47d7ef0ddbdc69367a184cd612", + m: "2b1ccb23795ec19ac996eeafda2615fb43316282713e1e51c1d3797010288a93", + signature: + "f15849cf2cc2541f9a70637a2dec8079f96615ffa7f38dc2916da9da63015af3343210c6f91a1819cdfbec92de52c7eefd03f7e3af4271b61d31a4664bc87fed", + recoveryId: 1, + }, + { + d: "740becc38a18c3448cb7e5baa068887177dacff72546559b5a73f0101b8e7331", + m: "ed2abfba8e8abb2f3e79cc3699811ee80f6b809b125e554651f1c91b23ee98bd", + signature: + "4e4e61404339030667f3b3c8a4b03b45a11684c9c252c30a229e2662b0eb794433b5456d7380ba16d8fb415da01dc211f82b7c7d0aa5aecb0ab3dde076811cdb", + recoveryId: 1, + }, + { + d: "e48e3a20d54ed68a03a8f59250e63ca58327cba5cb9ffda4840cfafc064fcfc1", + m: "96a231e3200a3e85967420ec7383d5059dfc5535027f68e5011bddd589127afa", + signature: + "1e2a812f90f3c6bda90fe80a5d36c321cc7b31639b0e824a354c1b3fe2d6f11b667891caa059d24db10db5956fe6b5da3031ce81db51c67d922ca9d507c4cc8d", + recoveryId: 1, + }, + { + d: "d1ab05208031d9ec912f35724a7a8011ad25e496eda76bd853757eeed1327e97", + m: "31bfd6155385c85c0530d4ebc67838d32528ade8b5339f60d0ce78ca7583fdf9", + signature: + "f371a0a015840094a12e284178658572435ffa47e3a8522e0844fb625f9c9c872a828ebaf6c6fcf0a8441370cb8b3091f0071f3e0af35387d65085ec25788233", + recoveryId: 1, + }, + { + d: "1697ac442c6a715cf45255b8e93280137aeb7e649ab953c872ca62d98f7af8cb", + m: "d0b4cab24abecd0fe5c8501c19a2d576093715cdcb6f4b3436f70d3559cfd6ab", + signature: + "ddb7f80b2841884f5f1a73ef57dac549473dfef4454c2ee2ad3c31657fe0915150dcea8692d4ad98b08b0d0ced5e9b783d6a71c7cd17027978a3b14218a2f237", + recoveryId: 1, + }, + { + d: "1670e486e695f062642416c5a617cc1e65bb0e4e10ad0f674140c6ca66a88482", + m: "6bb1c5bc4ea34076ae48b8ca3a4d557d990eb294a00dd57ad7c5c8e839af5ae9", + signature: + "e1fcb1cacdcd6a29cb22022a0de63e9a83822421389536f0d13bbe2ae3bd7c465317e6faf24eed4c0872d2f759e4e3e213b3d6f36decbb46d08a7a4fcc431bcf", + recoveryId: 1, + }, + { + d: "ecf166d23580fc29ce6b15fc5839a5382ed29575d802cbe1a0573dfd104e77f9", + m: "ab756b3946f5362c07f6e8f411513ae304f25d03892386cf1d6b52b2e429a49a", + signature: + "3ccef9df919e1d2915ba47149f2732b67bbec4a9206e141c4bb95f45d47f54a4559b7dd2823edb5c44077d6e166ce299113eb0b795e208a6eb937788e6061326", + recoveryId: 0, + }, + { + d: "580a55e77d23d61c0d9e33bdbc5fb26dac03d86c6d6351048a3068749eac7ef3", + m: "9b95f35c2c26c02aa34011d4ad2742663992b72f6746cf7f3ce81e9968056455", + signature: + "c250541369918b0fbc3e6725cd56b8d184bfe9565d82b86f4f7bf8c5519451c132143d67ea4618211687e5a368ccfb692af1cde87ba2cff59e9ee3bbb8050b6a", + recoveryId: 0, + }, + { + d: "d16e13cd41c247ed47198fd73b3d5ff07101da581b71f1dc3cb0996a87708bfb", + m: "c04e33edec05dd1a882bef3af65c9d78aad3088dd0ba89afd7e47a99fc135b02", + signature: + "8358b4040c37c9d29efa7c4009562727ab88ec80e80fcc55a656a9b2bdc74ad471988b1a9f88784c0a3aa5a92ee8b7ddc8b70cce9887a7489356abaeeb8994fc", + recoveryId: 0, + }, + { + d: "43c9b4a577af235cc9dc99474e8132cc83b3c538be1d787f5d3e4b8d742a6c7d", + m: "c9d7a98f3a833ae6b6efb1fa926325db7bbfed772373fb1a7682fe3833a9cf2e", + signature: + "d74aec1b71e47beb201562257affef8e62086f18d96bb4a0d994c940da1cb80d429d12837b89bc0f1c89ddf9ed303800b1d1bb108779ca9d839c8d132f5b2ca0", + recoveryId: 0, + }, + { + d: "8ed7a8ef3ff9f9ccf259ee84d0c335203792b6d2583171e3343ab951a30bd3c9", + m: "7cf0b79728a09c064523ead76f79d4318ddc37745bbc90cd14d6a4a328bdcb71", + signature: + "a57bfa84f316dc07feb53edf73837037e736fa7af793d6fe7815da51a7cccf18774eb794d1cebc65a180923427e3c59cde816276dda5c6ebb1418a444dc37400", + recoveryId: 0, + }, + { + d: "81dae0d88236e1768e5b51693a52ba7ec63c4b6c736a72e9cda77b4188217d0d", + m: "761d123cf21fdc603ca41c6b1ec5253a87d3a6527f6e725e9cc427e920a5e1c8", + signature: + "8b4b8d193d9469b1be81ce8e090ae90c28dbbbfc3c8a6d23099f4e7ebdd12637500e77a5782e926815ba331dc9de82a10a364a6e40757bbe39c70d11b3b36d89", + recoveryId: 0, + }, + { + d: "8080caddb2cb489901111f3582025ecedfb4e9ee30bcb7395dae3c73645c5e47", + m: "d3ed73887b9d06769c523caf9f3d7e2972051cb2cc807db6c2fec63983907344", + signature: + "e834e71405ade39c8ccf3677d4fe98964489cbf73b00b43bee6cd7032fa41e51001ed889a5111caa9c52f231ba93cd96c6bf0054e4cd8dbb096c9abe14ab3285", + recoveryId: 1, + }, + { + d: "ab32d8759233f68125f3423ff702ba5a5e2a99ce2d09332d64d52c60099304ef", + m: "336f317d6de763b6dcc988d87a0b2afe430b433e1abf8e2bbc9db9ac0991b2ab", + signature: + "4f602294c77d280847b5bde927b0dfdb83caefc7feaae2f7862088e9629691375ccb8325cff014dcc39422309e13da5006923c37473a1df1cb699a9cc3e870da", + recoveryId: 0, + }, + { + d: "8d641e6cb977be61c9b9d755d977a77dd629c9383a70db66b72e7cad987f240f", + m: "e2f32afa624f61de6eba0acb63a9caeefa4cea2a604d424d1cd94dcb4537fb3f", + signature: + "772ee35db7202f7ae6f0c369ac631cc412f372356709fbb59a2a63f391faec492b4f648ea8bc5f9a8a7fd6c6173884768d880ec1d4391581be6dfde689b99625", + recoveryId: 0, + }, + { + d: "8629f7f02621f5d412616edfb8489f14d2eaf22a70116eda76a1aec3af5ccf80", + m: "9d55fad67f76ce1dd72809f86151425726dac258aa1e80f871229bf961f6a6d2", + signature: + "5bf268fb473fd31c6bf0e2a20f85edfffc90ac059bf7978576203e22b1ef62fa747da5a8250e83e92812f179c2a988321a12f51a626e8845dec42b6ca2d438ed", + recoveryId: 1, + }, + { + d: "53e4b1e1d6450c2d773c9c8c47a59616addc48b5b9bf2857116460f8ec397e34", + m: "8dbe4f8780dd9f198f0e138410a144957b8a5f9d73bf0776980859392a272ab5", + signature: + "0d68908689348df6d60d9a218bc3da7bf71862a9490dee659c51a5dd38e99cf31b30ccf99f513bf5bf7dc9bd111b5919697ccdf5a55a867d72c4b3c9084b8035", + recoveryId: 1, + }, + { + d: "0cadadba59748d4a50a4122713376c418f97168499393dae14c632e92f78a9f2", + m: "2cb5f6a9aab2a4e85c053c75470e1694cb676c8d1e29db3ba89e4050a43e07f3", + signature: + "8b0007f482fc86d8b0ed19f18a15a53f0048c181176783553a0ccc48998cae926a475f725b0fc47baee274223c84dca8083f730d65760f0fcaa5d8444f9cba4f", + recoveryId: 0, + }, + { + d: "3d0ec681cb57ed44e201a2c7c3eed3837e0f6351b69ee9107d9432855147dedf", + m: "0ce08a1b0b7395febc39df9e40575cb1a724f009d9640b9e6187219384fb5d02", + signature: + "af10ae9ba9ed52b47cd0bf52a174e6fe980442c672168a30f639a913ba2c475b089a132cf5b55602217cfdaca814d2db08c1de8ac1f84e9f4f159432c0c1266c", + recoveryId: 0, + }, + { + d: "80d58690008745dcf18aeba671e397fafa2e6658c447849a00c81ffc4e4e710e", + m: "f28859a2f765132e0f95289818def142d6a7e816ca79c5c8964e35abd762a356", + signature: + "e384bdf1bb1976e5ed9f89279fed5d322f43790a3f143770f73e5870496b8daa29ec3e9be2bd5ad875843bf8e2937356e54cec25ad59e0a819946fb3fc26d453", + recoveryId: 1, + }, + { + d: "741bd0470aa5af73acc6773042faa5f8a6e7b9dba57ab1b47c675e11f8184aee", + m: "a603f3384d9ed07b6159d8d4743bdfa0d9ece8e7301e0d35e0aba922c80ff23d", + signature: + "06c3b6cbbf6b253af94f1a721cfa5057458c06759f3931b514b21491475e9ee5248e0664755c73c2005cdff3e2135b2f0021574326fecb87d85112b9a2253b51", + recoveryId: 0, + }, + { + d: "2e75f6c18ad15653d60a5fe983cb4b04b627fcba5940a5bea4144de09571b8aa", + m: "49ef48ad888c4912798d7082635671d510fd8758f63c4e3719f3d8823b49f799", + signature: + "5872be3ca14825aed30cd77f0e1ec2a712cfa45de96fb5897f0af0dc0aa1ccdc58348c3e18eb384947cf6301958a25ca494c5c3a370230a72ec2c3e78bcd96a9", + recoveryId: 0, + }, + { + d: "7db48ef5c5e5738c0c563c17304b7bd7b794d32b502c4e3ecca237ac7bec09a0", + m: "01c17da88850c86e2673f52f48f56591bd8782bffbd0ae55c67feaefa28462a8", + signature: + "f4dc30ae5d71c15472cd0702a862e7faecf5d17a08526c4882208dcc8cf5993024de0a3eb923ae9618d78e6695a5a9646335ec2dc21db0e6be9474d239744d88", + recoveryId: 1, + }, + { + d: "0e1d3d26e3a35c651b55f1f70e597d649d3826cfb85a904c1d4095c4c0a3a1d0", + m: "cbb545731cc12b0b5ca6160f1752ed0f62f9709f03ec1bece3286ee4dbe8829a", + signature: + "ce87e07db6709158ba794bf38e15b1b37238caeb1fa626d95acda62e513481db752e4d5397cedc29b02be4c8faaaa4e1f63190fc10cb11b8cabb18ec5fe96a88", + recoveryId: 1, + }, + { + d: "66b54ef9ed896c55597d000db966f8351d854d5792691be03af3f5599831891f", + m: "2f9a8d66e73df95fbc8b97056af362b318c3c772a854953caffba21c1fb3665f", + signature: + "785eda01484691d5dd03af554ff5b8e0f8144f3814acc9e7b539852fe545c58a24a00eee4a8f4441f2a1119379eb7d7a04255cd816eb6ae6b5cc9437762dc271", + recoveryId: 0, + }, + { + d: "e76d40b3c6895841b439cc7538fe572a2c222aed0481cca7c1497387d69eedb9", + m: "79466ef4eeb8c7abc081512cd666da2de245f524e87688ab422ac3e4c018df36", + signature: + "40e2b0bf72559ac0ceb377c5a7eba8909b8e6e49d9357d07a45ce536aa4a3d80449279fffe3e877dc78b7d3c854953d180f6bd0bae79ca2f5f37e1f8a99130c3", + recoveryId: 0, + }, + { + d: "955470633cc30df5eb104baf71b000d51c2f689a9b643c1c766861d3a76f5c94", + m: "a19bd91f7371e5999d5b6af30f7de1846fab807778013a4c61a026d8ef145aa5", + signature: + "f7bfedb538eb2d1974d80c9e0474a87f87da70fd05cfb41304d4287e2cda503f00743c5d22e6e3f395d1102b37569884cce6e12ed34cf129717ba5b57934ee3c", + recoveryId: 1, + }, + { + d: "46d64642d0b9115504bb2c6c07fbf902c8efa276012210109094aea67fa70b47", + m: "23ef134c19e34ea9fa617e62fb359726e49ace1676d45e73831aa7b12238505c", + signature: + "a6f78d7494612f3f8489d18efc5b1daaf3be291579e10aa5ea1b91b789432a9f71771e013a370ae533e12a151a8435c3d1ac23f422a0b8977fa0e68bf8d3cb9f", + recoveryId: 1, + }, + { + d: "9b27302e20840a6c10026a2bd876280fca7b13d3b48f4822f0fc8e0966b1ee6b", + m: "d7e6e0bb7163662094e4582bceef1f38406becebef23b4d4b703957245de1ebf", + signature: + "957aef5c85a35410cbcde9cedc80c9e59ff0af866c3f4bc4f56e6228b6be266147900eb2e9cff0f6ce55dfb0817aaf756fb2f6f9dbd0b29bdf2f46265d9ba297", + recoveryId: 1, + }, + { + d: "c9f63f559cad72481f101f398ec46f36cd2c6e2eaa6f69835d4bba4f75060e6b", + m: "ac3af80535293feab87d985c4af3a9f44a2569ba0ba923f96950cba0b461dc6d", + signature: + "5d5226fcb6bcc025a777c03855122750ceca775c48215ca245484b87f60a7b5b64e1365ceeb6c227bb0352f226db44d87dd2c2c9b99fa26486a011183fbfef11", + recoveryId: 0, + }, + { + d: "522d6f772ead00a9c3ac82b6debf1dc98e2464f917c5d7e951e244c317412042", + m: "7209490f4fb9415a45ca82dffa36247b430012b08b89e26a7338398af7200a52", + signature: + "da541afcc7311d247dd4b3e5cf0f600c7b5dd7341acc55f7aa85eb6d907c6c015121fc010c85ac3de2c9ecd6b6500cd0ca5be5ed8642d121306afe7b40c545b9", + recoveryId: 1, + }, + { + d: "e9d92c90d9fae5ee93f8992f1bdf89acf4ef1c54a21c8e92daacf192e27a2f97", + m: "508e375461d4e081c44f7a2966aaf998dc12ab6ef76790a0d0f555d2d735dd20", + signature: + "5d4f70685b41bfefc251d19be21b88e5b8ead659a40e91a8d12847e30164548c591ade06d347405d12c60d6a895b01998e1ba470094efb9f8b95295461e430ff", + recoveryId: 1, + }, + { + d: "c024bc626c520f205f26ad452afdee3f3104ada3e0e8985d7f78b05646dda70f", + m: "b174725e74fb5c83592d2f59860cba595d0730c6a6980c818d4cbb9b8042be5f", + signature: + "b9910eac23343896afa70cd388dba902384008af517eff86dd484c0bde6ceff62d8a5f00d06bd2a3c523ce99f530750d6fa80108c54b395c1158e96c374472f8", + recoveryId: 0, + }, + { + d: "4d10d2911fd32d6eb622d9919b7a89204bb5d7a10f793d88343609415853b77b", + m: "365ba9f2cba118d22db575aa5de4f1620a4249e4abe7649d5ada043f56ba92c8", + signature: + "6f744f4cb1e39f6eb8256d84647e9b88962c4cb3d81dae1cbbdc186789ec6f15094641a49e5e8588069e48a157dfdbd91cfee610812522033a69ea50a3b29217", + recoveryId: 1, + }, + { + d: "91d7ca00aa0384cf75732c8e2b78df17fbf21cea8d0a134d9b069e5103613a24", + m: "923363cee70a3cf80f5e63571ac79c0ca58e6e6ef014f8b6c0dbfbef6a9fb852", + signature: + "68897493b6d9591b97124510834fcf13815b78624b921df73d0a05f701a970ed21e00eb7855713c051140e721b1612282920c2601e12b25e73227eaeca935189", + recoveryId: 1, + }, + { + d: "595a20bf1722ef8195adf23114d359035bdd0195500e42dd40e4c7478e8eb433", + m: "c11bf8db417df7f998c4e43fb205348ee717f0793592d41b6d3b36ae177520e5", + signature: + "52e814ba6708db0f71243711f01b470418476e89fba07b6a79bb0a2645073d046a877faf7a7b1edf1c84c5003ac8a1a0c873c04624c08372a09ce796dfc43e29", + recoveryId: 1, + }, + { + d: "8f5d72710d2ecde8109ac86a2489e6bc111b580b7df2e23146404249609917c0", + m: "520d94e6596f199fc2c61271854117925a50fd9ea69c1b6277ab1e2f01e63242", + signature: + "8a32f5748203b0a48ae6ae5be979e6c184dfb8e61155d4f7a7f4bdc1682bb8bc3d83adf2aaa8b1060747977698b64328ba4cd570c4e44d3bc160b007cd44dc5d", + recoveryId: 0, + }, + { + d: "d91eba25a85bf9b6b7bd2325bb64fdac12902d914716674c95a0ca537052aa4e", + m: "b199da93e89f1b240b001a376e0ff82752cdc0c6dc26f11c3d93cfdc4e291038", + signature: + "645ae6375d9216425fbd8ddbada93a4b6010ac43957a13db9f54f8ae8c511c71685b56dd378ba3ad998ab199d8443d5ab30e052cefaa65002a9cb6dfee233707", + recoveryId: 0, + }, + { + d: "65f75a0db373c17be4320c1dee659c6b1589a4040f1638da4998c7785c748a35", + m: "1b710661f5b8134390381822db2d26a0dcf30593000717f55e64e22d255b373c", + signature: + "4625e2cf9b55ba3d8c54a8bb17b500b05b4ff77832ced636e7ce0a9453e16fc8232a3c490c3e6a15d9992e411c4bf4d79b73ce82bef1898cc171941745729126", + recoveryId: 0, + }, + { + d: "63ac26549a454aa18787634d1cd26692fa8f4fcb1ace4174ad1ece68ea7416d1", + m: "97db0a326a79b975b214adc976c56d93f8bd52bd5545cb4e9f97136bf7c1c319", + signature: + "66b6748122902acf365c3bd1ed207fe5ed8c4f21a37cbb92cc1349519415071d59b9cfcebd5f4d0fe50bc95c89032310f9c52c7e4fafff494a9137da74691cd2", + recoveryId: 0, + }, + { + d: "571cdb9bb9c77382b51b972006ab6bf81d5447a2cbea2095412097cf71d4ef23", + m: "ee7513e8dcf96f16334713c97eac96df2eb78afc3c55f4e019a87adcdf81944f", + signature: + "e475421d27bc650189db9b181f8ffb72b0d2effc0ada7eec19a919b8157d58e4673025e8fbc978f4069de6ce47eff1b30487c6de73f8f13178dd03ffa89c84b1", + recoveryId: 0, + }, + { + d: "089c06f1ce6739da69dd88ef1fec505332914c9dc25b2c0b246696b2f7a2ddf5", + m: "c7e208e18ae4048c32cbd72daa458f8a70b7f41a21c1d2df965b68e76265aeaf", + signature: + "cfe19c19879d0e24a1abb4a5a3a829bd30f3f7c7e1a11ce3f8e087b1c60d95a2673267c1f41453a90556b3ab25abe157daa12237ee8dae70a9b59ea0b0119725", + recoveryId: 0, + }, + { + d: "8d87a56723c020cb2678ddd915e68f0032e89dbb6d75d627c1b69536d2c1ab7a", + m: "11f0316cfaed60cd51f4dcd6f5f5a07891660b6dbb9156b1dcfe0ddb2647efe2", + signature: + "d48fc668189e5f90bbced9871b2ae4263bd3c8fabdc9d9549a6bcda19b2b3fb019aae7cadfdb3bcd8e9baaaf3cecfcd64e67e72c5db23925456b73066a5226f4", + recoveryId: 1, + }, + { + d: "f11c40de363ebb75c704f2e7ebbbcd2f531baefae44cdb3aa8d6dfb37783ce6f", + m: "9d267158404992b70bf14931e87cdc5dbcd5f446c0735279d42291ed639678f4", + signature: + "4312d1db643e54edd76894e0684304b4cff526c20224ca8ba6e13313f480eb337190f76a40c5ed22085fc61cb0fca7f64814fa042a4aec3697a313854630ff3e", + recoveryId: 0, + }, + { + d: "7434dfce0eb4ca97e1e3e010d18bb1a44ad8b6576a5573db25180c1747fb5509", + m: "d6e69ddd3df7d500e7ba27bc907f3b813019d351fb847dbfe7b1bd804675c44d", + signature: + "26642890e0ccde400c2f123ac55d7f9508bd45bdc701ce79dbe14446af082b2730b57e67eed197de9c0ccc0deee9d5577ce19d5b8ee4e05fb9169dd8fe4084d9", + recoveryId: 0, + }, + { + d: "028f8d47d58c63ba6ed19fb8e76af0d5e8b2fb7a5aea9b61996136eb0e80dc53", + m: "a5afe733d7049aee686a8ec1a85cdcdc4a38d3b18d9a7a683284644bdf599bc5", + signature: + "1f392de470bda5c55e39b8fc72990eeae31701d48e340b6e78a8e686fc3374586a9c0e7987b0351b9846b83389cb935532d87be62d07492b392a8f31477b7653", + recoveryId: 0, + }, + { + d: "a841c6c860355882982b9a4289b37d5d281e7ea526070c2802a8a71efd1b6a8b", + m: "8a00d599435a66da51812aacf92adf8a491f9bb8088aa6952e045a9e22b0ab8c", + signature: + "fabb20ff2708c9af5e02a5bd2e5ab05001735f6d3fabfc5eb7bd18ddd3b96639191aba6cb676a829b15a349012370a3776a58a1a4626bf472f4a9c87f09fa44f", + recoveryId: 0, + }, + { + d: "e748e50334abe1b1f323d19c98a0afdb4662a9ab30f2bd1c2504b947e48be2a0", + m: "5b29fa420469aa360d01f66d1cc6b645f03b6b1d768d2ba9144cab795b9c2217", + signature: + "bcdf88224e4d8195a0f3a3aaca9295c0708addb0ce2f864ea35c096e2b7d27644703b17cf5f9dc224083367375e9665ffa72578771cba840f0153065fd95541e", + recoveryId: 0, + }, + { + d: "c9f227965fb7ab3800a2d3f808910987f86b88bba6fbdba517292d56e2582052", + m: "b575fa5a298e32b08fa4c7ca1b75cbb8e5b10bd23f8c7dd91620404ba2dcf0df", + signature: + "9dd9f4ffb0a43eacc8780bf272d01265235deaa648aea2faade94b7215aa113a284f84b6dfa653ad0bf6ae6cddf7e7234100702f0d42681eacdf5d3b72c5603c", + recoveryId: 0, + }, + { + d: "dc7d39a38855cea683b456b7b2ed50d1f68a184638b3b9cfaf8ea7ae9f7e1303", + m: "35959af1852d12326b94c3549606a198211d18d2a0f6fce96b4eb612d3d73f87", + signature: + "30cdd1e392407b76319f78e5f1189171bc803a6d18595ffd9299e0bf3a047c1f0713b7cc3533a0f35020cc8f8e39750b113a5a0f83b9b2a35eacd2ee19522081", + recoveryId: 1, + }, + { + d: "33592527c07d22a95b57a28f6483b0c8e967b126daaadca98c5facee79f2ede9", + m: "be359607260595b8d070cf1bf46befa41cdeca8f1904b1d04b8fb940de51fe17", + signature: + "a92a1103355534ef5f4a4b375a69fa682cdbf04b0c38b982a25c8f3013df460a5b797d1b2f741359e939977c971ee2f3087d39219be455437134e287957c9acf", + recoveryId: 0, + }, + { + d: "d0957f0d4ecd2f37abdafd81ccb4b6eb620f16dfd10960bc44a4db2d3c89d05c", + m: "8cd25902125c052fdfc4ee23f46e3618bd44187acd71ec99f59fcffeaadfb01e", + signature: + "b79ecd0d7d0487d69311ea4d0a3c1785f9b63876ea011dc2136c58f2d1b654a162d7b45aeddf0ce6e4ec87c1fc3426f66ac9a4eccf1941a33f13f43fccac9bda", + recoveryId: 0, + }, + { + d: "c9cb68fc6d0fc736e20cf42ea6161ea9907e8e89e83c8e06219d48fabc665d93", + m: "71694720bbd9a92dccbde83f708a7b613e858b6c33c8bdd672d8b1de8b4a00ef", + signature: + "2521c3b42801b45a6b5d8ee7c6843494ad0704e9ce2fa79abbef4b6b9326f0e146d23232327d58e4de0e3d05913e4933ec56ae76f837303972a886b4aa386c80", + recoveryId: 0, + }, + { + d: "bb4dbb6aa147fb37d48fdf839bb1455e870598f118aa56a9b13723049676f532", + m: "457b2489ecb954bb8915279c9a0720248f0309d4ef52b7de584f491c6b9178da", + signature: + "029a5cbf11d7e990481b5d91f9e6ef7fe27b1053244b8f06868babf53ee006c64b93bd5750eb90ebb360e79f34823e43e934950d234e83a109a1148121b6ea08", + recoveryId: 1, + }, + { + d: "2d104c2feb6b7823be3398433c5cef6bd35ad6ab637d151bbeb7892bb7dd2db9", + m: "c6b3e756a87368ad1f956a334435d62358fbb52133acc1f3bffce336f3b7ef40", + signature: + "581bb13c3599c5e9bd941da568cc0143cf645d85d42e98d1029464200dcb2b805873d5b7a32b7b01935a7e4655610a0d120254d116561a5910a4031049e4eca6", + recoveryId: 0, + }, + { + d: "b7c46c4440beda139a60adba132d82742d4417d5ad9359a6c8612626ba08b5c0", + m: "2572ed4d364322d0da8ae3af3c2d4b6f76ab96f04d8006cb418ad23414536863", + signature: + "cda81ba2cd1bbe230f46c961c400c8c03386ce583aecf44fbc0700e03abfb19f1992594666185c75b6ba5513c37469a6093f9a8b25e19e56c657b31187c327fd", + recoveryId: 1, + }, + { + d: "30cf7335eac009171620f16e678f7be5e16db3c16cab0516dbd5b4c9f7446b5b", + m: "fd56f68b439785e8125ef9be78c208052421d0810f1968ba7236aa7cc8cec40e", + signature: + "1bc4913973f030c9736da44be5eb862bbdfc6a2145b894a385ee59a2798e703809ad2e656534de0b74c24d76e07acb00c091e80cf5f15e1b956cb4f25a31bf8c", + recoveryId: 1, + }, + { + d: "269edc9db31a0add43c7cfc2712ce3c5943fb4d4e4db16b3c273083a614b0927", + m: "961a870ed698ef69588bc12e85b1b5f7a6fc21205ca78353f3b4b7330acb00c7", + signature: + "720196fb56d4e28d04a4b1b2a0516ad16c9d539309342e6da36345808fe631fd4c0cce5584f5d2bee894dfeeae76fc3f3836a38f5b0bda2175eac3b35ad1845d", + recoveryId: 1, + }, + { + d: "a2bba96c5ee1cddce9f05c263eb2404ef5949a3b945142c78b4a67da7bdd37b4", + m: "2e6c546ec6ad051568b269cbca7befcd88583e2606682f96af7b87ac5388f8dd", + signature: + "bc5a122845810447aadf67999937fe001f316db67f1a79f86dddb103c4a3c8c70bddeaf3c911278fe6c1034ccb84c10eb47e6d2ff6dfc1b5152ce38d4727357f", + recoveryId: 1, + }, + { + d: "e667b2dcc82aa2b5e2a98c986d69a75e7431f952b4d1255e6e5aab8aba9a2270", + m: "9f8d56ad9cb91dbc878da58346855dd1082f6808b3cb64c663f947c56bd23c4d", + signature: + "a72d7264eb68ee52e1638f8fec14deb47189f35f99543b65098ebed93660c68664a35c9e52e03a430babe0d0d11fc911ee6fc3d4baea16e533d38334ada5270a", + recoveryId: 0, + }, + { + d: "1bc606e2b914867801d79c2e0b1763de0bd1143c93e52978ec5f223ad79c70e3", + m: "3f29961b8b1d785485a9ac031dbe14c2463b109563b777c5e30a884ed0fe29e1", + signature: + "16481194147303493fef23c51fe162740f24e785e195631e5a1c3d1000fd7a144f2c89ff5f3d3121d07e15cd27c1683e6b1a7af8fa0e8fc192b0186d9d9a161f", + recoveryId: 1, + }, + { + d: "354c7610f25e3a7348c23883421a8c4c0641e0d8d30515c4812552a9ec87a1da", + m: "010d6134ae081963b5f8cc9b01582f66e73c4fac40b2b5e2ce7c07c033fc01c4", + signature: + "c8a626504a1d4f58dd7024eef9d99fa0b1f21ea49ad7be073a7a90fa69b2b1d316f60fdfb7fa5fef379f158f4b519e6eaa877e0d894e0a61c388e8608575dd4c", + recoveryId: 0, + }, + { + d: "f6f3b7aee1b9fa356d170478bc95b273679e45121034e42222b67f2d8d850e34", + m: "19f2a35f867296bc1eb128c0384c258d4c4d23037120b422017e61f569f90da3", + signature: + "d1032c12ba13d9095c41249809e363886dd7b677762df2c0b64749e519d9e5de13d6c884ece280cf69d69f2c7a83f33b7b9f9ed97575d538e72bee7a474d91e1", + recoveryId: 1, + }, + { + d: "3b3e833d05742a1d9217269051b7f4a6203b17b77b6fcf9ebce83fc51fcc3768", + m: "798878eb9d940c26bac4bbad41567fd28abea25384b79c4c2037bde190511c7b", + signature: + "e100a03635623a5457b5e59930a55ac61e3993ddb573a92c3377a42d8ce1ac553fb49452e76e9dd60f726412bdd253e7f16083cab5788eed402ecdfe257763b0", + recoveryId: 1, + }, + { + d: "f1ee0721cd60ab252506c9d2a72b55f1be8da8456fbcd24eb980acecf87e7865", + m: "717f7dcefb93fa45ee592963cf2fec95947140d26964b00cb8cfed5b0ba81ca2", + signature: + "9717c986c8f1bdbaa406d494d9b953d1396f97a45e5e9be029d22a309a3bd5ea61f30ac5eeec90348d4276ea1c33e5d0857a9020fab423ce4f7a9edbfc2ea4bc", + recoveryId: 0, + }, + { + d: "25a70d40bad719711a585ba9a5d3eccece6ba90694bfc1d0709b87a87f6739fd", + m: "b098f51e9638a7c395f2fc31f02004a94c5050677736333a330c9171458ecf3e", + signature: + "c3e3d8cc1824a05dd9ebcdb8dd63de4d8b16577b4bc4020d6634c4e853a3167b04b221935ab0baa5d4cdee867b759218f05c05b4ed1c0e1821f831524c92f951", + recoveryId: 0, + }, + { + d: "a1813c405c32f8e73460d4e516bb547d45be3185093174a172a7dc321872649c", + m: "a1639aa90496d1c85a48dc28ec6156a2ef847608ba60d342c3929171ee4ffc4c", + signature: + "41f22fe38156003789c82b7fc2c90eb06a13da5dfbb6fad94050cb400cbfe42134480ccfa475936d12a78864eefbf73ccf57734ebe86885cacb0cbff4ac423ed", + recoveryId: 0, + }, + { + d: "6b4e5e59f9ca5e81fe5238da12bb1ff8e476107ecb115963b6b1f9c3ee957219", + m: "873147ccabb0a8b3d2562698986e213c1a80fc0c4fee9b80a612e7c8b99b9637", + signature: + "6934c6899829e830712329b60bf7240c70456320227ca1f83c2e33d4122f5e374b7dff88712318abcfb7a6e0bbe55e6480322458bc8b267ff93be57ebc801d37", + recoveryId: 1, + }, + { + d: "75eaa29d1fcf32226be87738a6b2bf7ccb4437ad931466f21023d301457c2ff8", + m: "a988089a5d3f7c1db2639a841046a369e38881b59049ca9b07f29844f3df82b7", + signature: + "fc943e7b456a029c5b153daa02d6ff0479a914525e90865e5b5ef6ff973c8cff085c0748b3d1144521a335350c01832dbc4d7c1acbcbd7f76870724c92139315", + recoveryId: 1, + }, + { + d: "0ae7dfcc11000ddb6ba72c9cfc3e3fc0e11c492bf78102caa67c5ad65e43fc08", + m: "c3eac59600c959a19dc897c91a0d08b0ca165e549c3df2fab61733e3480e1205", + signature: + "40ed40b38400b2f8c09540bd6c751f45c555e3c7d41427cb54cf644cb76b172117639369d15c385ea9c9f7e4cde6088231a6147333e3c2a6ab27dfa0c2703f37", + recoveryId: 0, + }, + { + d: "e2e19e6bdd37d9ebf5f13cfd718f3fca39f4ed941aef55a9bd06fe3af464c573", + m: "052b1a205e74d4b412682a24ec58b2db20055d527135c5a06e2223d79ffd6363", + signature: + "0f3df0ba9f351009d2aa924fcf643796ebc848ddde69a72b4f3baeb0a27585710e5beff7c3d93fba7bf6cf25574c0df4ec006d803d6f45eb15e14275bbdaedff", + recoveryId: 1, + }, + { + d: "8559602cbbac297dce20b7ab6f92ce2e9967a9fd0807e28e95769d0b8309de89", + m: "cee5c8e9376c200a7514bf506b1f1986cecbe2540605dfa1ce4c727703665d23", + signature: + "87dab324c9296b85c8c8934be07d5a0201509a6c1ec34576e3c5a2d64a1b50bd52e6533635a2a8616e7918889f0e132e9500f7104dcfe3270cd01938c6ca7829", + recoveryId: 1, + }, + { + d: "2c4da04c75c2ec02a9286f042a7749bad2ca621d7d54c20418f964cc75d6dc11", + m: "5b2abff120ba23abbcb3346c1d822d8ab4d7f2403528f98ef0fe2f2e93d058ce", + signature: + "e0bc738f62af4b32ccc1485f5ae872ae88d5640d5f4e6bdd1ca66b3fb1b53e607f7a99841d0458376457051327f46510a15ba070320be66371e7f57030de70ff", + recoveryId: 0, + }, + { + d: "4b689bdc0cb6f09e0df239fa510e92163504e2ad6ff0462e81e13e79c7f22436", + m: "4d2949002be3f70213c19454fbdb99b10666a9c988a525e53b2b2ce55021378d", + signature: + "72044bb70ae15c354a99a75da51b473150d66bcae10d1322f0fff9be27efdb21770931531c80915ad63167ed23b5674896cae558b23681b80c911775492fa390", + recoveryId: 0, + }, + { + d: "72e0aad552b9bd5420c56ba3f0f6a3ee2b87669c71f229fc926deb2f8f80285c", + m: "7ce1a008f7378f52887a3e27bca44c940af0e503107bcf9f16000eed1a9ca926", + signature: + "1d0a4949edb4a61ad2c5cf61edfb0feaa08fa934fcf2ac607a4687b24577ba08698fe1bfca0423780e527288242204964c56b953f397e410c9f5a6bf5d2a7043", + recoveryId: 1, + }, + { + d: "01157abff7cd94e02688c95423afd55c8c7e808ff6cb15fa7dc5c26db7669192", + m: "22cfa6993e6273abea9fb0493e8ab55488afb40e4cb174bfdcf47fe422dfd601", + signature: + "cf2b97def29bde81161c64a0ff8a088f18daf8078ef6bb57e41641d6988c15714ef9ef1e874ddd979b0cbecbf75db4d0d05ff8af8150b55cebddbfeb1f40ef62", + recoveryId: 1, + }, + { + d: "52913c795a7b96dbc3b54be0311c07bd2541312f4e7f0dbe7e057bbc7dfd49d3", + m: "f0164a839c46ee7d89c4811fb983834f4673143bb41fac6a331945e4927644d0", + signature: + "84ea184eb84450e1dcc950de6b79fffb7d3c6737fa84e1d001d27c3362bf2a335ab558efde1f751032d0b14aa1c1deae733c832d24339013fa5926bdd7a0d64e", + recoveryId: 1, + }, + { + d: "4f689b63a21867dd5362ca006b7fdb625643da6f6ba4c374243cdb4bd8f7fd23", + m: "9e1007495164ceaeb325583e3b7db91756817fc516c3197339acbfe02b566889", + signature: + "893650695eb1df63ab381ea3a17ee4653d813de0b07ff84e6acfdaa31878bc81746fd94828cfc8dbdb2ad0f43203bfd1426cf578e13ceb34aedd362e32f7eeab", + recoveryId: 1, + }, + { + d: "86dac067d6a9e8de27a30441f3bb7d0d7f7a7a81c05a4172da15e79c1cf40368", + m: "6d5e2645bcc66826e881626a1d738fca14401f91d2d5597fbcfd6fb4a9504be6", + signature: + "5101dd46399ed5ac66591c2c090c7cb78f1d068c84b3b9e0c18221c14276bf3108e4b537e267a27fb72d1b14c5cbf701f71aa79a5d8b6cd2327927690676491d", + recoveryId: 0, + }, + { + d: "2f2036fa322fa8111ba01f0fe96f6d6a88bfd974ed7d67f5644248d129bb2777", + m: "6b70342a68e7f1e6576f0e9f34fe4820af90c1f121356fcb23deacbbaf762217", + signature: + "cce43d616f48428b96c9218241b373d7d28ac0e29ce095d0ae3c0f10e1342aa44c2d3292801b0b0bda04159560e912d46363aa4aac45da62a56adc17d8b88ece", + recoveryId: 1, + }, + { + d: "15427042f42d7e603131c3887f067cf292448db61dbf9d38e140ab2db47eeae5", + m: "a13136d1acbf1fd56a3ddd18e1ef9df2fecb0dd45eb681ad56ef26608d7f817b", + signature: + "ce336e7b512de6390f2cf887c2bc889148fb1377dc90b4dc3b87567ce19442ba715e6e16efa96a93aa957b54ea5152e2d79be7b94aa63881e47e9a434ba8c15c", + recoveryId: 1, + }, + { + d: "053881120d4c70ebc2694c272dd15dd819dbc1880e70794ebaf6c4f73fc49610", + m: "959513634c2551370460ef65b7566e2c7e357d26359aec0c0e1cd5c294a6e04e", + signature: + "7bad00d9f2b74909ffcd44338bb191ffd18cb41213014362bd28435a9a32feb058f748b123b00a13acc6631c847b24825997e5a90b044dce665bad1457dcb189", + recoveryId: 1, + }, + { + d: "bb22b594f049b742a427fdaf5c8ab76f0e0efd7681ba432003b6dfec4c3e8d5c", + m: "928c77ab606accb5efb3169154b271d1e3b3c46b93e0bb2c273650a6c634962c", + signature: + "09c4bf13681bc980f4c5a95a596572e0ccff74ca654bd03baeac519c295911913844d5e9b51547113eca7ace4c2af6a8fedcbca60371690223c73a25fd5ae448", + recoveryId: 0, + }, + { + d: "66a85e74d220b7cad2fd40c323784fab6a3a6624396e976a22bacc26f8b8e876", + m: "1868dffb44563492d941d18afe5d0b4764643bf8c302722a54935a40cf9698f3", + signature: + "7ea5ffb3ec8e8090ca4606218c900a30f7a8967d2aca80ad93c5fcddd9b77fc10c5b2cc6088142a79476ed7c4ee52823c59bc4568b28c770c094f954f187a061", + recoveryId: 1, + }, + { + d: "289478aa821ca7ccec959c94a2123b027b3ae76262b04de42b24949815fbf025", + m: "68a694b32ee34a215470476aa37def112590bb2f95073bb893caf862fe7cf7ac", + signature: + "9df19a29cb43449ea4dbafe793bff28a2133fb5f2b17a2c0fb01c48f19d20f8a79e34d2ffc1ec6543ed05b243690cb48f22dfa28ead2b66659e02d64207b69a8", + recoveryId: 1, + }, + { + d: "66d1db74f398c007dbf4ce86b17b64dd8b73b0088170378bbf66cd2695e90106", + m: "7f53d9210ace7c0728749c8cc4cc5fc027deb56a04cc44aaaa0fb287f0d5045b", + signature: + "07d29327e40013fe4614e69840319776a49c6789213bc7b97f4db4d1505fea0622d242bdc0f0e1a75e1fd4345bccd85cd683b65e7747d6ba209ac24e89231b11", + recoveryId: 0, + }, + { + d: "2462ef17ba9f63e8f2645831b17a4074a8550233ca2e530700ae847631516540", + m: "42f4054f09ab4703792071b1dbef7da8c09da40a4976b6702ea5cb9a3ffd7493", + signature: + "4291a5ffa1c208edff23e2f0b6d87c3452fc1a234c607761be208d3f684766bb409ea82b630f347cdec778b4602d9fda6b9c586b42bc1a03ea605c2324fba197", + recoveryId: 1, + }, + { + d: "b7f17eebe47bde0acb8f790fd7936b5933ee9e28d2fa3a992fcd564801a37665", + m: "dd19428c51489ef9b4bbacc4c9ddd0fb832d4d4ad1f2079b86cf650cd45711c7", + signature: + "a22f99e315875c4371f60027ccdd07daae29f3bc85ff6f0ec79b011573214b463ffdf97b7f9b264a46edb1f2c9a0efb1ebb9c378d3bf628d00ec29ec92f30d04", + recoveryId: 0, + }, + { + d: "944826a0a2090d26a14dc395b8b767a142695da7c67818ed63e4b3a2a9508f80", + m: "88f95994414d9cdcdd761834def479287de8277f6205d34a491f717d52fe451f", + signature: + "c4b8932d527feea1ded00ea7a8517d0b54640000dfdab8890ad7ee60835cd66a44e7c29b4a005f7284cdfed55592f7d79e4179506ecbe8ffeb114700b2e0c93e", + recoveryId: 1, + }, + { + d: "2e009f132846d812bebaea852197036892d68353c945b8754503baa0a2d7d04b", + m: "634935e4a98a071fc74cc43d6b42baccfe52bddae8945a84e5623ced32c5e42a", + signature: + "7771d3ba4768d2d3cbde0769dbafee00acde6376a6a83b61ef2451151581eb5f740d5075f4e38fc0b0bea328403c64ece5e9b203069138bc7c8df52b6d064d9a", + recoveryId: 1, + }, + { + d: "c131c7dffe45144d31f0db51d8a2810c239b39d4dc2fc416c3b5775b00543a4e", + m: "e2f0d2d3c4c2e43b39dbee7711bab15520f6fe96533142e23fd66c800fd6055d", + signature: + "ece41947fce42fb264c7b1b4e24828cc4b9f8f7b3a87cc12abd9613f27b89a452d115071024d5099d92457605616406b033004d8c4d68b939a68c1e49baffa10", + recoveryId: 1, + }, + { + d: "46ccfd4be5c617a9c84271c7c90da700cbdbf4c4062b80b43ae4e05e1cfbf08b", + m: "d36a80bb98c22419d63f8cafdec7352bb2c3b12ed96b02b01665f38359ec556f", + signature: + "c068bdc4ee45e981dfeb79e2c70657163039ecf7aa06bb0b559efe4528005d9a57af203d773b2b3802e7b442f56f75a4c8bcf53ae50f9024dc65fe9db605b660", + recoveryId: 0, + }, + { + d: "e9fae6f982006d4286d33d8b1cf5613b89d969335e6927c0f3d42c197a0570a0", + m: "9854debc532a621412c8a385f5109eca80b880f007cd04bef2391c3091703639", + signature: + "21d267fb73da3d1a05804b710a5ecc04493b617523561fe365318839ceb9f37430471b9ec472c7ae7629c711bb9f87d66ecfc072966ab916f9fc20b6a742b9b4", + recoveryId: 0, + }, + { + d: "2e4a81121a8d569e3209b732b75c8df543b013ed37915f17376d2df626b34b8c", + m: "b30c3e12980c2fd1225a661f5bd2b6e36a277d7bdf2efdaf451e59a088108ca7", + signature: + "480043b16563a33070300f91d7ed094a12d86110e3be93ae3b5c49ca41d272b7244cef112153573abe3a222ea64b1c84fb2f88f4aca5cc71fe65b4c454967b1d", + recoveryId: 0, + }, + { + d: "a72491e550c4cc4c039234e20c237b0c9c28bdc1ce9284352c1d29952f3ca759", + m: "046d3fa9ecdf2fc2dafea4d74d6adc953d224cf3d7222f87e76bc8180a4ca4b9", + signature: + "c5d736fd3ea89978741ff0455017e256c105ac2cdbc205b2c1a65fb0e3d5fbbe78c6e6da0b4705267748f7dcb168e3bfe9794d00ff819fc849c9aaca4bcaff05", + recoveryId: 0, + }, + { + d: "d9092a07094cf3b45bab57cde1d96556cd7fbfc4c1967c3b7ba1fb17a53efc00", + m: "c86db7c8889f4f0a65062fee2258948f155600ecaabec767d27fa5526232c79d", + signature: + "5fea36807439b4afec81e27f78e37ab64f6ee74d9104dfa5aca1cf6f846c1d2c395755da1c91fc20d8bcd985f2793077626e263c39f1d11e0a05bb95b252ab1b", + recoveryId: 1, + }, + { + d: "eacef5f48727c7184cb188687b9600e84f7028a9f92689964cda9477395b0b0e", + m: "a4dc9308aaf82ded6e5c359ba0102467b6bcbe0d9015dc7658330161e0b7832e", + signature: + "510a948662b60e1a36e1a62d9da5929853a4f783ded05d4ea0f37e544bea25ce5434f98c23dca962c2995d6763a675565d186233d6b1dd84017739c0d11b2c2e", + recoveryId: 1, + }, + { + d: "fca2c304f06da8f9d983ecf197b2547b90508bd87c1b250eccdc55beb09bb034", + m: "18e1ea0da6935e2bde49e4da299e36479130dbebeb2a42e848896f41478dde70", + signature: + "28757cc63ea8ce16d25884915f56e8b06e6210956079dba3a5768a62661dbc311250f51efeeae3520e40f77948a86f7301599024c3d96f23dc5b2d5629d32578", + recoveryId: 0, + }, + { + d: "053bbd03dfc9fb00ceea144adbc09fa6f01cf02ad34754fabb413e3b715a21c0", + m: "f60767d8c48c1af12a0af916fd9d95f04ba331ad7ac875ad22c94727e047e4ab", + signature: + "5681f0179f6e7691ebfaccf9568225560733488b6fe3ca4853b10b809a8f547f7e56943011df88b0bd134779663b8b92ec0972da518599474f2a1176f58bfd59", + recoveryId: 1, + }, + { + d: "4de34e338694b979c6ac6377459e027d7efe87756887e9bbabb7e1398e3a94e1", + m: "6fb040f6eb693a5203b0a6bfa002482f4c6fdb8a6f40012415d980c1e2b79676", + signature: + "38750dc3b144fce4be0c9f46a248ef5a0fb626668b0f45f83391ec7bd56cd91d6d1e9f3cd88beb8396a8af944b8f2e631ce22e8b65a4a2c3b7ac1ec2c37a7141", + recoveryId: 1, + }, + { + d: "350ee0611d7679c9484bedddda8e51b858ecac4bc4e4dbb566eee51e30237260", + m: "280a4f2707416a5eb0a324d0f522bc6ffe49dd7e9bb18992a11a01b663546e77", + signature: + "6b712a34c40e4f88e9a25bdb29ef20e402fa3f235e9caaddf39a09010bea5f505c0e6a67c858a95af3ef10182a5a106d47d9e414994cb78498533d62065a5959", + recoveryId: 0, + }, + { + d: "e77fbfd999772a0f2b6097f45d79cdce90a5c9ba9bea8a63242aaf5d15f243f6", + m: "5a8aa22dbc00d943d2861624c8f8934824871def0a836517e7f43d9f2736f51c", + signature: + "e7f31b1dee1da41882bf104f3b17fd3da9ecb336daff764aa101ef7fed0e624459856e98b2eebcc271bb80f0c46011177e89e0137bebb7b00c15507663f6e41b", + recoveryId: 1, + }, + { + d: "ec9d95bc1ed4828d443b4bb91fec22c26b58c2f76050aba486f4b26c432d8342", + m: "f2d806bb636dbeb8607393491e62208f068d57192a867f9bb6f27e5da7fccbde", + signature: + "4d49c9d328c8ba6fd1c85012415fce2a489315d2c47b162af3c936c207547bfa0287ee4764bd2c3ca6dba3fb707136894a2b855d9108390d1f86e56c75b77550", + recoveryId: 0, + }, + { + d: "78fb5229080e11425e75b2573466de17c6fad03f377fd4e8425eba1057f710e8", + m: "846be87b893f21b7346584aa035b78f184931cbc1829cc002c8fd5d808667693", + signature: + "d8b1678d5b47ba282e82d99eff33284b716cf3f264ba53515e6972efe4a99ccc0af562908a7b95e00929764c5425511d7f84f1f9facda460613182a6d0b532d6", + recoveryId: 1, + }, + { + d: "a3f2a1519d46484412239c20cfb5a88921a0ec2e3d6c83f1121cd277b36efcb8", + m: "8e2c0867f06739d2380913d8d2f3e7acde266678e7d156ac840048b20df2b93c", + signature: + "d293bc235772da9e7b008e0cedeac844e92f296a37dd828aacd5caf934a4902e056c5481d2ce0c9ed90e3644bfad1bd023755169ccd850bccb0998620c498381", + recoveryId: 1, + }, + { + d: "c2dcf33d3cfdbe886531827d6fa95eb240094ab8368c23fa2065f2cd53978dc9", + m: "5303fa2d8155f6c913950cfaa84b47ccbbc480a3867d83d526595e8e5190aae3", + signature: + "4dd1d7fef166db488065f43a47d9c383ca61b85e95516a1047bb4dde72ec62154a04133ab54d290bcdfee02e1bf05ca517b2ccbce97ebb58969ec0f4ed01fca6", + recoveryId: 1, + }, + { + d: "26bb6cb63b24d3c33dbd7f1cdacaaf0b6e6de026a4eb24b0b001c1176225eb07", + m: "3bc899a037dae46e5c31921a93d89dbe801cbe5657f64616b970a246925e2665", + signature: + "f377aac0cd3351125b56ab951ecd145d5603cfaf84889311f8a176fd947f871278810aaee110ef5504bac102bd288f392eb2786cf24d19d936367314e30c34f6", + recoveryId: 0, + }, + { + d: "31206442e1e9e74e2b9d80bf486b4f64f39cdc86216254bd18d3d5fe5caed9df", + m: "1ce8cb6927220f839231b011f82326a2a1592990fedb9b2fda81276c7f2564d4", + signature: + "5a8285d4b4f6ebc7567ee50216cd7b5edab8aee957c9331404e5f9ae4c7d3c6f76ebbd9cd6fe3045512f11d4235b4520cb446f42a5ef22ed20f9c34b00950635", + recoveryId: 1, + }, + { + d: "60d891384ac19fef2a19e6cbf3879c0c86b29cbb538e3d8906282f45ddb4d80f", + m: "6dbeb911bfb58c49f8e20f2a9c223c7000eaf884ddd08e33e5d87a870dcd77e7", + signature: + "6f836d579b49391df361a7e35a4fa2326907c9930cf8133cb13ee8c0b05b7fee0571e06cea32c431ac30b1570bc295f0ee37a9a85e426322ef12661397eb08f8", + recoveryId: 1, + }, + { + d: "58f7e481c0e207ad51d99e80db8c25223fb6ea0f693ceb2dc9c61a978e931098", + m: "5e3419d07b283a24e917193bd7e05d3eaf14611bc6e77e9e46a96fc098116212", + signature: + "e3e93596f0a08b3b13707d3cda06ae90bc59d4e7703aa652d7f47c8c9ccff62402549288b8ffc8f489191691c9dd2ec100e5b356f54ad3b8e03979b84a69e3c5", + recoveryId: 1, + }, + { + d: "03650889d85d2c897e0226cc2d9a0862a63331ad15328b12fb31080e9eb3470e", + m: "8557192fc57239051161c6f44cba919d9a0fbf92cda2ca001323cd899e788a5f", + signature: + "06e3d263c4397fe8395ea22f34c3fd2071c9f4a4fd47eab7a3327e4bfb134b5a4a91b982d356305a241d717dcefbfe36d911fc51a1071a2b39541eed4c314299", + recoveryId: 0, + }, + { + d: "3ac8a58dde6f16a5184747e3633559b33466e107795b8a24cf57be8ee374ab54", + m: "4cd5a38d5e9d9be5c332634028f3bc35b72a810c0da37938cba94e465e162a55", + signature: + "e1a9fa3c05cc8eefe277544dd2c2c53e1a0c17328737d02b9e361ff29197d32739201c7a946c22183e541be45c347a723378ff565ced25fb08deea88c03c6e79", + recoveryId: 1, + }, + { + d: "af086e069912d8eca77647a713bbdef46cece3138d69648c180a3699d31bbabf", + m: "0887f23507ec849fc9e8c37fd2cd1765d3d664d1f7819b61538c6badbc569c95", + signature: + "535389f91975b357285e57744bd916fcaf93753f9ea20868bd2e0c1d84ad13cb1c6754db768328cd287b0516b426e0e5647af664b09068dc40b83f0efae07a12", + recoveryId: 0, + }, + { + d: "3fe214f784ba890bd4ce51e79417f53095dced95c6dfd7f4b05b2398b6e34ac9", + m: "950caf03690cd0e7d849d5e0f8f61ad7c25b80361711bc5db84adea9e673fbb3", + signature: + "51bcc28d992b2e0fd96238b88adecb929b677d8b1c3510e2f3e9e60f9a41ba5d6b4f0e321934426f5910ed7c9c7b05fcbc0c2e814cc816021666ccba2704928b", + recoveryId: 1, + }, + { + d: "e9ae210baf55ac4863a831c0743428b9bcda6bb83e94151de014bb2498801bd9", + m: "da23068502c22b0c6517bf195dce2af80db584e3c1c2cbec0fc153b40545e9d9", + signature: + "063273b0a32715cd819dc9b13e8b872f7a4eb9bd8473509cb3b153ac796aa6591ba652dece942e4a0a01208400aa723c8d22e35dc4fa5fcc53aeeb266b42980c", + recoveryId: 1, + }, + { + d: "2527ec1a09fabca81d47ad59d1932b5d18a12f045c2e9210888f4d586acf9599", + m: "7294aa6a15b373aa8d9929bd3177d156d50394c6b935be622e93c7b19b3a431a", + signature: + "fa6dffbc6a603a72e4fa75229a0b5800f4d3b93a80691e6a934f37eb0e8c76b237c4767576e173231cd3e26353e3ea9a019cd2dbffa28acc7fde6a74aa066b9c", + recoveryId: 0, + }, + { + d: "6639fccab3313f5feb282c1493eea926477a14c6833ea80345ea035c08586bb6", + m: "02fd4a82a7fcd06619b3874824bd7597965391f5fd5e539f23e3d9a1fc58c748", + signature: + "5ba8fd8b7fd6ec62d9bf94cf47e85262ce71330c3b3d0c3d309f91ba21c4a772152000a4a01710a09d31c4e7ee741202e33bfbd71165130fcadc41fb5712b005", + recoveryId: 0, + }, + { + d: "8cfb48bc0f7df8109bc2ae6949e4f17983f64f5a651303b62c78a7b7a5098701", + m: "d3c1c53359abd8b6cc291fb54adfea1e87524157cab8cab94cae34e6c97a0990", + signature: + "1129f1f83eaba997254d027341e10ebfae357488d224a5f6758ef72eb56bf54a7dd11cf493ad7cef4a41a8ac9d0dbce83e4ef5cc8fc2daff977b6ce7f0f49007", + recoveryId: 1, + }, + { + d: "b1c85f65a38a53bf7357cf8a1a0e980179e092e6b596259bf34c88e0ea0177e3", + m: "bf31f7808d0f180d473ed28362b45f6dd1e5be936aec67f2c100ca5e7a758293", + signature: + "4034daa484b01eec1b2ccceda5ece6b13a44fcfb3a5b2a9452871c46ad3b948d410061ecaf218f4a3ebf0eef4118cde03581ee84850ce7a5229c445d2c519428", + recoveryId: 1, + }, + { + d: "fcc80465c33a626788dde10cdd774b92e241339ce5f10e0c9fb4dfc2840baf68", + m: "ad10f852865620a919ca4964ac17c22cea249d5abb01cb7cdce982db60b00861", + signature: + "c18768f3abd679916b714535f5c36a32358d33693bf49364bf3fc2553d6e5e75509c768aba1181bba9f72b44208e7f6c44b0ced913076a885ea0e2270fb28764", + recoveryId: 0, + }, + { + d: "884a5ff4dc043ec49e7760c6c0c2a76a3aec6401e26a96b56de53c412ec61dea", + m: "b0790cad6101c597dc7ffe08c56e21881273a43e2c230f67eb59dbf8560f9159", + signature: + "aac67dd1e4133f644fceb81c55ad8eedfb7710b4a0e4f861a483492b3335f66f38df266497f5114572a4c4af2bd036cfb7e763c07dddaf6e3cd7fbf346173d75", + recoveryId: 1, + }, + { + d: "19831ee2a71f7119c08372bf0d2d29a88e459c6d450d5fa9046552e47035475b", + m: "42bcb1234a9e23abe9dcf25b44479d666bdd61f50f2689b403fb319ad3ab4572", + signature: + "806c7586566c7fcca994802b11011fe189d126df247f00d69bc97465a1e0055a7a8b3ba13e32f2cf51f779b6a8ff9dfe0e14f3ccceaeb91ce7f5ea6663d2f7ab", + recoveryId: 1, + }, + { + d: "80f701eb9a09d5914e63d92f8b82592cd7cf6d433eb144878d4c4117beca3856", + m: "727c889aab86fd8b94081dc2b321352005c8e73576f162d45295528f31321a1b", + signature: + "4bebd4fcb8b71e2a738f46547bb5fb0cfcc1dcd76fdf0a0423810f3063d960e767346c77d90ede58d1c610f95fc079e4b579b2584557eae5024ecbee78e69426", + recoveryId: 1, + }, + { + d: "02d3d63bd9590866b26e27320394076e8ab80f8651c74fbbcfe99b3738f07074", + m: "8d977fb56301209fbcf9ca96519adbda6020b86d0a1ed9dd15123e59b6ce3c06", + signature: + "7626d1e37f3874d7f7adc55e79f4ae36514be7d377ad4e32d71e88e50ad2dcd675298b4f1605bd977f0b22f23bcfa0341afcd2023c2f3988dbe00f211ef26ff5", + recoveryId: 1, + }, + { + d: "96041626ecf8408d09419c73398373c3a28de2e8dd8a7e41855ebc12a27c43bc", + m: "be5232c5bdf2166a3c54e295aee8be2211407230ba5322c9be059f11d8fde43e", + signature: + "cf7d8edbb6647d7be5bc19f40b5b29c7b2783df3cbc136ae29f358632fce03781cb56584f54d01668da32be3e0f8938c841c5504d987e96b9cbb3e41dbe97af5", + recoveryId: 0, + }, + { + d: "6a6fc61a4fde2f35250e4431f29dad3bcd39990baec8b85eec30856501f0f136", + m: "b76e11c9253a22ec29375a8ede5ff8e53a4d89003b0081b67cbf64988bd739aa", + signature: + "7a1f34a829bb87db65d626c4e07b17d56b2c5a0213e602ad2ff5f44acde903cc23ecd781d0276d2fd291c4d1993b2d3b1f2bb839c226cbf9a9c46595611f3499", + recoveryId: 0, + }, + { + d: "f460db8584b1baf57ae1f11b4402544e333ec4ca7ffcf94dd0372b6aba86a948", + m: "7466079ae727e538f6fed3919dba73af212b29363aeb74aef31666e52a23ca6b", + signature: + "2cc5d855cc22f46e181cf2108a2969d97229e2c67d4faefd5b22036733e8695032cc0570589dd59741a2be06233719cb54b627423cebf48b5c21b9f153f90c23", + recoveryId: 1, + }, + { + d: "a2104b58346e57ec8a4865428fedee147001217fb1d1e87de206538a725bc8cf", + m: "5c737ffe07f83ee6c33426c69d14c6e70ac90272c4a2345b11ae15a508c51598", + signature: + "4ceb4412778d1a2382051ddd15be034ea39bb5232e08ceb4dd438d5e8c89823966ec9b7d2c70907eb98b1c0fd8a24d8d1ac1caab130c1ae9847575c1f0442959", + recoveryId: 1, + }, + { + d: "bd148b18c4ee9ed726c97ddb17a4b2256163c24ef5f704d60c8c545f13893b9b", + m: "5fa36b0176070082f5792b4ef829286b4bd1b71105efb667d409b0a6bcd762f5", + signature: + "f1ef36167da7df20d0162341df595e636d2ecba378b891bd9a7eb452c16a944953bb7f4da72b505f8f2b7a8fabff5de53f7c17eb5074d2b44f5b8a12a943012e", + recoveryId: 1, + }, + { + d: "f831a3fea73dbc975ab3a0c4a233de2a976f24afc1b8bb93ab0740b47b6760ce", + m: "8d89b264dcbb8a749e6f4517c9a604948d6c930dc1a6813ecb9479fc51bbaa88", + signature: + "8ff4d59f7fc6e36e61743afac7135d4c7fa0b49c7ab79244841118a0aa555856590dd3dd3ef27e9909c009d2ab3fe9eee0496723320daec752390000bbaec6f8", + recoveryId: 1, + }, + { + d: "8edbb4af514de190a17bd754d5d474379b7133d00b38622b891cbd08baf92728", + m: "22c630f9cfd18b3cd749b102cdc320354372f76de335452bc3e3a8ad5a4c9357", + signature: + "f579ec6a2b81757c7e415baa7817c90aee9553dc371842bd3891330bdb9b67e72bbda44229925578101f5ff95096f5e1bca847f1e7978d2b0a3fe2544a3800d5", + recoveryId: 0, + }, + { + d: "9bed9be29df856dccee7ed27cd0a6213a387abe4013db6463da8e5b4b70431ca", + m: "e992e34cb74f1ba7cec12805098b68e21c59f512d447142d2f2caf92f0702d5c", + signature: + "1e07c383dd0a62a3567d84bb06e409fd5896b93414438de9691eff31d529fd22528f674effa509756691887a22cc959c41aad03f012784b78b07c9c770ed1515", + recoveryId: 1, + }, + { + d: "126ecda4e9edd4c63cb7a283c90408ac06590b2e7f60a926306d1853bea8a5a7", + m: "e616057f40d4bd6b8228aa77c0b7cc520847863ff4d8b9c98af0a18a03a3b17b", + signature: + "1812bd7a981a5b6e95b9e674f268cf3bd53afbd0c86717d883b86f593f80b7ac7938e87d8299caae114cb5ede8d996ac622fbcb5628d0f99cdf4603623ee1c53", + recoveryId: 1, + }, + { + d: "1f8563ec0ef7157bd5976d8edc65296f65591581366d6c3f1f5b4981db5b9f76", + m: "4643eaaf01f8eae80c4bc31c1fcbd10f31122fcc97200ac29e4c31465376675a", + signature: + "dc6018f59067a4f6b62af991ee615b8d4cc8421b6fb6061e2bcc8cf963739daa40a86f35cc679bf46afb994ebe8770d001c819a52870cb51e0abfa353aa2ea15", + recoveryId: 0, + }, + { + d: "f1dc0b2980d819dd6a13efa212e7318b8d4237e134263269042a673a1b2610f5", + m: "1c22a3ca2de13de78ce150f8c1d90742b26fd7084d9e2842de76e387ce750bd8", + signature: + "5a89f648d684be48c63a7a8c1f3a258af7cd8e11bb7c0549c13397615b92b82413432d4d8e112ac5b7ce04d253414b6e4ba3cd7a82aa8891b1f0d783deb78f57", + recoveryId: 1, + }, + { + d: "e62c1ff98d55eca79b1ccf2f25b1308ae762fa7a61ac801b88904b1a0fb256ef", + m: "350af8f6cb972693e823bb1599b60003d46e561e3d2f94df5d9a72dd025cb5e3", + signature: + "e2b0bba566fb040ecaf707c2f0baadd69c8a2c76e7662d97b57bf25ca4f015cf0df0f6f4886e0d808f1437bde1aaf89e98bc1fac937669ee11f0ad235adb6830", + recoveryId: 1, + }, + { + d: "ddeda82b352ea9255014e7c14dd92a57a839e8cd61e94cd58fe78731253ebcf7", + m: "2a7a8a031d3284c166e9d8c52e169b307117dcc26add3c1b420f3adb7fbd4699", + signature: + "6fe3c2d5eb477df3721c1b05c87e1c246e23b181ce5be75578bc2baac98d6fe45550b9d6934bf1f1bb82dd1ce4e538c11a109a39950a416b79f8d86b2cb753e9", + recoveryId: 1, + }, + { + d: "29b21b4b5f46fef6eccccfec71bd6b73d8a84a2bc6b7e69d3583bc3c1d7b71ef", + m: "20a494edd0901ae7dae0cf95e9dedb54b31a42800ecf5bb06c2c1d93b0f18fcf", + signature: + "148059217f4a83c45e7970a4d40285b94ee9a7f65fb14de8b0904519c667c3f9641ffdc725bcf979d15128b75d3ed3da3064656b15570c05aa6e1fd7e372ca3b", + recoveryId: 1, + }, + { + d: "950f530126cd2164deae9b8f17ad85b4aca58a8536035e7d6bb65fabbd45ee5b", + m: "8b69d3daa2b2f7af7c0241ae8c302164d73412ed2324a14b4acc77a5d260df4b", + signature: + "515716f98f9b9f16ec2b955ade8bccb1a56704fae3f302b284345e8ffb225fe77f0e303a0fd6824945e2af7f99dc0a38586cabe173898252279f372a1d051fcd", + recoveryId: 0, + }, + { + d: "49521aee4316324380ad5161e1089fb973c4c41948bfca8ab3a5313a92b97471", + m: "166d8be35d7a59e8c6cf3f593d45d614fce86599180a76b45e8841e70e28a9e9", + signature: + "46abfb74287f42f92586a46281259edcb3475957354dc6038e1338d7f4fbc4246f858e71e14a4093b82ff2ec36e7b66d615a3615479115935d7ddcb5e6adfca7", + recoveryId: 1, + }, + { + d: "146709c081ae329e905861f7cff25258130438ee5bc3916af67be266b0b3a3c0", + m: "50d2fa8f32d3866fbedcf8b7107b4c8f321c8f776786dac98725dcca2c1bf027", + signature: + "a24d6c5bcbb469b2befae9d99100845f3e5dfcb3f332c402892995bf4956b2b657a39dc4d14558b7ffe24dc6fbae52bd8adbf404b2d69e682a8787e15d7f7001", + recoveryId: 1, + }, + { + d: "3fb850582f79f18001409299a3dfa9252be5c50b630eddb070795d5df2ee3b16", + m: "304a0da789090cbb5dbe269a2b6230786a790fe599cae406df61c245832deada", + signature: + "de18fce0bac49fb99b36ccb78a431ce5edf6e6a2eca538c5710e13f23c9ab8397b72e0c6c55998def951bee9d484c632270079c9e3c18dd9178935870810b378", + recoveryId: 1, + }, + { + d: "3585d40297286d3da0d4109cb5bc6b6bf0b0ee3cd93fd0d8bda40ea424ae3de2", + m: "cd60cfc2bc37a7930ad56430365ff69a96dfe9b230de5f6465ab69b1638fd1ad", + signature: + "665124a469f6062354533bbe30f9c5cac2a9ab39f428b04415eb31cf01acd08d5df40c9e69f1092fd17b3d9a1c7787d2299857c04f60f9b3f558d7e79b8b01fd", + recoveryId: 0, + }, + { + d: "75830158128cf66b1ff5e4956268b9f5e0970576428604e703a5c004b33c9d6a", + m: "69f71fe044dd1a691f3ac49a1eee9ff8c92637226c9e4c2791b197cc5da8173d", + signature: + "bc2b6bad23fae3eb5059b449575af5d447174934e3e4e60c7474f7b155b80433110e77e718038c26cab84e272991ba44d2874289601842976b2059cfb230460f", + recoveryId: 1, + }, + { + d: "4a571e6ec76ac8c4359c2e2724558dd9af9ddbaa121312960cdabc6fcb19a3fd", + m: "dab738b2944aadd2d5dceb9e82c68632355c6ebdda055650d97f2cdd2a8ce739", + signature: + "62aabcaaab549a0f4cc335fc403161c5f87f3ca383ce7ffa0b0431065e25a29e4969da24ffe4155c7c16aa07d1513aa99ecbd563870f960ffd67de63a206ffeb", + recoveryId: 1, + }, + { + d: "db970d44d28cfce44b2995d8d4d1d4cd7339552f49a86ee9bc9c89ac59ee5132", + m: "cbacb0a979e13da01c7b0ab6760c2c7b1e78db980f3247adc9e0a02992da2bc4", + signature: + "5dac2a1bdbf2cd82d15c42f0dbdef90490e1ed82d2f995c175cb7adcbd17be7654bd0be29cf087d04782573ebc7a5b87e91372d950a470717ede4a1ed4946287", + recoveryId: 1, + }, + { + d: "79531edc89dccb9ee55f73532364aba41429b23da23ab5876f4fbca3a3e3a181", + m: "554ab2b3543fdc320eec9fce5eec1a47a0c40d8f42a2f2f97a78738c88f3f405", + signature: + "10c2bc5eb38f4716c51ddc3471fa5d282be000c345794d22aed3683ae99155ce51bc1e25e5123b1d4a8821b943bff6fc54188c734d1b19e3d858acf21dffa1e6", + recoveryId: 1, + }, + { + d: "6bc7953e68c75483a97423b40013258b140086d36ad74c1271f02d020c5d8719", + m: "37c08e2b87c757c22bba5ca642a173fc7ea92fa096adbe04d62150d8564d00e2", + signature: + "739b9d67753d833817a6651a12fff28e5a6bafcc4c72be61721c91f75574852677bfb76a473fa2bfe1fd9026e01edcb3d8e453dac5be80683f1df0bb3db65849", + recoveryId: 0, + }, + { + d: "197bccd00a2baf2961e5476d17139986ec715e6f6306466d24faf91f596e1634", + m: "a0c552748915c79787874eec37fa2dd2782cc9ba0c53f0947532b38d6119bff3", + signature: + "9c55de6edd9ffb41f8d42065885e92b6c748710c0809fb3cba10d0b5a8f4975740170e1e78ca4f0fb6bd5d783225fdcb9f9e312ecdfed3041d1f0f1dd06c09e0", + recoveryId: 0, + }, + { + d: "e5209af51d3511a651bc32d1526d937687ec1463dcd7a54e78031f338d45a341", + m: "36fa2f4c2b717f03677160d32c4f7996ab095e1a805a5433ad50fc7909ba1e14", + signature: + "3bf6c0278d912824a45de6b14c235f5bd2b34fb53a7a24ae3903332b2cf5dcb804baa5a0d03d3c683ebb6e355dab67712df0f0a36e2a3635aa9dee73c4daeefc", + recoveryId: 1, + }, + { + d: "0cdc1026b319794f4008081b4c090c181ef0447d9539e1fa7eac5973cb549348", + m: "80c9fc268d60f5ca95f930cd60248fe35ac6eed63be3cce6f6f35f03f3114203", + signature: + "562fb8945f46e41e7c7707e1c42c3534e090e04906abdae2f590dc295a916f13598506c8c34f925f9b3e414ec50f093b289feb53189873628faef6217065518f", + recoveryId: 1, + }, + { + d: "249a04b84dc7de631da41563665029453f82b4ab6ac69483944d5038bd810192", + m: "e2674c91be836accbf59155cb8b11e67e06e5d95a8044fefeebbac3f2aaa3c6f", + signature: + "f5633778a883c5aa2bedbb419d339f43d2107a6c59287d630d3183b5f2dabfc92fef2a55209c5152bd74f8d91575ea8dca9a277a3bba5e86ecafdd96e0f007e0", + recoveryId: 0, + }, + { + d: "43f1c6d9030b7a4e2368a9ae7b7db324d2b097563cb945b6189d2ac86a251066", + m: "a94c353647d209b406509f77544bb7d21a2ce25d65de2f2a8749a0e74202ee0b", + signature: + "6d53cf872e0ffb04cb2476b5d72820d14010970dc5fbd1e54c3f72ec756df0a05773112358f89f2b0eda6a4b57194e3d299ead3f435e4a0518ee8bd1fc7d28c1", + recoveryId: 1, + }, + { + d: "782b2fdae6bbd48b4e60862d903bcff51ffb583c182a1ff0334e409e3ccc22d8", + m: "722c88b7760eee616fea8e60a798c75d91ba97f6f09d73685faf94b0d903bbe0", + signature: + "aa47c05b020e1bcd28474458f1a2833258efd0f5e494ad6377fc8f5f853ebe247593714f69468f2b9580b39d711c37673cbd7d1853ba7475a4699d8d4db9ddbd", + recoveryId: 0, + }, + { + d: "e99b041107ad7e4ab3f538e48e53d995b30f458b9954e443e2ebe44670f24ee1", + m: "da05c069e14861b7937b8e1569c8780a92a68ea0f81e1a09f0368afc920db258", + signature: + "ee957e08de455ceb5c9765f658f1bf4ab5035fb4653c985573fc254d967189666115c50f5b6763c948ecb2cd48b66b78de54be85b96a02829ff11ad5810b85e0", + recoveryId: 1, + }, + { + d: "bccb9f17d00454c8450ec9d1f4c443f27694197a282e06e88795f63a6961ac98", + m: "55757138d2d52cbbe9a4d12fdce0b183496c8c5cb06460bff00d5b2810d7f4fe", + signature: + "7d66c90ec45cc974fd2196442f56ceda526ad783b0685136bef53284591e412f3f9191609e458e8757817ef32ac96f44e95d671e0c5ba2df6e4eec9df82628a9", + recoveryId: 1, + }, + { + d: "3906e0d170ed85d81d2cb8b617d55e98765dadab5dc041d02b3a979cb85276bf", + m: "f6564b7700ca99316ad6b7f346e96c84a14e764204fbed93048ec97dfe4aa46d", + signature: + "c852fcc9af8bf8ba7d04b54d0c15413a9ccaca57006c83187821a7d37951966c057d3d99aec2080779bffab2c9130312df648a521c86953185562ca282bc50a6", + recoveryId: 1, + }, + { + d: "93358f33ac5220ec36f3d899aedbd75f8dd0cff5135b127f9fc4e412741fda31", + m: "5103654aa01054bdef05704276ae1baaa2618bcaaeda3bc34d3d1d1e3773a85b", + signature: + "67633d01c4857e56cfd4a4b1988d3c2a946521be378ec7f15f9695b1603b25c7797d90d068cd83ab9ba96293406cc23ca7f2ab9eeecb1535c159e3d13b03ba42", + recoveryId: 1, + }, + { + d: "a478b4967a7d52e3314b97c5109fcbaf86c4e52352ed91218860c5e420a422ba", + m: "7c2763051e6273524a425b0b4cf25ebf66bb7df0410c626da113b164e4f3c718", + signature: + "b7a9e93067132674b4ee95f66ce48943aa2b8900de89b66f881d1b731e5147f74250892749b0cc3be11403a8ae58b1575cb0fa57e07a57b1880dfd48ee2b654c", + recoveryId: 1, + }, + { + d: "293cbaf6817ed0f73b8a8063817ba0a87cdfdc07df0fea817343894db778c78f", + m: "f67cc1a099e6abbfbd6bc8360bd3b0dda9a2df68aff09cf5bb44824382198aca", + signature: + "80bffb5a20a09f07e3526f49d42e232d6a5971883b2f3025a39291f3f8d539cf3d49ae9cfccd62c5f97a30805544033ba3cba03af084a79cd3bac2469cf60412", + recoveryId: 0, + }, + { + d: "e59480455f4a6cb3334d9a0ad6592dfdecd7180b8aebe1920013d7f4e62b41a0", + m: "5bc72805031c19b71706f5e1b615a3559830ca44e42bdebcc3895dc04c3d40e4", + signature: + "d24a85a855881c790f1d89f83c9a9a0d59b8f011eb82b399de342941b20608953b65455d59d4c5324dd3ab122647f4671005831dd2c1565ae78ca9f4dc4e71a4", + recoveryId: 1, + }, + { + d: "cdc1f0cc541da09d368d3865d4f4a21674c77ed3a35eecccc86bd851b4ef30c1", + m: "2558a49f4ce1b9f1c3a87fa5b712ea48bc468e6c1648183d8a61fb90b2888128", + signature: + "b4967f55c1882ca23863ffe2cd691f9353720444e1f1f859c798c71225d02f611f010c8241f35dd95af1488dc804a4501441c0b8df16a3dfad5c9a739a774371", + recoveryId: 1, + }, + { + d: "d836980d897ead6db86a12e80a13cc06ed2ffd8abe3f403b3a02a566dbd929bf", + m: "56635c20c2779077e5c553ced65cf759c1327a9c8e822fcd75045fde1284aca8", + signature: + "2a12e6f28833b5c7e94f4970b3da0c90b15635ffad76b2c20f30ef64558be87872a2529a564fce737e797276928621cdc1d61fff89a52c2f7dfd58f056df6cb4", + recoveryId: 0, + }, + { + d: "6709326064cecbeed255c1432551c1d6109ef280e52f0d126093546eafdcb495", + m: "afda58898bf6237b160760ca690d44d337b838aa831eb0f7a5409489a8658d5a", + signature: + "00e0c1f8dd1b5c53a0c0b19be3f08cb4b31187255f8f456e65a8656666ce9acf0e9d183717a141ad5ded6f1d2f1cbcce3a9322ba414c2b44f8ae052812ce3af7", + recoveryId: 1, + }, + { + d: "c22443c71a940174165bab3945f3dcae76f0d025cfb350b665d0bd472424504a", + m: "5075072fb773b86b2406bc035592cfdb8e94c360418bcb88648c5c7cb5993c84", + signature: + "8903c6f4fcd7360e2ae91bfa56fbec77eb0bd91b4a7a0fbd483e0aa12a29e78b54b2ec18ab824bf7109bf2c8ebbd341d54e94e14393156340df1cd6417056381", + recoveryId: 0, + }, + { + d: "b9d8d92d65fc8649da27ce439a6a0ebf94db37635117d4fc4bf896e3de45325d", + m: "7d2e06bad8e8f0949072733a93cc042f76797e3e85e36b22107ba19d68a1aca2", + signature: + "2620d7f6a10dd530269708e6d20227e14220864097a41ed3c29ec73d174332fb15db4aa9272bd83af784457a0025aaa969a4e151a11eeb5eb4081dec5c844945", + recoveryId: 1, + }, + { + d: "63ee240038e705ba64abcdc23502197115e98f9fb0ab8671321451e23e5b96d7", + m: "83521449758547f8ed2abae1f85aec39948920a25964eefd3abe1f330b3b093f", + signature: + "f51b52a59d3b85d846c002e190b2e1a38a240c021309262c61be0aa9aa9dad3f7faff886242ade54cc3e9eefead29a0874d322564aae2a8517fd5fbe899b1a9f", + recoveryId: 0, + }, + { + d: "091806389519f5b5921a2030af80e75c898e920db6dc42b6b2f9ade043b45d4f", + m: "58cb9555164ef428f943121369afc27f961e2a75f84caeafa6b82a522f60dfae", + signature: + "e14c4092d0d367dd75cc9c1a488e4c3184555342f5403f05ba99504c2f3e9a2815564f45d7e4111fa65bdd63e376108b105eadc0dd2c0df0b5e581617a931a3e", + recoveryId: 0, + }, + { + d: "89bbb30cfe002c62ee50e402068bb91f16a0a5812e427b992c49fda5324d1d6e", + m: "76383dbb61bcbfd3425d9a06cf89f34728d4efd2f589bc8bae06c017d36b9aaf", + signature: + "9c67b28f3797f197987a666dcbe1efe06f0720d764f7e08247cecc4bf65ee89820540d7cbb9506af1227a0a256ca3b9f87b46ef7ba7cce1f44a4ceccc6ffd8ac", + recoveryId: 1, + }, + { + d: "8f8d558f737eeb66cc8c3b065f315ccc6df40ecd567c25d046e73524c3972929", + m: "a2c3527e5a432e302b2c7b4d0873e73b739b59d5bd9c5dd8cb7b3ecda2615436", + signature: + "6a59fcc05fd6229bccfc2494766c33973792aae3cb0fd4de5fd61c93126187de789a1429197b12b6e1c4191d4f194b0252074905a170d09a80aab07757b18984", + recoveryId: 0, + }, + { + d: "6f679ede9ed329600bdc488f18944e95d4c627cc26ed0d43d4de952507ad9ec0", + m: "6f1d97bf2ea820c6d1cdb2608d1c3c46391ecfebf71e89fb48728a9729ce9976", + signature: + "f57437559334c50f8d824971512ce633f6770fc14e1645cd4dc4e113009b1f2b343d429fcaea66bdc1e146b97a6bd988d0e2db1c190ea7a01157b058b56ecf5c", + recoveryId: 0, + }, + { + d: "38eee969b0398cbc505328be89cad56e00f3f94c02b6ead9d0681f403586136a", + m: "cd283a0550537179230826873eb5418eed3579857efab9264ca710842cdc964c", + signature: + "b012b0a5ff3fe54eba5c04d935f0ee7f658e9db08eb7d09f304ece2b931c97bd6c93eda50dffda0677d81a15da0174d4c9163c40ca2e4e797ccfe696cca8fd88", + recoveryId: 1, + }, + { + d: "cf7a9ebb0464ad706dd257fdc2ed0daf34c0fcb6cad50d7ca151ae98acd87a25", + m: "d1a7ca6368ddd5bfb76cc204b0be969a95f6caa667a89327bc589548be66ea43", + signature: + "a6ed200cb9926ca935655386c2f15e68b1310f67d901135b4b23634c565264a933dc94353120f7f1be2561f9bcc7a645eeb56cf6745ecaca5b930ab799198e40", + recoveryId: 1, + }, + { + d: "5710eb73710d520d0fb8d4804c22b7a8824dabba6e6e7f5d9299cb3775a4fbab", + m: "cd696e54133116a99f4a5c3d73e0e7daa0c5e4a85d585ac9d3bb611534ada95d", + signature: + "cd1df7b183febdaec075a4e7b939286cd036b94a0eb5dcf34c51bc0ebd6861b475755afc5b69d5c18db3bdafc1d7688bc95ebcac1e7a3dace71f35a6128610ca", + recoveryId: 0, + }, + { + d: "9134ce20c6770542b3ee47d9736efb3a3352f6940ea4fa6a6d147287a41d568a", + m: "dbc23ff6a7f0d3b062cec5bb990e3dafe30933744cb06fc3bb58e5997c01f227", + signature: + "af8fb42fbcd0157528efb6303f96f6a1de53c72924459bf21a55f9519c5dae3173b25523ebddbdae2d832eb3063afb37cdd02eafadaa82a98e05be9b7d21b091", + recoveryId: 1, + }, + { + d: "4f32564e2dee99aa520ec1f8f2bb548a90265ffd2d440c6231779531ad008291", + m: "98ac77354ef4815a5ff1b06d31218b31add8d39872564ba5e33d05ef11d1c17c", + signature: + "26a46a2bb01437bc2e2720ad48ae4c8a7df5ff847604603e556e7f7445ddeaeb6bde013a6c683507c2514a6c01be1d8e4f6a8dea1e447b00989d96bf695e5635", + recoveryId: 0, + }, + { + d: "d57ce23000134d129e8a1cb2ba3b092171b98a950211cd7d3baae3dd602213b8", + m: "16db91ea49a84c2e222330bb7aec6b93210423e2822390f5e2b28f004d81d459", + signature: + "dd06eb91be943a89fc34b2b9c87478307c4fc994358024e114ac7e564e534532160ad2523461ee614ee0ac36a8459bb063feb5d0f6a858c37a9adca63d0bd746", + recoveryId: 1, + }, + { + d: "c3d0451f56f2a2afb337d9956de4a3795142316a5e7ae701c8e9c15c61f17671", + m: "dfde8ca025b4a3d83a6a732da0021392201cee2f7861c00c0c5bacb93c748d6b", + signature: + "376a1fbff284ef3a22a197ea6e6e6cbef808e016e074cd3c6feedd67f8cea6227249ab0234d0ba46da25514da94c47b8a2e043d48c98968e0ef3b2d92b38308e", + recoveryId: 1, + }, + { + d: "b2fe8ff26f5ba4e956c93e485c169c19f07094ba178f7d738513551f7c4980e8", + m: "d4d020d0087447858f6932dce017977f738c91e148134f51c20bec4f48edb606", + signature: + "11554967b8dfcff3013fcb63d6f9e117e1895a6d3b639d55df3c6e8532c12e490b7d9e8c28e5340166f0f6ae8acd3278f41da352549090a41959e66f9651e02d", + recoveryId: 1, + }, + { + d: "fe3280847819580db85fafbb42171c96b6d621794cd4c74f0808884978bce731", + m: "5583f048c02992e9110c3b4e2a5e5c46b9aea21bfe11b2bd55728b4e7d9d5eb9", + signature: + "a99c9e793f016b970a64976a50ea1d7d6f0c05ade4da7dd9a009ca5d4976f3ca776546a82582e7a4604c40b3f2d97d1a728fdb163feedef48f0eed60509933a5", + recoveryId: 0, + }, + { + d: "238d343f8dd638deb52bc0c8f7874e2dcfbee335267e72c7c8a55fbb6daac4bc", + m: "5de0162c2054f74d63a0e0c33ee72eed152ec7c86c7e2ea2f54773e18a2b0aef", + signature: + "df475fe2d952e4399a02a94b01ec737b2e5bcdae651d8c0ee7111af1c9eae46314e0b6e86e96bddcde0bf2d72f6536e08ecbc41124c2b817ffb784d903851c78", + recoveryId: 1, + }, + { + d: "6aca5dbef2d6c40924f1770c9fa3877d53de50148c7b704bdeab4681722228c5", + m: "21855f3c614103dfb8668858d6cf3960fd580f539497fb159ce083637ebdd5aa", + signature: + "47e270693102874e3f8b4cd444734f6bf4f495c45a86bdafe2bea8ef9cad41577bb0d959ee0bed7735aaf467809032f28ec7a4c1e7ea535cec1e6223afc13885", + recoveryId: 1, + }, + { + d: "fb7b590e05a53204a51d2f0cf0871d55e6afed90f914e743d5727b8f32211ecc", + m: "79ee0bdb0bd6c4be689f837e014c005852912e9ebeacfb94acd6ef69605a92a6", + signature: + "29c493467c9be4fd6242051d1b507eef3878e0575b37ba14ca4ae3443a2f38a43343ee7aae6da24892e701561aa8ac614b8f366a118a55581a9e77ca729d54b5", + recoveryId: 0, + }, + { + d: "16adb0bff948c5001d387be50fcb665f9f8a3d546d54b9006b81137cd25c7f7d", + m: "e3655b2a61df3c249235b1fd38d5510497a18fe34178c78208b099b044206858", + signature: + "d8ce517dd5eb1be257d5f580f2fdc91b300ad414b7834bead318aebca356d76c2c9b6657adfb8fddddfb777fb0af35ce75ac2d98672909e5498dfa447411caa3", + recoveryId: 0, + }, + { + d: "c35150dfdc84095dfdc8cbd16c9222a6e0506656492cef5794418d8a2d450e2a", + m: "34a3a9c2ef384e3869949783a4cc6e3e034800014ae57bdba4a01cadd96f3908", + signature: + "bf21d6d0df51bea59f7e6da99aeaf0f6761dcc387cffcc4b96572e3facbba39a4acfc18ef3c338409416e8376560a9ac65c773c9a5d837aec5a0d95c9061edb5", + recoveryId: 1, + }, + { + d: "b8e5a2ace0d8281df60db7f136d0bf01e5be4b749e71e3075fa3b040757cd0fe", + m: "d504ad32839e0ae506c9245eb8e2d5202855a649227ab78c25ca16b5bb7cd6a1", + signature: + "34f70e090ed15c82faa69489a348b31e9e0d51b5d3704201930213f603ea1a274f03568e6ec154d8c7a871ca584d09bd31cbbf0f5850a5c7c4c7665bbd5c44aa", + recoveryId: 0, + }, + { + d: "626715bfcb3da69e88a6a67a032d6afaf398d10b340b859ee7a3e29d798497fe", + m: "1f09fe8d18e06add10f20a6a4764b29a25a0e92b3c587da1377219e052e01859", + signature: + "e7cdc3d6e1e13efcd77e615756336460df19176438d6e27e6130376281ab1f1475e78391c2b8a349e5576bf9c32fd0bab0926cbad595ae5d339764e46a47653d", + recoveryId: 0, + }, + { + d: "679a167fe7de78eaabe9be1721a42ff8b32a10741c5a5f2c15b264402edfae30", + m: "2846a671b779869726d44da0e919e7bda9bbd089e92d0875542b83408861bdaf", + signature: + "239c7ec22f137b64ae7d48fc7afb4cec3c0958780b715cbd5fa6ed2c25e180dc5701e32da238a0e6ca3dc3b2430691ec25e3e15c36bddff4ebfecef9d6d0b870", + recoveryId: 1, + }, + { + d: "3c73daea6b33900f56335000b79eae57d084534dd05520ec81fe6032de494495", + m: "d26fed0d10c870187d733965f1a8657d11c76a6ccfe7570338ca5aaaa452d883", + signature: + "e00fdc869434ffb12281732eed14a49779e6b086d2e025c3fbd13a3ab396532d7b728effa68ef25bf5371e0f5d8a3af53660225340dd7e591aaf363cb5ae21ec", + recoveryId: 1, + }, + { + d: "d2ee92f190d9db6b89806d83baee9049a21c02c3cc0f213c68751b20ee4cb7c1", + m: "f0222beda47f73627de2c4bb6db44db66c2cf19fd7e87c9ea6094682cf24c4b1", + signature: + "0e96e0ab56152bd357719056f813a5e893c330d4c6066dbe6fb3c858f08e094436122ae6da8715169a33664d41ab8fdcfcd2f68b5f2b9575755057a04f77e37c", + recoveryId: 1, + }, + { + d: "83973bd54d3ca6745febdb31d3a7ebbdbf7e274999b055f0f360cd98ebc52acb", + m: "8d0ef81963dadd6aae9e6a47dddac60bf4dd3b22a21a55fd0830b19e9cd06c57", + signature: + "f1c50f55a4fead289880abd9c7ad4f35204d10a72dd396e253f7e09ca7c68c6f6823eaa8743e5c7d1e612ee79156bd455c27ba8af6df8101bcb08d4f48b84d2e", + recoveryId: 0, + }, + { + d: "27c19009e2f74567558ce2f47bf52dc8188005c915a152f7a8a8b50bc5ed955d", + m: "9868f4f844a04e0fd9cafc7619900da97c5daca40629779c007dbeccbb393e1a", + signature: + "cfd4880582f73eff7f0fc3a58e3efe64bc0fd4cf7f3808f589139f095517e02143e5c632465f11259776a341fce68065ef2f73d79028963849b9de2c361808ff", + recoveryId: 0, + }, + { + d: "5d6d341b7ffea2e3165409679bea1d31399798f5f45c90534bb982b4863a1ba1", + m: "bb299b69df659e4e9d64758d1389e1f1e144cc074b9e85e133fac8875e5cbcdd", + signature: + "06aac53cb4278394226692f2742f2166b136e4e5fac8237d180ebf520de42777505bcd9439a3a928ef9a626992366ddbe4bdfe1c5e1e9f67bb5695d237154522", + recoveryId: 1, + }, + { + d: "f4e58ca346292e0363cd241b66ba041c850853ca53d84bb8607133a8335cc331", + m: "d2d70eb54a216ff085d129f0ab79e5a4ca0067d2d99175bed3b88f0bd13d8e90", + signature: + "9cb48df52b46cd9db319144411e7bbd18589512b44560583d10519afa9500df471d1477b8209d604bfebdf8354db63730758358730213453b5034434e96f6b4f", + recoveryId: 0, + }, + { + d: "7bb79c3c6279332531d5be9632fd718eadf2fd8b0ceaed9339e1535fd110d6f1", + m: "76fe563cf807c4a5f163ef734b6a601ff9e56fdfa315a1c959d30c2e0231ace3", + signature: + "c76f4a477c6aa965220580e95162d971b8c953aa2a2fe72110f8df5002b9be3a1d619f5941ad4f71a14f77b7ed4fc2f4a6f59630ee3b16d9f19e91a849451454", + recoveryId: 0, + }, + { + d: "a3af7fdc597432f9cbc1c76c462f327044348dc63c133da89dc27c2452ecfde3", + m: "2ad57805491623cd6780835c86734c8f32bb5d293c903fc1341feb95681385fa", + signature: + "fa223cb6cb898b94147957b1090605af2bea35f10feabf260f5a213d550296af01dafb934cef9a6ed0485e70017163a1c6356253ea936e6249944c2868054eab", + recoveryId: 0, + }, + { + d: "40c63a1de7a88f737f5952694a3d85b87f5ca69f7bc9fe60da388a8e281068fa", + m: "9beee731f2ba8b05df1a9a138281f41067f52264f14ad4d222479540b9c52880", + signature: + "64c3f97d5e433c337b1f5fe679b8cf499f8c6f98293725826182c71b87f79b3b623d78f75605ff6044bf60563a0f13390247cc9e80afe50f31301b32871166d1", + recoveryId: 0, + }, + { + d: "a83dbf26149f8b4e0984f695a57fd3232a4f9e9edce518bcf05bc9dc518dfe2a", + m: "acd5701aa26dfa4e0363b2c2f96812791770d25205c3d5eec7fc475ca0fa953b", + signature: + "82bd7db15a2391e1343dec577ca5659eb0ec6af78de1435a602529e3acafc7dd5c6b363f22cecfeb5f349fd023187a7e59ed7a69f307f52b30bb5a3c341019c5", + recoveryId: 1, + }, + { + d: "a2c67c22f26b141f4ef754295417c06d74b91872691fe73850d43a2b95e72c41", + m: "19e7a4d49a73cd5a93cb3a5de0da721cdeb23b7d8c48e7fe9c31f11e22d60b0e", + signature: + "66c20300983e8bf2c017d4e62721fd015d3a6a1ff3656582aea3d4747af91cf519bb6be241eddb66d27c8cb874d0af76394482e9828e948c140afda430463450", + recoveryId: 1, + }, + { + d: "1e0e5281973836b71e39fce2809e86a64123caea11c87791d32e60220146ef46", + m: "d259ba273e2643f80d99328827881cf718fdf872af34978f9fbc03b9ab79d179", + signature: + "d1188e678ffe60249efb9af269046817f8ad6a5514472c741b8777c0424d28db10d581f329b57fe690673a9ae4e6a39591469fea524f52ff1aa5273ecbfc5ad9", + recoveryId: 0, + }, + { + d: "d11049206089b18c8981079384b91f21e3db8109a4614dda6ead43908be609d0", + m: "c97b9deda2490d57e02521bab267f3f1bab60223900260ec7723bee35f092563", + signature: + "d83a73ff5717b78ee40786f604e0a17617028eeb5f386337bd22ff22ca760dea3588a19bb84e30bf0cfb7be68329360bfc52a21d5fff6562811a2981c4ff4ad2", + recoveryId: 0, + }, + { + d: "7f7fc60e238fce3816cfd068cd29512b3209db1f027901f0fa4481dc06e9e7f2", + m: "96f4569dc2e4daef1165709f4c1c9928b600169fef90ea889385fddb4558dd4b", + signature: + "c009030f2e7455b290ba41bf4a4a5edd200bba4b38207a492abafefb20e7f5c94f5218d7d7a077722350c039bb055789810857b8baf845a8a7f0588cb0eaa396", + recoveryId: 1, + }, + { + d: "8e094fa0ac3f9c683e59d7871fad108920de83892eaf4fe262ecd1c67a4c43c3", + m: "7f49cd55d20b9bb5b6234efa9ac158f2a080f93fcaf41d0e33c51f44940a810b", + signature: + "4faa22915063d784483bd0111ed9c4cc451034a3e6773a6f06f3b6aa0eb04c67561edb9bed3212e0f5adfd84659a172c6586eaaf46d9ea7e5eb0b8e866b78279", + recoveryId: 1, + }, + { + d: "6a5b3f7de75cadac8cf3fac888e57b58b0adaa676024277c3446ae80dfe7b186", + m: "1cb1ab787c287b5d157a06b4f2a95b153b37ee8662c03f841a762b71b151c5d1", + signature: + "97eb1fa96a339d0e2074b70833dcc95ed3348a8e2ad0ce38a84f969b7127ba5f6cb85589c4eb735b4017a647b570faea0c5af71d632e4cc8880867ac5a503ec7", + recoveryId: 0, + }, + { + d: "8f3af58b26ad477af43c61ced706e8e3ccef3f1db31b7fad693300ee2b5148ec", + m: "a60fe5a862184a7c0ba2758eb6a56aaf99e7207a028cf9fdf8f57db3c66b0696", + signature: + "676698ca26bc06967c1e969bb883eec3da7f77241edc63a8537038644efa30d874983ec8aaf8290f29b5279f654c5119258925eaac2210145433608b0578f3e1", + recoveryId: 1, + }, + { + d: "342397960b2fb90c8d6a2ee876fba8c092b03387ac210e4571102282ab527730", + m: "130ffdbb2f84ed57fe7321aaf2ca4afe1cbdd0d5f06d81530be8ee96a01dd054", + signature: + "16aeaa135779e03bf00cc4e2b16f37d525df2e0327b8a08117b619a17ee62c234c57dbee10e4996b9de9424f20d7e2f535300bbb6e9d87d1459cdc6cad03f888", + recoveryId: 0, + }, + { + d: "2a91916898eef58fa1ce86f6db4b9ba9840a7f60a00720a1dd8bad98c29dc342", + m: "68e094d75dc38310dfa7d3548222c4aeb1c3bf2aee8b86e8273f65f3f7fa305e", + signature: + "dc63813c9ec9eebc2378d0707ea184afee4923ce6deb4bdc70507ac639b6473a47a6a6cb45b870e286e5903effcbc1b745b32b47064348aaafae2d4ec490eab7", + recoveryId: 0, + }, + { + d: "273ba4564c6fca1ad3e49b3c94f046e3f04657b79abf99f2181152a302e28997", + m: "959d22e2c9be7925b2b3f214257941fe12c2614530914e2e813c375471c1b7a1", + signature: + "e4bbdeb5b9edf461376c954e2acff1b2397714f9cfb10a2c9840e47bf6ea22820f593cb899aaf3b545066286e428b6114fc718af3f61bc313810f270f6130e6f", + recoveryId: 0, + }, + { + d: "9bc73434661c204aa4b9488f869abe2a518b5823ef89abb832a43ddaf3b17a74", + m: "eb9e82326a634e25ade0552c2ce1e4f52b97a39f712d748b301239d198c90d97", + signature: + "80164704d92e7f99fa30257a37a037d16a3c761843a7b6c65ebb0fdf9de7f28f312999551419f6c6a0425c774f04c66ca572c6c9d77b5b6be1a2a773181e861e", + recoveryId: 0, + }, + { + d: "64ceeb230db37f96e978e3e6fd7c7bbae6d3f608149e0648fd8a3b32b80848ca", + m: "a60965b28b74eab1e398721019bfe39fec6d063f9a5885792cda26f4f658dcf6", + signature: + "77435266e5e2e7db7a9dc486578f4192442615efd7f976ae2d4162054cc224975c03010d7ca6bc12c702e873ca2e3872e0e182a2772095f9ce9ddae7c5c8576a", + recoveryId: 0, + }, + { + d: "8406e4f8d8f3296a7ebe87d686ae984be654d3dedf4d4db916609a4a8e855fa0", + m: "8c49718297e169a45d659b4b90fd9617eb19880d584742ea95f5a6e721a7e0af", + signature: + "128cd2248ce35afc3710902ad9d2df2631c05d0f999aca2339cacf48e264318e3301773298d16cf52e45bf60fc8d1602e7601ae930506f2c85c7c1d01c55c2e0", + recoveryId: 0, + }, + { + d: "666a6cc7dc0b31476b023e9fa5969e3ed48dde0cf5b8bf25fd235fc65f5e92ed", + m: "0e2e8bf17327d05f950a274c616efaaac9e8cc2e09d6e4a837cf5fafd5c7d1e8", + signature: + "0f3fde87d39eff29c0e2b316532014d74bbee3c18e3140684a6e7a21c48287895bd3095c49d17d01cea9a4183c940f8bea4ae894fde82798272d2612187c8489", + recoveryId: 0, + }, + { + d: "0096a24e56958fd327b983d471470458f05beb627406d7431bb6b11ddf295eb0", + m: "08c4a2733a6fc6853f0e0668e417577fe01df9c879e67b2e13d05276c2efadba", + signature: + "f18fe2bad3f416e71e8abd15f626f79ae97176b58bfd3111fbb6d0669233e974465718812fe13d11d8f9cf80e423b77d2118f63fd5e6870e54455b30cd99344b", + recoveryId: 0, + }, + { + d: "6ac09bfd2123ee5e7a718d84909a0de9495068fcef7dfa11a80e1c3fbac926e1", + m: "de59964e7e30099f5ad2dbb4993f45b8c74384a9e56df19e240b1fa0e85d4db7", + signature: + "333f2e4d9139348fa90fafec0a4e3d7d36a23a44e3ad88f17ff88bc00156597d2f1ea1b8d85a52b2b997a37fedad8dc6a6c14ac2d4ce9cc977fbd7acb21d9d0a", + recoveryId: 0, + }, + { + d: "a0737e83d970a08a062088aec657e7dfb449e56abeccc1147f37702756af4bdd", + m: "084205c8863a4d5fa4ab3b36138d2f798c4549548e996ed988e51ff7e0b9ac1f", + signature: + "a0b63ce988ea3f9ae028e2cf5f225f52d7d52452e593370b0a92eb5be41589f514c0cbb77c19693d87d75fe2757160123c8a57963fccea2ee8adeb0839373810", + recoveryId: 0, + }, + { + d: "5c86a8aede49852192a9e8c1584d397cf6b5bf8048282887585c239489874acf", + m: "717f7ec7cab4d56a6f439539b0490bdfd1198f8406bdaa4f45b4efcbb1e794cd", + signature: + "a0d7584b3fa652368722d1125d61e056bd485c8eedc9eabc1dc54748824530a659eb4780e09b7fe839d867ef569312b9b6b3115b5df0684be9bd598542490517", + recoveryId: 0, + }, + { + d: "316f1a0f6d5d143103200d132acc83bc29094060d4cd385baca35e960ded954e", + m: "47f88a74da1ff3862f6576141e37642192b91de85dd3f49b4933884145eb4091", + signature: + "58f888ebc2cd3ec27c54afd0d2693be3273cf344751fef69e73b1ef33722057d57d1e4e3ec4513a54ac981dd1c233fdbfe3416315422ae9ab4462fe49a29e373", + recoveryId: 0, + }, + { + d: "dbd46d6b8eb5a90a6367f4f5d12c988ea3b06222b4d53b222e187149f63bed8a", + m: "360c20a6e6d42b8516dccc878e4a285e504750497b91d7b50c549b0be9a9bccd", + signature: + "c7fed3c61bd823fc46b7d513bd4656508138909a10423ff740e1077d9180d99b03b1e16ea257be683182afbd10daad0aa8e21620faa7d7f7f63155ce698c3319", + recoveryId: 0, + }, + { + d: "dae97a0cbb9167d720ab8ca2e880e06e734057e01a60289d9f8c8d9758ad5cb5", + m: "2e350e59f192bc5bc035878320cb261ac55437f54f448ced90275557af9c4ee2", + signature: + "6cf821823abd18f4c77b1d06a59a46d465c82edaeed5e09221f68a37efbe4ced5dfaeb0952f6b7bbf07744bc1a0a205ff6ebc980fd9da0bfe0502dd4b6fcc000", + recoveryId: 0, + }, + { + d: "972d9a67f459d072d33d45f6c51dc28ed9114e62366d905ccd450925aea5eb14", + m: "dd5e27e5a772ceafdee29db3461599d50802989e2e8c88e33b786cb0a33a8912", + signature: + "89e8cee7a11ff683c06e488f74181002c357d04c4ce9fecb7f5958d59f71858504e1410a65ec241073ae72cc92220c54fc802fe8b9bbadaa16ea8fa1dc57c15c", + recoveryId: 0, + }, + { + d: "544e0423608898e7648050dc32723f6c24c59e8be5667592b28aee96eef96fc6", + m: "2953dc357646af54da58b7bcc624fb75a8a17f753d0083c357f81fb668724f6b", + signature: + "e5e727acd53ac432a686b070d7ff34fb96f3dbc5a062ebba7cb80f3e0005865065501494335b014093b143d35fd5789e7b2a066de64a22a0a16a608afd0912af", + recoveryId: 1, + }, + { + d: "01f9d01d0887e88457c553afbceb88ba63984528079dba517284136d944f78ec", + m: "455767230c66d198920ddbfc83b2b95b87a588b130a42321f648600e78eab6cd", + signature: + "761c332940d001cbaec08589c273ed73fc8349b33ab6d44e5347ce536f65e7c5451baa4c958ad815876237110ab833ce2d6e40f9df9709219a8d2f345ddf6e3d", + recoveryId: 0, + }, + { + d: "dfc0d38c78c8de1d8a6e3c1b2bf2877efc577403e0f1d9eb2e966734552fbe67", + m: "dc55804e968023f757646b92ed0ec0310f8e536041c250cbe91f827b8ccc1075", + signature: + "cab99d66f95f04f0281e15d386076b6aeb63e01a452ff1678f9c5a36927eeb4d720a60d1b5244feab10d1e618d724da702e593fe9d18ee3dfbf1e6f377295583", + recoveryId: 1, + }, + { + d: "bc59f510ade53310e9267f629d1eb3dfc07909d069539d278d271a21e4a9b0fb", + m: "3255fa09f0be25aef264418f4180bd2cb92539744b4e06b69c8fbfd61593ed30", + signature: + "8a18b4e2eb04cd7fa57872107f27a59ba1b366a7c487a55ae2ef3850550c13bb350a315067a6d0882af647265b9386f6e5b9ea9a04a275af079b4f157c959d92", + recoveryId: 0, + }, + { + d: "9928c69dac6b9120950561518d2310af5d8b2ea5fbb2b09da7b91b302b0189cc", + m: "d7b5b31d558a17d15d0a65cc9976e56f6b3ffba4abadb9e82dbca1424fa13330", + signature: + "33b7cbaff03bf4fe4c5b5485b2f3f6f1bb3e5203d4c5a4426dd48f2158cd463e5651c2df3af02141bdd2e80c11cf6b5b78c12cb7802be989e0f2304ed902ca5b", + recoveryId: 0, + }, + { + d: "071967d8357868c43c16adce864fefdd00d18295063f2b85500503bf8540224f", + m: "df17e61b73ac149fa82521f39a1e100be6e815350b3aa22438499fb7b5b8d3bd", + signature: + "416021680197c8f66c62f85dde421ebbc0daec0a7e2b9b2b41b43b986c362e134127a4fd5dc52f98db8c2fd31f2f302edc78f7633f1fee6718465f236300f313", + recoveryId: 1, + }, + { + d: "bff0939c0dc9c2f9b5bc2179abadbd8ff768a2b0b6205618132a662f9843e756", + m: "aec6da21862abb182f25f924e3111cd64027c1be87756dcf1a40ac601280aa7e", + signature: + "48be310b2c2a211481a948c4577f3ffee77e674cedc6de9ea85c6bdbe9851cbc3b3a31172313d26f9a5ae755c8a97953c5c5fca4665fe66994b0e170b6a9fc3f", + recoveryId: 1, + }, + { + d: "131078426634a22aa9bb91198d486745ce9c8920b868c345885718baa5c53b7f", + m: "4d66533a2b10d2c4b3ea703527bf3c971b28cc39d462b2f3a00f8bbd55c40c7c", + signature: + "c3562b9232686c3d1559653f411f46401f92bb82ef956b50600f1c85c444479f5052e672348451e01646877c0f571cdf89c192dbedf86373d654c82067259d6c", + recoveryId: 0, + }, + { + d: "a9a868e7912c446fdb3cb10746f27dd0f12d448c0fd96201bf857674bfa64704", + m: "79e0025edc1481c998785ef1ae59ad0963aa20879ce0930232a57c6363b68ac2", + signature: + "adeb49842340d8edc3e49c326b5ba1cb1199512c519733aa9700da7045cb5d76028df3130dbc3137d012e80e430debab51f40693f229f592a1cf9cebeda439a1", + recoveryId: 0, + }, + { + d: "25c90254cd75a29bde008742166b4f3024cf3408f93215c27c034980ccf54fc1", + m: "26f65e15461caf6b8abd9b1a13955b0c8865953e4628336c7193f1e36afe9178", + signature: + "2eace7924c294d8e517766119d64b3ee4877c6a7b91e059d1a682c31c87d167b1f48f0438890a49d1ede05602e1a7e63174fd768b80c124bf2f3dfa9aba58ea2", + recoveryId: 0, + }, + { + d: "8518117a5d6e55595e0f3ce483fd462c31e52bcad93142b0e7375c5871e84a8c", + m: "4b4f8537f8886f945ff47d1e20b61881aab38fe72e6e7d2fab8457c2ab54fc6e", + signature: + "c2be23f2ba4faba610dfc50f60a304ad0af5619d27ebcfb7760eb27e29c436e1602ae4c87f32bb04e306e2e1c1110258ee3880f47df55cb934384b0556918c3d", + recoveryId: 0, + }, + { + d: "8d04ab6ebf9f3104952fcdfd1d25011651d16a1362d833f3ba1d75b57dd0edab", + m: "5a106110e9296925cf5877a8ad574d76d3645e02c2a44041e345e12025083c4d", + signature: + "d75721360d13a85b9841e83f9bd3034f91f3b76152d67841efefdb8fcb9055ac0390e7b6fa5d8f680f66bc915685f8c04fceae21ccd9f67fe6a9b989012e58ce", + recoveryId: 0, + }, + { + d: "1dfa07355d44289027a8165fd38d4cd985d767d8d3d65ae5e394b67a1850bf15", + m: "2eaa5338c1a6f7f948a98e3b42434c531d369abbc48d240a222a3a61da100d4c", + signature: + "ab1f872a306e96b7d5cdbc9ac20b84d78f5229a052cbbbdf3ba53ea01937853b6006bcd221fcb46ae8aa293f165de9d8c72d6f2455ff9659160e26be76fc0394", + recoveryId: 1, + }, + { + d: "2f5f431349a74f0984f33769616af70d926cad3c4ee3a721373d710677be1265", + m: "b7078b27adfa7120416207e73b15fd59ccfb2c341f38c210a9281934f223244d", + signature: + "d8675bd5fc77c084f3b2a42832a9787759cec03f66d3f21a9af6a09b3f611a4172f4a4d9ee64d457d9b084666b0a92ebb0031542009a2f3e900767547fd53a48", + recoveryId: 1, + }, + { + d: "909776684900634b731891e84ed55cdc93434230b67179e4416a02f4567565c5", + m: "413ea53cc65683df02b07c89e00d01d48b9990277f5a2129f58abb6f762360c3", + signature: + "6177aa6f862327e391ab978c7fef84a937bc7bfa3ee54c04582198d8a45273ce7dd4be6589e9e5e74bccc70632a146158551e11ba04eff8d474e8203e7492c9e", + recoveryId: 0, + }, + { + d: "6880a4a0f597146585bb7919d927395ba49925b257ebcd5f62c6bbfabf25ba5e", + m: "12bf3b29ceac6ae6cdba7ead2539baf1e5548b6126b8acdd5666684d3f76cb91", + signature: + "ef9a090b430279d650f64cf4b5dedae1fd941952a5917d2d5fd14b79267dc2ba04ca43baa0d487549f1eb350ddfea2f1143f1fcc21d5f4c00f0f3bf285934a34", + recoveryId: 0, + }, + { + d: "918fd2546eadc863519c613f2150c6efd32f41ca2b9a983b279fbc9d70ea0ea3", + m: "ea1540d29e7f7ff652116e1f8319c6ad45b5e9e5df9111c28e5c81d09c2c5913", + signature: + "d48c81006c090cdab0727423ee36ac9c433ec0f1169fb2a9a40c1b2787b73493078988eb0182b470a14e10570e3afbc88b4f9824f0f835c7a797e1f869b040be", + recoveryId: 0, + }, + { + d: "8e0dec44387e5656f33ea40b9f5f4dd33c42b7e567b9e1d068f6d2562e33956e", + m: "75f29d7f1943abb4a3eb66636fa752f448bb649b2ff28193b07ad811a83ba604", + signature: + "6d49536785edc5e8226318f5cd9b1610f42e48edeaca62d58eec9f18d44d9d6e2c46088d9f39fb498ef0740aef6bb5d38618181fc500d077463c897008b5d819", + recoveryId: 0, + }, + { + d: "03c92be3075b16b0aff60065ddd7b5256bbdda73e14f6ff79f28ced0fba8c77f", + m: "26c83f46c69d227a313518800035f940d9139005a5f8d407e00098ee7aed0363", + signature: + "d440e42fde085c31a4bb19fe0f0569c76085a85d43c4213f327415a1bce08b85035f3220c13c6699b187db3ff9b65a1b698154d19bdb7cb97120702475cb6f60", + recoveryId: 1, + }, + { + d: "718613535fe1315337ad4884f4f72b9cbc4715e07fa1c0415014d2d5ed7038a8", + m: "8ece93532a6abf23d33171cd749b3103d2129ac914db752c5ac8f03331196d89", + signature: + "0a532ae0f25075dad107542b367069f4159acacb756d9a9901cf22d25d20f86049d9b215520a875fe97695fb090e6aad5ff0fc56db8b889e074be71324e4815d", + recoveryId: 1, + }, + { + d: "78affe8a03064f5c02a90f14ab745c2e937ca6fb368d222bab9aef2000dde9ad", + m: "d107acc2e9123d4d79a53adb92dded65fa3dbe141c8d627f5f383d74ec119432", + signature: + "24803e41bd026f257bcc6cf31d28a415181587f603278b5b6e1b490149d17167628007732f54142345ac5c36df159e302a646cef42ee62021464dec7dfe31392", + recoveryId: 1, + }, + { + d: "9bd0f8df5e801ca345e8049915905ed394faa9ad99ec03eaf9ecab8b56c5e1b2", + m: "dcd42de84b0ab74d775a587ccea328b2662dee37d31e1048f60a165cc287eec8", + signature: + "4f1783dcb4436b5587aab4e8fa90dbaedcc87e05796b697ed8d633b5adfa6a5244180c59ea1954da23d6caa058750888dfaa7243b9c1bb74d2b4b6b73e5ae69d", + recoveryId: 0, + }, + { + d: "6c3bdbb955ef364f36e7879e8a2bd9882e7b65e5f4d9babe20349ad4bd77ba69", + m: "7834d2227b1ca683802907fc7c17cffc541cb69baa68a19341587c5430edcc84", + signature: + "5b400653a08bc3779da62749856ee19fb187506b279b588dab8729c5a5e147cd284b3a3accaa1e4931eefc475e5f9fbcfef723508e259c10aa4d246b76953d06", + recoveryId: 1, + }, + { + d: "2cb416a384c7f4b5b07bce0bda7f99c98e4e2154b5d8399ddc382ff08b818d74", + m: "5bfd4c1d2db2a4be68b60e231cebb5bb2643a84335b55d173b3377ecbcef76df", + signature: + "4d146eea82c95029c41c35efd105db80a6a00aa82b26bd60c3f5f6c5928d2098167c1245a219dc2121d20aae965ec0a119d35f48e77be74df2e157d32f5a11bd", + recoveryId: 1, + }, + { + d: "c67bb5483d180983879bd55a7cbb4483647dda97e0a806845b14b4594265847a", + m: "1d87d3ee746d7d13f56ab5b39e1fd0b2b0908471021c6eddf5f44fb3b9c87d28", + signature: + "f44f029807a8575620ea5e789b8f72bf216f3f6521534c6c53661f29bdf64c367730b61afe24cbbb1548f944214a262ed4535f73309352c4630cfcac0f1f02f2", + recoveryId: 1, + }, + { + d: "15005e95a963aaae32d997664b3917ef12651da764d096dbd19430e1e41c3d44", + m: "deca8fbab73713d2627fe92fa1c78afafb4ded83d0b59226b92816bd7ad6c671", + signature: + "660f40d3c71bc885be3ef2fe169ee0304d3b8369ecbdbae70cc85ed2eee329e000b227b0fcccdbdff77a0f5be9913d9bceea4b6e6f5d80da9f3e0f0bca0abd1b", + recoveryId: 1, + }, + { + d: "6ff54c8b79a7fe06a74261f05d5e361131e000b0453061713c14db3794b3fa18", + m: "2742bc3bad66fb211a79bcb474cf60526b900cd0d34fcb35e3fa635f2d19b72b", + signature: + "88924f2fd0e046b212ae33cc9947863578bf857eb2483ca5a11d0242587750be20dfb598792f86dbd4a9690325df32c9f2396a60c9f31dd1048a0c31c5a494d7", + recoveryId: 1, + }, + { + d: "6f59878a79a476cdbe90812589d94d38e6e1049e41daa1a8651ba1f14b5ab3f5", + m: "76bc9932c03b928265ce007aa0e8e2d5b3ad060a3a00d8bbd41c2c03cfe89974", + signature: + "480a966a6414e62af706bdd7d3c55e98487c98b139dfb13ad3ecdecb29bb284b144fa80b23f1a035c45a9e2a54d0358572bdf049338ec3db8307f30bf41190f3", + recoveryId: 1, + }, + { + d: "ccdda1f6bc630f8ece3af831878108e62fe0e0024e3375d7d0c99130e39513ca", + m: "ef475c11d79095c8c50ac5c155ba90cc90a1b4164e8307e605be4aca1835891b", + signature: + "2cb3b845a5c8001df33c50a4e56b0fb2deea36a6548c6843455cce8ad6b495f014c6075b10acd3f5b2319f27a3fbf6f54aa15db17fd92766b11d8e4244425326", + recoveryId: 0, + }, + { + d: "bee9e981846bd53585fd6f06cbe18b6571b7289d102f9603e77b544587a44cad", + m: "b07c8f31344365d3cb655231fd36c33cd5060c20510dd34f1d47fc9d420747ec", + signature: + "95b016d3213202e689e86721f278a4f1081d513236cda3a17a3633595b22d06b47c7ce781ff542400b01706227d194f127cb3407821059bea5116568c399f32e", + recoveryId: 1, + }, + { + d: "39a3af4593bf9f2d17db8c1acb0434fadf557dac23b68c3eaa472984e1577f56", + m: "62c775b72cce9ccc8edfb8db1572f660ebc336cae83798441e298a9969113024", + signature: + "70dc0297df95dd0e5e35ece98da878b62aca02e1627a5373def458e192c1e28b046f394a5dd75d52a7a5c2ad13b8090fd8117750186ce3a46b02ec465bdd0d81", + recoveryId: 0, + }, + { + d: "c4044f077f2c23e4fe2da8d365556425dfe95e6a00188b4a5ac9171922831145", + m: "9f033aa1a5ad41f31f29fa1c4ab852b6bc11cb20e51527fe56d838290079c448", + signature: + "00d700d60715742baa5cbba26d4a84ba5b42fa5d8cf0c057f1abc76a3b4ef9d57616822fe43b9cf6fadc56b37b01fb94c5a812403bcf740da05b0c164557091a", + recoveryId: 0, + }, + { + d: "199dbdae5387f7ac69470896becefb9f95948fe6ca29d14fc0a739a9e4dab261", + m: "c4dca557d221fcaa91a11c25c5dcf3449b0492525881b2ace9a53e2969bacb45", + signature: + "b66db6c79f970ceed38dd6a00c6b4195498bfd142095b2866f9403998400e4d85ee522cbfae90a210a6ef03eb48b1ab4622e63bf178e9375fea95d24604b36d1", + recoveryId: 0, + }, + { + d: "b6800b7d767c31eb6bbab2a174ef629f2eb49efdaa5690a8904163c0f53aebc7", + m: "f7e4b00859465766f18b1a7321ed12c3818b51607e328ca15cb3fabd20c312d2", + signature: + "05ea306c54173370bfca7d34250590106214b8d9451c6473b565241b6443232d7531a6d728651f1c63907183cd21c5f9f739d4d4613cd75c42c70e549853690e", + recoveryId: 0, + }, + { + d: "7c9545323c3d3944589e3ddec2d8db2b3a1794fbc894859bfe42ef5140438447", + m: "66e9882c90b97f5bbf602bea98f9d9e81e0aacfb7e9a53ad980e039855c790aa", + signature: + "3382b918a7b5a40a74d146d1d34a1afa88c02b89cbd65d9ebbfca4120156fe960c21b984637d6b6375a81be30dd5b82943e67ff43c9231901242e093abb34983", + recoveryId: 1, + }, + { + d: "5fb2718779322c382258be114776347290d1548bdc0af9c044507db31758833c", + m: "9f1340c11f88c12e31d743875e04aaef23e9a6bd5e1495f29b27ef20fea362e0", + signature: + "b973911fec46b76a0f0d28e13f80b60cd48f7235b6fb4e0722784dfcf667b95b1b7daf67879a872ea671df156c36f6de11c79e0e346d6b701cb724f7e2862f33", + recoveryId: 1, + }, + { + d: "c70e28d87da2243c92729ee167abaa27ba087a56fc94cf04bdb31b4770bcc22d", + m: "78e055e8581ca6557ef15e40ee7cc2a82b776e7a5592e05032877a9c34cdb1fc", + signature: + "6ef9078b7ec02972bd08d3075456b9f39022609ab6ea50ef197a07fa43e826d54f3465c7e30ada3d2421d07ab884d1edac53a5a7458665bb96c33968906a104a", + recoveryId: 1, + }, + { + d: "162a9da84fc3cfb5fe213b0af1b0585bce3fedab0111ded9c239de24d0295293", + m: "2d755d84558799e80c8e780c74f1198abcccef2d5872c3e72b2abb5977140a34", + signature: + "998590a66bdb7b8dfe59613b48c9fe192355ccd0b69c90dd2fe8817f58cd61b64bf3c69842c4ff77d85fac42589a415da6f53036a07fa5a76aa725174cd575ea", + recoveryId: 0, + }, + { + d: "ba30aba85a7cddb90898f51a1e54fcd1caea9c6a4f20d3beeaef4360b6aa7977", + m: "431fec029e8b6d545c4029273d0ee288cda7e2e54559de65e770e66151533e9e", + signature: + "c62694182f199c9a213db2daa91cb272d5701fadfeecf3bdde433d9c619690b71a707310ebfa9f94fa8e6f9ceda2766343f83669295cf6a9bebd383eadc94f6b", + recoveryId: 0, + }, + { + d: "cc2b0b850dbba78fbbf880ca21e7cd476087d41eb506bac023749a73caa25f1c", + m: "91b6fa6cab49033cd5970c503075b91e774c59f102dc0256f1e7fbafaa6fd79f", + signature: + "d6bbad761f6de0b8763b8d701d4f93873c8cf37f8cb92ddc3356d3323506ff14235ec478db3a11aff8f1eb2d32e7d54396fec0e739f5e00eae2ec9806a5a7fe4", + recoveryId: 1, + }, + { + d: "faae9f5d3920addea3a920a3aa4dc71930a5ac9c5ea7c01f29797be1d10f6f57", + m: "400b944aba301ff812e2c514f1c1099c996045289866278b47d48582e2a3ccc4", + signature: + "dd47b3a846a66cbbd3e59df3a919c78514f25b7649423dcc730c616559a90ec94a761f31de499ba0b9bf10ed0c19a690752ce492193991b2d311f763dc326b4d", + recoveryId: 0, + }, + { + d: "8c45dbe2687d7ff20adf70403b83eecb3eba2f8c4240ef6ebb380b6589cb90bd", + m: "bdd54794ca68425dbdead84c3bc1b1bbd58ab7100d0190b41c0255990f7e9a30", + signature: + "473e984af92a6c9c7692ead56e815c7a4db6be57101ac8f2a877aba215273c31125ee6f75d79bdd5c86cf4c17951993c8ca81c188f68050f49b19ffa1e01a9fa", + recoveryId: 1, + }, + { + d: "9af06b7d15f5b0c26d9990777993b3096556920255d3fbc3f10d9c9e8ba81056", + m: "2c9ecb3e46bcb0f6864c2ca77cd133a1e2d7656ebc10c32338294aadcdb11be4", + signature: + "e112982aee18f351a11624784af03c08ea25d7bdfda7a8f53884d28f4cefd8595295d3131f7d83ef2e24c4ff14b5b6881b03d5ab0c635339edeffd04512cb202", + recoveryId: 0, + }, + { + d: "2d5b16907455df4249d8bb5c40e2ac973210bd72acabc7f6026e9452b19762e0", + m: "9c3261c6d4b5c7cc078195131961b9d470113dae05e860f9c8b97b2b40abadec", + signature: + "6623198548b2cfb7f32a4b4be8970cc0da49a0ae13698c299550852384de8cb20d3e162623e727ef449c3be2079088b67aba0e6f3a47a7c3bb7603c0dfd063c6", + recoveryId: 0, + }, + { + d: "edfab34c361fb54fbce24e6fd7504aea6fc7a579a7fce567519e251377e26343", + m: "f1acf52a59ea320ed96199afefae339cadeab7aca206f6216eb66146c253c411", + signature: + "d3b9232a15e47932f28309a114628c16fbccbdcb7f19b587c5554f35d11fba947f4bfb23ed7f7dc6072dcc8ef650ce5963161da1d06d5d0e3edf89cabe953b00", + recoveryId: 0, + }, + { + d: "bc6df272180d321ec0e88b6cf65295228a69a25981ea7ea924b4afca7511c136", + m: "8ad993634760b38038bfdcdd6285d56684eaeed9bd680fa6ec913862fe87d337", + signature: + "9dd16d438e9d9f41bc651659eb3752d3648d72faf8d7f364c24cc93c760c8b5f7622a4eaaf759402bcf241ac24ef29577a9d78121fcc9769be935d8dcf80dc8a", + recoveryId: 0, + }, + { + d: "7430b59e8dd1915d603cf83c5180b44a65b2d2de127bfc5c5ae625ed940e60a5", + m: "469436ae910e45283b7aaa41c624750bead62c9862a8a34b8465380375daee78", + signature: + "35aadf3e51afb16db7385d20e7ca52201c8fef94a6d141515c7dea5950f0b9ce3329a6bfde5e9b44ba7f801a6d63d34ac07528b86ad8bdc7eefcb62aa963a2cb", + recoveryId: 1, + }, + { + d: "7b487668a37fdd6fc2a854c3eb9fc7a94bcafb99ac838813f1c41edab83b1559", + m: "a6aca32263de7150462f7cba89397bb02e505e03bfcae8dd0e98bb632dda5dd7", + signature: + "037a84e7c52bc2953e8753b211792dada255ca45593b5b8754beb7c047f48c4b6f10ba9e78438fa32d7009034740f36701852da3da80aa7a89ede8f1f5458ea3", + recoveryId: 1, + }, + { + d: "22cd0b5cb9c986c8ae688572b6ef8c5b53b84417f3e0ed085410ec2afce34832", + m: "66edb1d50483259448d0c6d2257cba784c55d825f895bdf3aad571eec129dfd4", + signature: + "f0885c56f05177ef5c6493f8f63b02af8184dfa90a767cfd7d1cd28192afba491d515c190adcd06ddec4fc8fd5a277c6a0adde77d0d47c2e36f16ad872a2d0df", + recoveryId: 1, + }, + { + d: "f0eed0a6609d9233284ef1d86e57c18f673b60cba0ac90735124357549252b82", + m: "d7144983742729968043d90da3c6031e632ba31c5829114ede92b4a33973bcb0", + signature: + "012c1fa0d2dfddd165c5d6b2cd8d58bd80ded51889c6bd1f0b1973d97bf5b0797950ebd459402876a9fd7106658d89dd2fe176325ac305718eb90680d8215e3d", + recoveryId: 1, + }, + { + d: "475b66566eb3cebd5fcb67591496bc4600a0aa5245280a9c378d689961a4e412", + m: "834e2276629f2270194640671495c89a9317815f706859c7b20f3fc9839c43a9", + signature: + "6f94e57045a3768c5a14a6f6c6cedd662538773338d11f9f60653aa4a93e3f4a5a60a6532b277b403732e0a7c9e050a000762d8c4d36311d24a0d02c88f7c3d9", + recoveryId: 1, + }, + { + d: "dae36b39276dcab52bfa9a1b49576676dac1a0441f17c606f7b414d754164a60", + m: "dd9d5461e8efc057916ec5ed07f9df0267e5a89e31454b3f8b1db0f9ab55918f", + signature: + "b2364c52e0e0611dc04c02bfb9b5665e797fa7aaf0016124be2d501f053b0c341c7af922a18c88cdc33939a12857b950f51817a730b4438c9b1e7a1cdabe966d", + recoveryId: 0, + }, + { + d: "7c53a01a17e9b22f31c1454f00b3daba62a9a9ec7d7d14459b020836321469f7", + m: "36dabad119ab2e1bdc93688c6d79ccaa03a7b550619632cd95c78e537e3a825d", + signature: + "80f2b317f4dc6cf6ceb6ae294c29042b51eac46c4cf9a8af862880fb3c340bc20919c310f4cf4f931e13d2cd91d9cb98d5a37b01a909a1c7ce7986db2bf0c87b", + recoveryId: 1, + }, + { + d: "5aafaf58c3c60ba365c043a924b5cbc8c6cb1cef0e3c6518f00b064a9f0bdebe", + m: "b3caaa6c7a6e8e31e324eb1a3e1c3c939b16ce4ee06beed9f45a1cb40472cb3a", + signature: + "5b027cfc8a5e75cb92c11c5b9c3b4a8521d4f43fe97cb4f2b04f7ca4d842b3cf20f2616e722b0ef7c5f3f49c6a1f4f536a71d891ece0d56912151d93004f1e1e", + recoveryId: 0, + }, + { + d: "e27de45e078bf51d119eee4de884b34e7a15c6da4e309674da36c8c60f716c7a", + m: "f2965d0082d4debdb9f40d5baf752b62923d4eee176acb20d79408787c5f0987", + signature: + "89778a727b1924b093935af4b00933e661cbcd1680132db103b3eba17585e2d12122d2744caeb2edb6635d9d264503bffe04131469f47de614a2cd44cc1bc907", + recoveryId: 0, + }, + { + d: "095ee48216099484b5938107e3206891fcaec2dbf9b2b76fd7a5b0c440bf32a1", + m: "f92b72a532f107ee88f5cc1da940deb1eeebb9c928666a91b9832ccd6af60efd", + signature: + "280d3654d870bd3f17382857b80674d73545a1622f19b3dbd4e8fb6ee552725309c2116bf318e93b4899d238ae24f71c228b282ba5a62f2cca209a02ba904344", + recoveryId: 1, + }, + { + d: "6767fa6e68cde22ee9425f4bd5e870aa0841512480016f4b11e0285cfa002241", + m: "bbfd9b4e5c75a44843390f986dbc2f0b7f35d9eead689278d85e36e369fa4c32", + signature: + "7f790b88bd8408ba4454ffd982cc96184cacf4813ffd3113b40295c59f1d7a4f45c8d58dcf91ccf2abc535bc10ad316f3df38903105cad25257b4ff2298c5a16", + recoveryId: 1, + }, + { + d: "6d734dba34b11778d32fc4f57119cae69bb6008ad69d53be4457d4c66145f592", + m: "90056a87785e2ccdb4c9800b508a97a93c72d84977a3a72b43613a6fbc117cf6", + signature: + "b4c5d3488c8fa0cd5f913e4143d7e64d4f85ad3b1e1eb46d2ed12c5e5db0ab997da96c47530d3e7aa5d4b0f4273b089eb7533cc69561c5e89b7bfd64750885fb", + recoveryId: 0, + }, + { + d: "cfb2248340abfe63449c1a8b89f9ea4825f555a335dedd8a0a12d88496d3b860", + m: "a9e7652835baaf45a773928211f7f9cb692867e2fb58beac729285e5816bea4b", + signature: + "5a0c46edacf52c6109cae57dc64b1ed01f7d64f4171d3cfae86f8b66623da252401f8130f1cef4455ac0f4e333f0241e9e9afca5dc02e8f893c3d6a9a6e66bda", + recoveryId: 1, + }, + { + d: "69f0c836ef58e5941be3e3c20c2e5a10affdd7caaeaf556bfee9809ac1340227", + m: "cd5d003ea1b8d708d488d6a762165d551168225fbdebc67a0193e445fe9041e5", + signature: + "23e5f87d22cb5552d236392ffab83944f384cd2f9e122fdddab8c2974b3ffe4e58e85ebf68c4f9a6d0bc66b0ab17203fdbce4f41ba0a69faa49610436ba316a1", + recoveryId: 1, + }, + { + d: "7d9aa7b54afe96b63a7cf3aaec79cb464b489b6eae9ac2563a60691906fe029e", + m: "97158d3fbb5f5394f4bdaa38b1932d9a1325c91ea7a6b2abb5ab3a2764bf5b7c", + signature: + "905596edbd92d5d6de57a36db2abc6a039366e869e5a1cb69e7c2d350080f8d75fcff51fd7438b4641fd7f2d4c23ea3aaf4b5263497373beecb96834e9e487cd", + recoveryId: 1, + }, + { + d: "a5f43d2a15a685e17db75d91f141482f8719858a888250071c1803cd3c9cbd17", + m: "0b257830cf0b0cec6a6f0dad47bf0a33a4f9b6d47264160edda73c1b52bcaf77", + signature: + "5e660c10cf88e01cdace7211af7107d2b8569ccd32d839e743144e9802211a561a486044673acc71e65e026c7bb244e4d9389b43bf70943a5167c91ebe25f9a9", + recoveryId: 0, + }, + { + d: "e0ac876e3574e69e6df7532eeb70b04a1531197b17b6842350a3163e2a473264", + m: "ac88f19cfd9ceb83ae91c062442125033579c44c626d560e641c5b9fbbdc6ee6", + signature: + "bb3b9703b737cc1d679294307c8ac4b073859214e70ce673e02129710fb0d5127167b86993474c0168c8c4e9118e46eee34b736e22262c9c8fa8bca02930542b", + recoveryId: 0, + }, + { + d: "8251663878862388217807963e644c3615f24d1679d242e4771762b897d1293d", + m: "2a390ffce3b82daf2c23c17decb82b3644738120a9ecbd3beb3fe792336f0fd5", + signature: + "12fcc24aa63f30ffd847821f504b66cc41d69b6f0a610e9002003ed8f32db9082f8975fa510be774e289a3672b424f089dde1150d3fcc589c500bd2993b1cd97", + recoveryId: 0, + }, + { + d: "22881c769c63416ca9e9439840be6ab6868186bd2c903583dff0e8cb2f7d49df", + m: "a2fccecea97ca6d863f72c0c709c711d7b92e1e5280e0cc42f20f93e44887a2f", + signature: + "8a67e1a92fb68dd44e68901393198098a65af50da4fddda34de65cf2ab2c6ce46ef9955f6840617262fbedbdf00cc4c602ce9e62e1ac902d4e2c211a17c3aa5e", + recoveryId: 1, + }, + { + d: "9344f7929faf2e0d8e4fa3eec3b4aad9ad4a050a928c9a18ae02c2b0b71ce7db", + m: "b8bbf5e32b6e46db8f37674696bbeae4dfde0983a150498c19e34adbd4d76e73", + signature: + "652713d889a8ee9cde68fffc77c63edded920238ce5c72597bccb16311884635357d8a18534c957af1c9c61bfcbaf10298ee27a91b7184d57de0ccdf071162fb", + recoveryId: 1, + }, + { + d: "e6a0e37b1ba5aabd4323aabad1da8a77681b3dfb4b41e8055d4b539de1215144", + m: "fe423a0ee19d9b7168e2b7c560132a5057a1d38704a5d702719c6cc5c540e3a1", + signature: + "55879c2c6bd5408b8228dcf0543b7b5ae644016ed9663734e26cfad5d6d12bc622806166957dfafc8b95aecda9f2da0f9aabcab6158eb75b7a9c708569541d6a", + recoveryId: 1, + }, + { + d: "80575bd1ad6ee9c165e38c9d67ad036de485f1bb4fd8ef2c1ea68d8ef5dfdc1f", + m: "4d6dea9139d275f69aa51fe03b2dbc53879fabebee4e5eb9961db93dc147cfdf", + signature: + "710a2ee0a58bcdf11ad71030254749830cfd25a63bdb7eefee98c1d78bac0cc01a796e386c53df9068b4499ecfebd2e7aec1b59d16e83a8af47b2860354c17f4", + recoveryId: 0, + }, + { + d: "d36a2364d85c222c97460995a8c8f77ed0e3b8de7d0841669e9d6e42b83e88c7", + m: "9b7993f42a2efc562ca8e397735d16be65117b79f5adc0aa375bcfb999b9689c", + signature: + "f9e7bf7fa314291ae1afe295517310ca616ee3d13162ffb3f29c2378b8b5f37959985af437686d114d265d9599279d0cc0b610d3e4707c352c873815035f79ff", + recoveryId: 1, + }, + { + d: "de9a21d94221602f5c93f50f1a337c906763f3bf0b4f008fa9403d3c89ba4cd1", + m: "e8c5283dd774596d529fd01396d489f1b67f4e0bd91c99b6eb8e36291015f18d", + signature: + "9e542e3ceb5d2fcf861a6b84384a81aa19fbdf46b528d2dc8f44945856f64da373a5d4579cbca749ef52a5eb03572ca2a7e37bf3bccba0d6af52e20978ad0868", + recoveryId: 1, + }, + { + d: "70effd3c087dc2fd988dde3cb25eaa1562fede851b62133342eb8c84889e0b5c", + m: "fd8737633383c669a74009af9f8c1861e968f7e07c97b913ede184db30b1949b", + signature: + "73bb58fc04159d3f96f8e09969591cca78cbfd505d325a7fe6ef287ae463b1e67cc8d4a9e8b83f3db7f8a48146c14ce9a2bc5be781b78336793cbc254409a8d0", + recoveryId: 0, + }, + { + d: "698abbe74a161e73044d293614fb1d6595c4376692b2ea5731dccac406925983", + m: "bfa0eb413e7574d25a58405958e32a28b6deb612a4d8701a37df5c78f13e92f4", + signature: + "1f09b2541a4e9311283e859dccca2c505d6d5b119722599bc10a765013fe897b12e609f0baddfbbd092977b1b820daa3271f5649c9843f4629c1a8538fa2fdad", + recoveryId: 1, + }, + { + d: "2a4073b081ef08aa2da7bdf6aec47eddd716e3ebc192dfaa28e89879634a82f6", + m: "99bb8b678bf2d77580741906e93f6a9b1bce804a984e4a3072fecf64f12219a8", + signature: + "157958eec8e57e57e7f6a8b97ad5726edd13dbb6ad750d82dacc6d9b1503800716ca85e43f6980f4b426bc78d1899d451f8a54de5b870f44e87567c09f953baa", + recoveryId: 1, + }, + { + d: "7217786e053072a2b9c56e4c5c2bf676537b7ed907addbe3a76a905facb71d0a", + m: "dcd650189b7a95247ae1ae389ebbca3711017f29967abdcb8de4a91274f0f4ec", + signature: + "4a8207b99d3a1a405457c0aa50190a6919e700c6386cc55e0e49bf4d1f4d5a1d30a51477340e32bbfa1c4ccf32d0feed774d6eeff29cef93835d4e7de4f91b82", + recoveryId: 0, + }, + { + d: "7624c344aaf7f5c629103d603458d884e69c15f7e6604831e490b43986ed147a", + m: "1fcb77949daa093b862134e6438b123832f9dce4c685cc895bd2b645ee18c5b0", + signature: + "4dc22f2d1c9f99780d199397b9c34942750627e81e1390f45a6c081c010f440f684b97e2084c2f5fea23ed66c4c2a697404d31e58e5126abee68c8a5a7b90967", + recoveryId: 1, + }, + { + d: "1ca418a7458d3a4d741dbd6db433e848a616db54cc1ee7eb7481f4edbf06630e", + m: "4c1e737e7d69e0aeeef68284c6dc47eab3af7bee302732048410baa91aa70b7b", + signature: + "8dd845798c5283bc4221af99bd82088945a3267331a15945da35c4ddd192a39d3c0522dd143e89b5f76338043655631e6cce061ef81de433e509ecec99d2c8b8", + recoveryId: 0, + }, + { + d: "421d3b4510b0c1923d74242307dc64ba82e6a4c9557b6931f32e177c987b8399", + m: "a887ab1f18fc1a5c1793b4bd8078f0e525d2959922445a61690cef92069f4f63", + signature: + "e127da4d7444a4a646275f15f8d0b75f209d385918d2aca47b2ca21ed4038b013c9eb085c64c286064cd62d6df47749dc2082899fb5c19c3f497a5e6710fb42e", + recoveryId: 1, + }, + { + d: "3bcc401c4feae78914a02d0054d7d27ddc425a3f0a4ee088da3d28ca3663288a", + m: "80a1bd8462f40dd510e19e1243b018f9a7e4449343343a5b84b8dd68f535185b", + signature: + "c02d36ce064088d3e243f2dbea519dd2e45916e6e1ec2090b300e39ec6574fbc10b66de027283574f36f75c949d9bab08faf5849bdf936ad2a04583393a41fad", + recoveryId: 0, + }, + { + d: "1fee727bb7dd5cca07b692652675368294d05dc8ac000d3cdcca9cdea7ed45fc", + m: "78ec864f7181dc1e709b846ebd209ef6ace55727cd9ad525348657903355e25e", + signature: + "2cc02e3047a0d67924bbaeb92087a2d863870d3a445212a1214feeab29b29bc405b9c6a571d6915c63be2c1d0a04c79f90a9b176a8b8996a082807a7560bf556", + recoveryId: 0, + }, + { + d: "34b681d5b016418431b3e627ebfc8f5d08fdb09b090a8cb080a047fb5d5e750e", + m: "449ca1a6e0d8afddc46e424ae843b5f07891f3d932bec51ba8b7ac6d7d916195", + signature: + "e36eae7482dd27c5c2c131251549567c51e92621b2756a0ec658e308e63e9c0a45981f8b59b2d20d9c1510e73ff1d5f3459db137c3e931902bd0170a70131b38", + recoveryId: 1, + }, + { + d: "ef907261d0b82b8629e7b30de95887d7ce0b50b98c751f15df03c57d535484ea", + m: "335b3e9ce8c58fb18bcef6841801bf66a7965d1481d67c2861a63a5033a2206b", + signature: + "9b6bb951bf3b7bf98bc4145789902c98a7e6210e1ee85fbf9e71cf63e689187f220ab1b0cf9e46209c1bc42b9a4b3bba9e6ff7fdbab0158575a2972a2fd0c740", + recoveryId: 0, + }, + { + d: "35318b75f61248439ef53092394c4f2e1e095df390b21fb3f954dc75eb5ea6dc", + m: "9428f12d0c74a6b8715fe4c821ab592162d9c3287c116b27f961bab7e2f3b3a5", + signature: + "cd446de66e60c7a4a2c3777b670d4f7998010ec06d009343ac6f3e3d4389f8ba6925c9e5506ac30cf7e298e318e102b0e520c89a60fbf39ba3f7f3ced692a87b", + recoveryId: 0, + }, + { + d: "35ba5b74a59731af72518ed97b533be9f16924af480f1523dd7cfc86588f2541", + m: "70af73bd6628357a644bf5688c5cd9cb184466a4f58b1c6026eff84ff4710c49", + signature: + "28ce77eb54ea028531a35ecf9f18a4afbcc8df066365b05d3d03e9e0ce93852926b3223e547066de80d1b7ea478a347d73eb3ee5e8617acdde90cd3982a18e4d", + recoveryId: 0, + }, + { + d: "22dd6a900f768e48515f75a874c8375bc57bc9e695365e51e4bfb397d8be5e28", + m: "abe0aa1295ad008e5f21dec1ccbfdf10d790fc4f83e75741efe8460a6fd47069", + signature: + "ea070beb07073649278d3e4ca1d8e201bdc59882ad9c2a74cc5d11baa1bb3bb703c012197f0c5c431125e4991b0748acc6900dea0ad00a6e640c5e6012631e69", + recoveryId: 0, + }, + { + d: "dc7c4bafd476aa967ed1d299ef38657f31fab7077ed08874c13c8ed42c49c713", + m: "af5224056a921a1becc68ee9a23a2a111c2cc86550109fbb6a0acbfdf64fdad7", + signature: + "a8656a77ae385ee0d2defa5e2109e5170bcbebaed4dfee153a22bc1115b0b09100651b5688fe9c9db820e906793ac8afd3f676d0b2b432dba8cc56aeb3af6289", + recoveryId: 0, + }, + { + d: "1e80b26504ec0f111818ef0ff4d5b00daf542d909463ee2f68b51e151063837e", + m: "0a2bbd36afe7e98b996a5672ef85e7993ad136f4f7976f5c6c6819e946c21112", + signature: + "687548fed9d59958f097da94b80533b8bfdae6797118295acb0daa323ed085a66644430c5ef34aeb2b8f0d43cfc543a43fb6004638a23e84a5afbda1b7917165", + recoveryId: 0, + }, + { + d: "b57c37acce43288198b4bfa1953c923eb88e578ffb1ab2c4a9e8e7c3467c1ba5", + m: "df373ad63da6de5f8defca12d51060621c1a4683e08b7f0b5f2686a4d772cd10", + signature: + "ab94e6bf82e363e745524da9292cc31be82f4bf273edbd703ffadc6c50c617292247f2f057c3fbeadf325bb9f7babc3c299905a87a9e516ec70bcdaf4ccfa9a6", + recoveryId: 1, + }, + { + d: "b43556ab04e9bd0387f40538651ef3398395d7e09ab06d317a73e3a46ee9af7c", + m: "809c99996b07d4dbc7a27dd4000f144974489dd29afda22123ccc106b0a0bb22", + signature: + "ad8ad80e2a97aa607c1e2a82ab2dda33a896623323531d4327e9921aa7536a3f45e7b71bc4bc6f48fd127c52cce04c807c7ccbc7ee1b4d45a6ea9756ca0e43c8", + recoveryId: 1, + }, + { + d: "5f8c9fcf7ab92cbfe49e0d973e33f357610aebe4e2b47b9034a4fb959083522c", + m: "f66bad02050c020ca7cf1d92874971501077212c5479132364073ed4d7aff901", + signature: + "53345b87cb6a8ce4eea21fef612a89ba1032fbb43e9d1a4be662aab4a64fcd183464f6a1807728b146aaf21d789bf975b846193f9ffced5e24797777c700e581", + recoveryId: 1, + }, + { + d: "bf850cfd80c72278f561215c06f4fa5ea5fccd822349397b8bf465ca4e43a064", + m: "1cc46ca280e4e28092816f0763eaa82dee25bc84ecc47cad2bd48ec87d7f9920", + signature: + "acc450fd7c74bb919b69af0bb4bf23e2e5be961a509098ca30fe9f504dcd0b8c7d7bb727046d931d0e7f28019a3044e227ec938a9e808c87e3926bc10b72decc", + recoveryId: 0, + }, + { + d: "7b2b7679dc590c63adb0a4de0b1eb26ccdb40452f7de4b1ac9299a67d94f5db1", + m: "5546fca68bf2891331c561f363c07914c4c6220e74b75ae8f19b9c5d0188e1bc", + signature: + "0b6762f7696bca78e3779d1342501a3c1cc9bdba67a05a4569435acac78773c41257d9c732e582ed2bc82e716c958e55eb4f7d1e63adb78a3a5d39ee59d93c4f", + recoveryId: 1, + }, + { + d: "d6ee7107e3e274002124e61da841510ce5345c43a3a1762b7e8c29e3ac26c596", + m: "29f0ec8865aff2a236010f119fae6170ab25a1efd95143f9dd7da8f796e8bc14", + signature: + "6d637b31401243256e9df50863b90031b975639087dbd025d5f52461263f36bc14d1cdfa611af1e936198d5be877dff2a5b9d894f2a53745e4b7b6c26c363958", + recoveryId: 1, + }, + { + d: "c56a4358eea29801b3bf2e0e3e46d65d64b32104b96e935900a59ade390aa86b", + m: "18341083e921f5cb819eabc3c87a05de3af98688cdb75b500199ee418fb4dd98", + signature: + "bea398268cc2cb104c5f6987fd4be2c20cb69e33227f8d74a6ab8fdb7666b6bc532e7e667d37356096b076da0c699884b119da78fdcc15da2c3e7f2752c55e25", + recoveryId: 0, + }, + { + d: "63f3cefe369e776afb7bf7dac6afdcd3d9c31e2eac18b6efc1b0318122d5198e", + m: "a1b54e8873c02c7e87960ef046a856732219e569d881f2f5ceb980eeaf3fbc1b", + signature: + "eecdb12de2a16ed0cbbc639a3c764ef4a06cc5d4a1900d83919d9d35fff9cf434cfabdbb26c5c21f8bb7582cc8d2b65af719fb398cea187183d31a83408e5398", + recoveryId: 1, + }, + { + d: "3ea4a81debd4cad0e672de757372308947ea4ff81253d7a6e8d609c6237eb33b", + m: "28cea08d7fa81140469132f683d0a28cd9fd030b5862b06210ca0c22b613275e", + signature: + "43e5eac1e2e58b721bee16220bd11d48c909a9cac96d0bfe3fb26103c587944f2561102b90bda1adf437c3f0d0f6272a9545cd8422c4cd83a87adf4607510bec", + recoveryId: 1, + }, + { + d: "234d6d51ab4a5121c7db65ccac38fe74f31a90b97b5266c45fb8c80a38791470", + m: "0ffdfc31117b1981d0e5a6612b1f568ade1ce316e7fca40bbb2a5d0be0d001c1", + signature: + "e09e16625d3c3fa1378d4a6fe67306397848cd8fc7988a24a6410173d1227ec947163207b239938c927a63e425004d1d954fc8c20c16dd81acd6899d60009c22", + recoveryId: 0, + }, + { + d: "c6022f53cdd46fdc3949e3299b173915454533e13eca2d6959c49107449a1a17", + m: "e0fad9317179e104c239c0c33555358f7db5e7a77c28b1a5ae8a5c28940604b3", + signature: + "453622ad220fa54f8c8880fc514c18697aee9f2575aad44030d1d90a7951c75368d6b6b4601400a988609f800af5bc67a74b9a57236c2847a56526d64d6fcf20", + recoveryId: 0, + }, + { + d: "83584988f06358098eaf73f8f4996ec2fd0cdac7e3c499d0bd1378706a281790", + m: "97e1675d35d65ac276cd2684b8b4ef6d771b6ba8c47a239bfe14222c0d8adc4f", + signature: + "e527a4dda96294e0112ad1e36977fa835dd927e2d2943e3bc32343ad97ef903d678499de99f87d62610a2dcb9ce96b1ad136d8bdd54ffd49570a72a796b07467", + recoveryId: 1, + }, + { + d: "8c319b3bbb738a833f7bae44f4488053d977640878e6c554203e0ad7cc5c7fbd", + m: "6f93d1a79b44738c9ef8381e2f86ebe69c031228c772f3c03d83c7bc784b2d7f", + signature: + "b27249b33ced41370e2b3b132e94a8a27b53bcc2603ba888c7f290b04c9a268341b395b5764e36a1c797dc155a938824b48f804fcf5d7928c564feb795cf2c3e", + recoveryId: 1, + }, + { + d: "8c6134a27df05b11db94de2872c385b622129d05c4b1fefb6458af0751882a6b", + m: "32a175d058dd8112d7abcf74c63634a7ef6477c5d8993185752535bb0a2c5162", + signature: + "79ce7e90da3d819b122c00f6e808a7d63683db78660321c777f2b3b9f9e51df34f24ac6ff53c8c3ce01a8c3530700ff0b17b8c3262711f9b88c9cb2a4c52adbe", + recoveryId: 0, + }, + { + d: "c69e92cb7c6e4c32085b9429a8a39ed5ba52e919feaf96f07c28ee568a196632", + m: "0212211cbc1f3475634ba3f0d358f8e4e781e55efdd5a61e2c429694b08186b3", + signature: + "92c4313ae108da678bd0f76cc97b0f88f22cba9bbdb2e3ebd49fca91e049ab1037de91178e89622a3bcd387f1016a782d13e1bdcaa67bd5b2fd815c7536c5de2", + recoveryId: 1, + }, + { + d: "18813b896d5a9f38728f26e1fcb7fc4361b4d12bc45b38551fe49198af8c230d", + m: "5b0516f499f074d502f0768c26513ba220648ab19f2da8be24e77c618b6be4c7", + signature: + "3e83fb3ce5a361db38959b33d2aab44f3a32131f9def12aba2fbab50a99ca2b50057ff8454e8d9a526a8131722fac959b959d70b98f89cc47734588ded5c11ea", + recoveryId: 1, + }, + { + d: "687095382e359e2c54c018075cad0ac8722af12851464bae7823c220bcf65561", + m: "9bbf8848e6c5e9ed738821d5023981bcd1401c33922b3d2717cb693b825b706c", + signature: + "24614efd50158e85939ccb5747c03dbf5ff3f0dc722e46ec5ce57a40889d9690247eecc1c190bce4212069585e5c78f3f4ce0561e08185d4b539b4bfaee5bc10", + recoveryId: 1, + }, + { + d: "7d69d13cc06622466412af8f127e3c91ee3c1fb9af06196fe618f25843d2438d", + m: "8d5ba57e900e3295734b170925efe7e66800aeab451c4451dee824fbbf335a92", + signature: + "9b467114e7ee22fd40f8dc337b1af7668c4b161b3230780a00783a01110e182f220a4477879f9d9e2e57d391e8fa112e36ac9550eaa6bd0a7e2453dc0fd3c332", + recoveryId: 1, + }, + { + d: "867917703ddac577f813c4c6e909cabba8ba02fa354398d758133f3bfc74b3bd", + m: "b8d7251cc4fabcfb4a14c938c904138a27930c7d39b9a67dc1e77a3097ceb198", + signature: + "8522803a08f2bd60a6348552634014ec3d2b77a11a1f282b2aa324389997fb5b05fe4f5fe3e2688463ba7bcb8d0257cce424499726a31fd2c3e660ddc2370a0e", + recoveryId: 0, + }, + { + d: "045c564998e31c1f43c11a9b61028467215bae9fd34d8e8c3d8f05a0d37b688f", + m: "0441a8e32d81c4d7b905c1831fed7dc9c5d60eb98d20fb30c4e957d28e11c9f6", + signature: + "b52b39f218255094a5a25429ed12c4e2a6591c97d639962831b9de11fcb7324b737bdd716361c5d6ada9b0e7f2119dd1e3bc8c4269ee1feaf44ea50c565c8fd5", + recoveryId: 0, + }, + { + d: "d8fb83366ed06603490270d3642e8e681129c9ed4583f8ae9e984bf3a9f7d100", + m: "c1c42eb5837c32a31a241347932dbf10de9f95e487b700f79f22adda96395dd5", + signature: + "24ecfd19d2c9df3318884d9e93b8100c3efe2cc5ea82f7890e98ffe7fa1602d0366bd5e6d31945abd1e8637d51fd22c5aac2b1c3f4839379f68167c3daedcd7c", + recoveryId: 0, + }, + { + d: "cf7a9d7a0b70cc97f936eddb3b3b39e50ad5f57a238537754c20230a0fe59650", + m: "98521ac5fefe5f6aef8d7b94603b30256e1f452bc4ef0121d358d792764aef7d", + signature: + "6f9630a08217c230b2d91c9d5781a999c00061750b16c2c0cf851790c9fb60bb20d9c6c73b98717304bf693fef4e864bb8b88b7394eed983c8ff86c757cb7c92", + recoveryId: 0, + }, + { + d: "570288976427a7cc60030638062599f8292f272df87802f40d85a9e76e539989", + m: "86c966b561c846bcc38bfd357e7556c85a3fb784a00610917e0653f5d2ac4f7d", + signature: + "55adb7f18b10951d5409b4cfa5fd8953c14cda42fe516349db077145d6760de50798470b80b7bb26667461c2a4c9221e4a64c085541801f17a0eaf5024584aae", + recoveryId: 0, + }, + { + d: "f82ead9f6bfc3cebba7395a050350e72d25a4093d3b9c223c2a1e81a8ec1dfc8", + m: "71f74723acd9e4ef299d269a4dc17b07a21b59eacd37c816bc0c480da555f861", + signature: + "c7a2ddb0b0914d0e37d3dff607e3159ab37a71b3ca13a217562dd3beb0bf54d31b5276255e4c1e305c6e7d32345ad0ac45dc49f609933699a06e6867ab465020", + recoveryId: 0, + }, + { + d: "101a339a2a018f376025de605323e19bc105f1efc07c2d435b7b04a9701f0ce2", + m: "c99dbc55823791e450cffd7c38052f2004ecbdd7f3418ac24fb318dafbecc0a0", + signature: + "20487324abb73e4eac071d70a8421d171c0c7a8f1ac24c7a2e982eb39c979184677a8529b5a7d6894819d3ed458e8d73c5d4b72fc7cf1290c61c09e9476dba8c", + recoveryId: 1, + }, + { + d: "2cfd3c50a9cb8d599987190471c9150eae3d538598f04bb3c4c826971a5fabb4", + m: "3bf1c8ac2d00d3eaf0e0934e8cdb0ae0a4fce1d32172441db6402c1b5bcb306c", + signature: + "792679d14bd90932ed15c9eb58757db1bce552f62385afd6c7f30348f0adf1250c8622f85b0081da2b9288833057f94930474fc5e5ac1d8907a9467fae382d18", + recoveryId: 0, + }, + { + d: "4068710ddb788b1042fa3d7a7f183a401fd3b079ee78cc24c9452b35c84f4482", + m: "00bb60078765cb63c730ed1e435e35559e4d85cfec91c8a008fd2ad31af4ab8a", + signature: + "0e872028220300046ce6f5bc41331523da86f070a945a8cc14897cf28334f7c3265f44290a46dcf69d680f2004aa3512ed15cf90cb3444737b4c689f0267fb55", + recoveryId: 0, + }, + { + d: "77bb66fd4525428eaacc7348506648ea992e39c99d523287e777dac05e0ab0ae", + m: "0afd4008663ce60edeef7ffdc159894658f4c4704e0415ef7719442cb8cbc92f", + signature: + "18d9971f1a977cf666f756470feb4bfa2041d603f0728023e7cdbcc99e4d5133304278cbd86ecf66cd36a1fb7c6d7bfdf4108bd83eb4abdef8ed82ab912d2850", + recoveryId: 1, + }, + { + d: "5f8b6ad701e545268facf451c4c2d61cfd13c2dd3c6924d01f9ba3cb455d7801", + m: "0f739b1f33b87917125dec9e323a624c92fef8618e0dbd1abf6ff4e7092994f1", + signature: + "e3675e83831694c74f4f1f3c5e7833eafac655c0c55bb26e108b1adfbdf2e82c269f690f577b150909c808cd161816a29ebf8df91adbbc3a637ee9864a7143d8", + recoveryId: 0, + }, + { + d: "7c62959baf87f4cd0978bf6b04050ed8a2ad93823c9b813e41b558646fdfd63a", + m: "cea67f48fd00f995aa9d27c18f8a318935c84ccdfc6616d9af0ec0ea00db279f", + signature: + "3db9e35fb2543e63144878d8cc5966cfd3e1f0d074ae5cd73c34f7f6b698667e795761faac4f03d95cc2f090367cada52c3f1d4af20e846e3f43009b9916a983", + recoveryId: 1, + }, + { + d: "d89b7fa8f267d058bf74bc1ed91e9f47d7f3dd9c5c9fb8f851e6bb28e9c45dd0", + m: "30ae4053bf475ae49470e6d5dc4662671ae51c90dbf78c61e81e75a5277aa561", + signature: + "8a877bf7cddf42c04a6660a42a74ea53d89c39c068659737a91109f2fa2250f149eb3f6915cd40b44b3f62348fff95ed2facbf75fa213bd7bcc429aff2aab23b", + recoveryId: 1, + }, + { + d: "4c825de8fca325f17c3b6f02b5037133761f832950205902b6cf2076c1225f5e", + m: "de2d7e76886846164c935ca421e9471ab8c7d3ecc52c4ea93f807b09ae06fcb0", + signature: + "3a1e5191df8828bb55d4c542cb4c18cb4ae927db5368770c41b274290482613c289d9379430282c6d1d85a66a1c285188247d2038ccf1bd6dfd3eda29b105832", + recoveryId: 0, + }, + { + d: "74e86c808d6b30b5aee20408084a810fc930d05aa280b966f9838038558f8c16", + m: "7441517250390370da9c077700276acc8c25366e2a83c2fcec1dd84b6e93fe3a", + signature: + "bf099d7d468d36ef058bd77febb8a868714baeb974d4d3fe0fc5a6d316ac015500af9dfb351e830cdcf2712eaafa3fbcfbee5436d132e1853ec3281fdaf5f489", + recoveryId: 0, + }, + { + d: "1e2c0969e5c579a15be715143ea51c61d57b113539d2cebd00880035fae6cb7a", + m: "c54dc392bd4f75a6ed6b1693e2c780936e51f3b18878e61549cc326c481160b6", + signature: + "76b8e9413b0b6541f01b5ed459e3cf769c6166e5b2ef84d095e1fdafbf36a4515c76eb1809159873f652948112a651ec0cef3b6d86a6edc41253e5aba99e455e", + recoveryId: 0, + }, + { + d: "eec4d83199c9c994505b6ae1a11b5c7e26f7cf07aa9b1108b24738cf3518e535", + m: "d858c6f4637817799ccb62ae273be11458bd560dbc06235b0ab113c5908ba958", + signature: + "bba8b62fd6ce932236d78a73d39dece4db3cd178db8317a3e84e6ba862d6a2df0f0bf4fede55530bef0eb056db4c77bbf9de90425fc7404ec3c2ba50fb8ff513", + recoveryId: 0, + }, + { + d: "0aecf2e8b8f6308e6696ab5bee027ffce002a67ebe83608ef15773ab0c18ac02", + m: "7f98b17c3944b3c909bc39ac9efa1f975891eb9e57d32d5d7a4281c4cab5e69e", + signature: + "ffed9e36295d14ca2dbe9108c2a84d50a4650385069979cc2c9087762484d78519e2b4056427a3b40c93f93c6e75921f200ccbf8226cc1e8c58b7fc63dc856df", + recoveryId: 1, + }, + { + d: "cb45d8988dc6577f5e060463073dfbf3b8cc8df8f0e4f99af3600bdd81b24e5f", + m: "59086fe9765b8c90791885b4bfc4af78c9565c50059727bcfb5476271cbf981a", + signature: + "f93e1a29cb188d36b2bdd1b86628d4dbb80cd433f9ea4ae130ad5037cf67e46a448ed6ab59e958afa72e860c63c890566a79ffd077df3d257845da0fb1660ca4", + recoveryId: 0, + }, + { + d: "c6d717870c046f8b7dd5081aab74e0884325815744b5ec4bf591b157bd3bb27f", + m: "f7d6cc85d503bf0e7e0de887875ee1ec8b31e8995db3fdbdd10a9f260b29a3dd", + signature: + "ff4e5cdb98b8f43b076415f6db186385a6c78befd656436326ce4c7f0a4c639013672aed6f66e4d7aee1c3287a04ee851693a76957d0efb36d8bbbbe54a5cdb8", + recoveryId: 0, + }, + { + d: "a4b4f14048d8c6987d620838db384df25b84a10bd75e0d905ad352d640f8aadf", + m: "c0f9773ccedbfbd4a45eac033e467dcf18e2e5a9ece09fee98363fa0b1dbbd72", + signature: + "63dfd0df917361e8046e4e995af607531fc33005e43d6d7492ba73af2eb358a63da1b2936d2c42306bb4bd0daec40ea9ce72395a8aa3fb754e138351b05d12a6", + recoveryId: 1, + }, + { + d: "9e23a49949130abb3c1e1bf9bb58f03e071c4b7e5b64863108875ffb433dcf8b", + m: "da2694ded82e174f73d4990b806cde6e377cc054543ceadda27c460aa345aaf6", + signature: + "20a0f794f8acd80e4e924e3e959da07e5dbc5e2425b7504f25178833c24b5c530cbddec6a324d795cc6f1456b0e18c6e0b87012e9094cd598c3e755a2015b2f8", + recoveryId: 0, + }, + { + d: "bace0cbf3dfedf315e52c63d9dc7376c5f54d3cca62933f5bebde1f627f71316", + m: "62bb6455db1207eae79a74f1540baf04601bbde7532db51c4bc5b523782f73dd", + signature: + "94bf8787488b50efcdba63326a76588a4ea7644e81e9da9c21713375074b4cc63607f456da9592ffd5aed0f5282c8e6e5a138186b0262839dd002f4bc54c2b75", + recoveryId: 1, + }, + { + d: "93670f6c42d65e0592056d462e1013979758fc33122f8c45992d81e6da428ee4", + m: "b3cb6a02b2f4875e313925acc925b2563c06d85a90b62674ca52c5f7718bbf75", + signature: + "57953e6da46ea5eeb82cc92fe4235d659af35eedb9be771bcb9bd443dfd3fc0b7f6466707f0c6cdbc20eb3cd1647e70042fd94726a8496cf13afdf461d7b1786", + recoveryId: 0, + }, + { + d: "091c267146c7d50119ed3719bc96d36ef27f6ee052b5adfafe8dfec40af256f2", + m: "1abe8153b5067a99f3b25b75d087da7b421424d2582f563a4e33fe7df9ca9698", + signature: + "1778a6be972d60884e28e08e2b1bd5745c5e57b913a07a01e4a9e818fa763e282af578a9c4b214ccfd926748c59120b634063eb3108d32d2c6d58193f069f2d9", + recoveryId: 1, + }, + { + d: "ce628e7b0cd23f3ef0842a8bf446f8cc361abcaf1383d6b61c5dcc8ca3d4fdba", + m: "9e9a30e420cf6900fa999771e9262f66fb841f4b2b1a2eb1fa8d86538e32d376", + signature: + "bd0787944cc3bb52e3dc82217b95edac16feb68b2a485d9305e80834656412b35dc8ef8c8ce5872a6ce9a377c76d8c13cfb28665912c4176014504585d06aca3", + recoveryId: 1, + }, + { + d: "85e2416289045a5babe17bbb65f9763a4592e8a7f281fed9e3f156ec73a1931c", + m: "fcf64bf7c4f42d7e2c7ed47e935a33d11c1ec0ae0c63c1261d13fe2d70cc538d", + signature: + "af46f7f92e87f2c1b315dc7295911010eb2b4ec9112c60fba32ec04e2bc5465a78d357e517d6be1feb7b7bbda6be8ca2ddb04298dfaa876eb8f7079c2b782a5e", + recoveryId: 1, + }, + { + d: "9dc97ab5743babbf6cf0e00baa43be0569a84a77cd4f63291e0f0fcefa02df80", + m: "ba53a4f8f5bc0fdc849d69e8b87126f70f143e722ff5618f5f9952f37f98842b", + signature: + "3fa681a729586f7e57a397956e039ed12b277fe429a5fcb9d3cd2b9f030f9dce43ef501b012180c9894054136c5b8a175039cfa9ccac08c31fd6d97225061ffb", + recoveryId: 1, + }, + { + d: "2338ae50f7425205567145885d1c7ebd32ce900a84361737a6b43fc753963990", + m: "a26753193a0d78c3a184f9022171d9e1face7ac3a18a724ed39abe29fb79525e", + signature: + "9ea3f5881478d5f79cf3544afe7ef7d95e2360d68e630274ad36cf48649a8bb80aade3412c101573db02293a25b2f43ecddea729abcc166625f85bd744db60c1", + recoveryId: 1, + }, + { + d: "93e2c1ad328693459a94fa0de5b42b18e8c961ab51c9df948bce885a2361acf2", + m: "dbb2fa60a93fe56348abeaaacfc5917cb24431cb39f1773e505075de2560ad65", + signature: + "2af4c76b79d5c037f93906de23ee74db9f68c67d11aea46359caf9f98bfb199d343bae71945f6e0727a986306bf43ac7da85d9c24e4685e553cec4289d3fc1f2", + recoveryId: 0, + }, + { + d: "7cc95f053c792a735b684ec670be2debb04b49340a9ca5897b040e262c3fecf8", + m: "9bdbe407f196ca0160fb0f3ed268f67ed09daaa23a85db2a52a9edba895b1f3c", + signature: + "2a9ef056414f74b863d63224846ffe416d0ad6acad8bdb27c96f0b018806ef18481f00296c0f44e08b87c3678dd04d129063fae579fd47722684b2019f7c35ba", + recoveryId: 0, + }, + { + d: "027154efa194d30a616d991b1d0674bfb7b0581ef0edce5744ea7d3d8fb47bc5", + m: "586212bd1e94f62a863a7cef6b1d8a416d3d216da7666cac7803caad8f419c7d", + signature: + "5dc166d613c0651bccbe5d799fcc374a3f65f14bf7b2c9100a642cdee9281fa451ac82b9d1658577c3643cee43192a4c9a7aed2922c66585bb5c8946ad8cf365", + recoveryId: 0, + }, + { + d: "f43cc9e71194e26e6d73081d64b36a8c2e560dac14417cd26fcc231e0f857910", + m: "4045a52d9e212886fd8e6a02c0bf3b5a107052ad812064e5a1dccd5071e15192", + signature: + "8dea94217f021b1c70640804298f1639b0b84c37ca99c443da809f66299587411d43e18773a9d2f7b92fcb615125860b52b39610a96525a36b031991a469a795", + recoveryId: 0, + }, + { + d: "4973bf55cccf77d5bf4af22082a3637d42dc9f7502295b77b5bcf3c68fc98f7d", + m: "77ea40924a06137d3307403d662e22cda7cc811169eef0e6ab470fcfac608b0a", + signature: + "04764d1daf9c68bad43e079c47304d9c8af08c85e9615753329949171c54368c626e90cac25b68c0a49b0dc1c00b3c6b7c90113ebd8bb7f36b966ff548ce1cb1", + recoveryId: 1, + }, + { + d: "da78c587398474fb203a790937d48920ecb8695e9b99e62d7f77dea20779cac4", + m: "c7f730c6d61b488498c12ab4f1ee0643834deefb744857bea43093c43949dc48", + signature: + "f32b01b0ff445e96f5225739d53f62d59fdcce43729d2f9f8db7fc36dcd31e3c65586299d1ef700e223bfcf2bccc4ea4f2d39409f945c2449c67f8d6b8045ab9", + recoveryId: 1, + }, + { + d: "58fc2de95f39f6b493faa703c8aee1e387c00779e078380f9925c776be5739d6", + m: "a51767d0685193f991ef0c90850a1d9e2f8254a4876b722576971d10a6d2b2e4", + signature: + "c07e9b8495ab380063ea0e744c569734dae44b1771e7ec14c4bdf65939bcc0f729f9415dc8c1413c8d2d5ce506d6f6df0cb1cf106cd5e44356afb644b7ffc7d5", + recoveryId: 0, + }, + { + d: "7984749a15e7950de7eb2634d7e1b1b6cb7cb5499d61461849ed3863f81f1ca0", + m: "79127d15a848245956a0d245a9375285efb178b42518a94957fac8e1181dbb60", + signature: + "5681416d5b4d07a9970dfa094e4eaea9dbfbd9cc226e75a40a9b87bfdac9eef97b4a88523023defd82471d24475bbd04f1c91e49e237c84fb66699d3dec7768e", + recoveryId: 1, + }, + { + d: "795105cf98fa5beb1a4ae9c26a680e264ba447181f7a12757b8fb301b72ab86f", + m: "d1b6282789bf4d6306b955b02a6a1148fe46140ae4a3ac11e4c3b15c7b11d011", + signature: + "28677d2619004e20c1be278be241984021adacdca9d7a0d221d8d7ffa04f13be45190fb0989f248193106fdbcaa6243a084bc8274a00addbcdc1da11c133db65", + recoveryId: 1, + }, + { + d: "633bf5218fdb1d2c0d612ed120f729a108413cf4ab45982a5b2ce95969352a0f", + m: "5b6cddaf424282e435fb97aed4811092a73ee2c4d38f41de5b583b669cf77b7c", + signature: + "f8f5b90c5132b9812a720dfeea9a72571ca991eda1492f1511da76cff5be7f8e4c25f6b5e721a43e59a426ed2ecac4d0599ce9ee3a06292fea9344216f944a0f", + recoveryId: 1, + }, + { + d: "69c5f1409c2f4c1ee193f50daf360875608e39f87875a1741ad07a2e0d3d9510", + m: "9678e546af7e3a12cca653ab3dfe6c9d7bb3ad8f919ee96e1e0af3b4e7386ee1", + signature: + "e3f4f57709e71bb37dcc6ae864ebc1ed0fcaa7da91cca73ad3fba93b3ac94ced30ec90d6b6707bf6beb6b03be867381984224c4f4efabde38e94b16622f51dd9", + recoveryId: 1, + }, + { + d: "5a0ae62652c9a9629e86aa120dfa8d98e04ccf5770641eea3362bb140a31b851", + m: "d627b5734d1d7ed78b4d202ee5d8be41034148fe36530663b6f80d7c27da6567", + signature: + "9db266465d02d40cb670a5896f2152677387b22356c4371281f30d32a4f8bb1031d58189dfa520023b967e247c0f52f64f952d6dc27a0104d2252b8b87decf2e", + recoveryId: 1, + }, + { + d: "fc9cd3794a2fbfe68c796bccd77e8030eee3f060d3a3b7662efded9011147fd1", + m: "b35fe36d573d01f19979c7575bb93fe32c5bc28385b3babfe40fdeb01fed86f0", + signature: + "e990e9d2ad955811dcacd0390778dc14deabc914ce9c4c00fc2d413582472eee18ba7702bb95fb721347c307ace69e8f041983e19276eaaaf33334e4ed5ff03a", + recoveryId: 0, + }, + { + d: "ec2b9fd8474361bc05c99a245be90a619c83492fd745dec054fd6ebbc8431d15", + m: "63fa7bab2057e58dd250bee47e7c1ed61cabacbce70eb665891e5e2e70deb943", + signature: + "520cc3ef5bc03d8cb76092b3dcfd6f79ae806df0f572ad2eed833c1b54bc20c76145caea2542c33c55995249c7a9c978085396de673111a6e5600695c390a97d", + recoveryId: 1, + }, + { + d: "3e9f5360ef8946a932a69edfed65118ec449588c35d6154d207b8eb376b4e627", + m: "b3c9112c513aef484157ccb3a231db1a81552daee187ea924ed22778b9b9c020", + signature: + "b2fe3700ddf19118e218d80c2c5d6d888b287587d807c53561dcd5ed568b6dbe01dd24eebfa1c711e4de78978e2dd3f02a6a537f2e448154e2d55810e5b76f52", + recoveryId: 0, + }, + { + d: "8757a5d90722102eaf9fa5fae3fd58f55a21db7432180fdee3994ebfadb568a4", + m: "28e09e47fc1fd4fe918edc15d14035b9a176edacb43fea65e346d4b65e966a6c", + signature: + "58cdf5e6f48ce7fdae3074e6de7027dba305b38436ed1291a8428cd4ead72a2b767f5faf5d695710d05ecdc586323f129938af372172b3b51344233e2fb96590", + recoveryId: 1, + }, + { + d: "5a51f5d8d3c17b726f67a4d72de2b92aacb73c505feaf254d674f3b67750294b", + m: "772a745881ace83cc88d85ea8675774ff85d4e58090f3302e9eeedf587f20a9a", + signature: + "2cdb46bc71291cfd9d28dcf314bf0b68ae9e968f3faf771764646334cd5c153b6d2a457f6ab6db3005c546b3d806706ab33e7b5006e3bc13a9f7dd3e2010d9b2", + recoveryId: 1, + }, + { + d: "189a9bec3e344b0fb1c9677dc8e32b526737cc8875c60f1c4860efd8e1b64525", + m: "7052ec05bb446b7190c431efe4e245be559917086b672ae7c4c440b3556e80d1", + signature: + "07c71cd430516fd699d36746cfae048d4985187271ce02a720640d6a73ce0bbf4669549162746b0bbf841e3e844992d60b7b3887e7fefe6e36c08eafce21a240", + recoveryId: 0, + }, + { + d: "05dd3feb574b354a4a0bcad29035094c896440fa6e5650e2e50f6db9dadf3b47", + m: "78253a9a874427adbb1f695eebd3c6fe59bf65a840577bfe2fa9750a34afd931", + signature: + "ac9a9f4d79752ca008d4524af6f6dc368bc50ffa1afa5a7c07a0edefcd9deba2571f1672f1e7d9c935f5f2607e028db8687f58b642affa2510ec1f970cb5b93b", + recoveryId: 1, + }, + { + d: "ef6f573521a55b53f2a917aefe07a9150cd3ca137be3ba9d0a23631826395d15", + m: "b32e5a95e43679be9f7cc9a75917d9f8e49472f693c938f24ca69aa2f61f5136", + signature: + "4bb29dcbcb9245bdf6c2b0794b20cdd45a44443fb29884976315e0cd86161ddd6a12c7b1d126b8daf07a06f93ed556fa0ddb0aa7d50911007de90702684e4405", + recoveryId: 0, + }, + { + d: "d62710224a255c6753e8053a60096c17b64e6189f0bd7c74dd2b400d8d214224", + m: "e39b1b3892725c1654b085569325945395c22e955caa354a63369b479a37606b", + signature: + "1c86193d0008fc4ea3f2302050d08be999c7e9af2c5df163557cfa0a0206a91c2a3e9b9084e2199e57698694b72035bf48a703f4901df1bef987df666ec10783", + recoveryId: 0, + }, + { + d: "c852cff81233efbc66e8be60d567f64da1f0a4ae36186fa9f98b075ef85f1471", + m: "4dc9f49e95e61ed5a24c47234fcd45f253a6219e0455c8800b49ac5231dab5b9", + signature: + "17f6af56c12b9a824f13853abdafe28e3f549c456c65426e2874e4499b06abc476708c3c67cc38cf640833005480c5ada6ae0fea63e7427d03c5329c80a5f090", + recoveryId: 1, + }, + { + d: "c084daed4528a43298c960c73c61a1f8c59b3cb1e03ccce5d659c2c1b773595d", + m: "776b344af82fd4e0dc0a4f8e017c8a6e6fbe1ec9cc9b5df5a7f0eee2bbe7448e", + signature: + "321afe99b5a2f2cdbbcf2d1efd2c4f6e38872d07080c835ed154222486f39f7e17ca082132d8e0c03f5e049d60142e04ca90678e04c321f5dd8db8e112acea5f", + recoveryId: 0, + }, + { + d: "5a4b3509cfef50c8c0ee072b82b156188568a1ec40c1c067f704d778b8e759dc", + m: "a2cb8b015f9db6f24d222182eee07dfeec8be40ce37089d2475f8525b4eda2e0", + signature: + "31c4b68223a11009cf6864df9f3d983899c3aba15f641656b45c9a56f963510e59328bf8026bce48e7bdac5c72c6420c559a975c02b2d13f9ea0fefebcd0d432", + recoveryId: 1, + }, + { + d: "00e74adc12e45eb6bfbfe86f73fbfab4e6868b7538d1c974d91f097cd3cfa724", + m: "4ada2061acbb20005b3d528e93b85e9225b2ec16c1ab7df5e2dc30d3b5cf5a86", + signature: + "dfcf72b96b26fd65d830295a737b0e3d713587f526ff992601d54bc8232508f735cf806275e491f59bf0b3592eebd47191c961991181cf14b84814a4cce080b5", + recoveryId: 1, + }, + { + d: "1a02a883b25969061eeac72baac47c0171e299bd317c3212b6795a30ef4dc465", + m: "86fd5caa00d75ee0dc86f5375b3a2628cb61eef3be6e908fcf67fef2d38bf1c9", + signature: + "577d18ca04fc98d9847c753c5ddb249b058e4c40aea918fce3d97482d756e1937b137706979f809405251a0e6be1145245c7568839c1e50983df67b14159f87a", + recoveryId: 0, + }, + { + d: "82e4d65096d568de539f25267b8cec700fe6285137a5d50aebcadd9c971c6e15", + m: "7055f2320dc664e1983f7765d0eacd3cbc76406995eeee1d63017b0199527219", + signature: + "7a052fba367d5ba6b34ffdfdad28c56b3783936671ec1b03be855fa8332bafe95d3a066d2ac2be7907b311784adf9fe9c7e4b5053a43ca04474cf076821d6e74", + recoveryId: 0, + }, + { + d: "2f72aa87f2ddebbda136b93102d6f8e17804de3bd615f70129b5f06bcc6d95ce", + m: "327e7de3f058eb124920d09c278e85d83cfcf528cb4cfe0e6a9d07c4d82f4b45", + signature: + "bbe76950eaefdb519de1632b7f0d44c7f32bb7cce4312988a7775031d164e22137895ffcec1498e2e4f238fc7a5feff1f56063ff943c3ef4c566e828c42698ca", + recoveryId: 0, + }, + { + d: "64f3866dc81f705b929ee698b7d1de021ef96077651bb352274682bb968015ee", + m: "0d90b92fbde1d44a9d4642ed9f21ce979747eca45ff330fabd875cc96ad09d95", + signature: + "4ee42f2ac1f61ed9a86a6b94df552ab794f1f91a0cce4221620c3e5e96fac81a37cde32692756d2bd8bc5e3a0f02827ce42c97fe41ba507bcd9a0dd96ebe61d4", + recoveryId: 0, + }, + { + d: "0516d9f04e9ac3f7de9e53bcb048e106feab3e19c86b3b6c7bb17d726534f0e0", + m: "4379f5079fad80745c026ec33c69829aa6f420f4f4a77829e3549aa50b15c12a", + signature: + "cb4dc0d0c53225ea7d40c6d420a133817d5bf4e3605d627b4dfd74afcf3dbd0340465baa606ef194724ff016666c96d99fa6e44137af34f5954ee61ef9a9a63a", + recoveryId: 0, + }, + { + d: "05cfdf13d1b26ef3fd1eeb70d93308ce3724dddc87e850976c65361c7ac63493", + m: "193bee865422c99f1f0fbda698c9f522037140690379575631c0e406514d4c2b", + signature: + "7a0b7f1aaa272577df326b5579c194a306c8ba13391458b2d29ea9e17c00b8fb0b7c51985f905380f950439604c6fae7bb82705d58356da0d9d1d10a9759fae8", + recoveryId: 1, + }, + { + d: "f6b42d46000e0b1b2740575b6936ccc40444975185cf520b28d0e408891cae1c", + m: "2c4310122c55d221b12940a1f8f2dbf629981eb9cf766cae1373a06dc7d54ad6", + signature: + "1b41177aa1db67c858d92ec7223322654d40cf3ff1648214e53bfe8964ce52d12a1cb384bb29d26a63b427acae1d12ca81c9fc596b45d013d29295fe28aa9f84", + recoveryId: 1, + }, + { + d: "c537892550aa5010476a2d8f50dacdeb9d0b1f7b82fcb62507268b10759fb20f", + m: "cc64760b5fb64916b1588e4159806739db339165271ec9d9699deee1608f20b5", + signature: + "d556839112aa455b35576dcb6f9ff95fe7f7503179950e2af9cba32d010c91594bddf353c460495d2acaa8b7653d13d56cda4dd07cc02f0a8167adf25797a8fb", + recoveryId: 1, + }, + { + d: "6eca23ca81141e40468e3181e1e5af0dcdecbae9a9b3eb147884022fda80bc3a", + m: "060ae08d0bb8085efe694732e2bd5159eea8da47ae34124b53e455ec45bb9e78", + signature: + "a5c3cc659c8509884212be30b8322b61aa722c74261a85b64343f832a90172894bc52b14d07ee22e728418fddd3779fdea0496d97d40642ae87809ce3a845710", + recoveryId: 0, + }, + { + d: "a5e059da03d568a249d8c4c93b7003cdac19c216995bdc0ce8b1afc10a7de102", + m: "04c0bc8befd95a734904b5a9b8f71fe12ee051fc4da453e72805c9db6350e929", + signature: + "23a528f1ae705d5a35d3a83a8e8cf749d668f75140fd1c4448ae281ca3688dab0a73f0c9cd41237be45c7e185e973631e974d0798c2ce1a153cda4b11879a6b3", + recoveryId: 0, + }, + { + d: "b927f31e9abc4e89e1b07cf83199c20157358ce8f0db94d632139bac53c8c0a3", + m: "00905982344b697120097557ac680b96a7bd7b19eeae538f9294b221d6463c9b", + signature: + "294e5da75ab5875eb4eb74807871ce96981a6ada8792e114ba14f7506d5a070c59708a22e631a2273dc7056236755c230e5c4c05363eab2dc668afc12b81a377", + recoveryId: 1, + }, + { + d: "200a4d74d2466fdfe22b2e3c2ef9dc5a146c7626cf6e75a94a153479e547fe76", + m: "eaa2c4c6803d4732bfa59b9f084554189bb656a9427d502d8e85bc7a74c2a368", + signature: + "1076fdd602a3b99e771b69c2e2ec862519a7c3da69cfca03143030ba91e979ff70dd1a9909053ec4b03188d82b6c2398d7c36980d49c730311c94b61da8f92c0", + recoveryId: 0, + }, + { + d: "73e41d0750095b2f9cc1b2b25da3f5bb9a5d434f59a34e743b366ca264fd3226", + m: "450fcf4c24c7142a21fd9c33956b01caa1de0eafc415ca1abd5a44bf8fe56720", + signature: + "f9cce8be53c50a343af7355bbe6cc19a3234e2b5964b9418122796213b14e2185454015d32ac8edb499faf5fb1a36e8113cc3fd73b435252a7aafe22285ffd27", + recoveryId: 1, + }, + { + d: "74011953bfd399689e558ee9b496ea3f0512cfcac13cfa7bfb3907781e07a49e", + m: "386494e0ec236c9ab80542b53032f9ee1eda36f249bd97b75982fa12c566adc0", + signature: + "2bc8068616b53ecde45cadd62f253511080b5c8604ebc3e275a5708d054f70b1727534f6e2f162b57a7b5d530a651320bffa74b4bb69809200ed8712a68eb8c0", + recoveryId: 0, + }, + { + d: "f23c7e75f360db90a8e63bf1a68e982b7616d9464b72dd428211dc8bd9eb6481", + m: "d41f8fc7247f74837baf89791c5acec032fe896ce365b04ec6a95b69b887d87d", + signature: + "7eccba8a07e7bb23bc47f9ae72fd803c403dae2104600c824ceae2489c2723a265705b94f13c87aca5ac349270e24de89ecde1122a25288af260a6bca8902167", + recoveryId: 1, + }, + { + d: "78c55fbd12d04b883bc9a4ac3082b7ba5b90d37c19c01a01fb45f2c805882b7f", + m: "c6f3cbe472c1437e4504d13cf8346580fa470446f6174854accceb162cce4341", + signature: + "5df3c993a46a16516896f223a704bc4ce53784601c2e6d262094cd172c68cc75401cb3db2a921e70cea4dd224d31c5b5b4dc3da3bba53ee8a434daab48cd4ed7", + recoveryId: 1, + }, + { + d: "dd209c4cabd9acc6a3792e32da5bb1c84fe4c759d523f7e5d836582364c87b1f", + m: "5ff57563aab494aeae8ca4cc76e76ec957a457f552b900c6cdbc92a8a93ffc21", + signature: + "ac308a3fcc217c4e86f16a616980a9ef19ac82fa9c21de760a8850e494130cac006d503d3f47f84676a5db378fc7580b89ed0f813882e8f8aee401288346540c", + recoveryId: 0, + }, + { + d: "49dcc5533d72e18460a403c1bc800dcaed75b469faac8ca4c6f01364b59a0a76", + m: "50d56c5c90fded70bcc4bd25669b47165d955aec31498ebeb9bc3b542cc36581", + signature: + "1f2e4457404c165c48aadbb5bcd28401092f4845ac2c6f49abb820ee645adbe7533cadbc5d84ebeafb5a598468171253ca9b57a529d02d5112d6d28b5ccc229c", + recoveryId: 0, + }, + { + d: "dcf04e7900d44c8d3f64f8d19d39082ad32194d77a3b7cb1145a759d11abca59", + m: "13b8e268fd8c83a33d192cd70f904893366ec9ded7c22320a651d2d098d8e1d6", + signature: + "7ce78aaf402f9da7a05d610d4c7e392a4bfadd9c97a66c886ecde5da07a3eb486229536fd8aab383ae4a0833c4887361f97d52d9e8c018966aadac72c0e2e5a7", + recoveryId: 1, + }, + { + d: "285e32c492a8a8c74df68c7d521f1e0f0b3844d8a0f632b81a9a5e714bba5321", + m: "5a4d2f0a69f4cd3d8b5c5e0b9d87488057b2dae3a6ac42dcc065e78cb3aafa3f", + signature: + "4b3c7c3010574e20337bd08da4e33dbeb88a40e6ee0076d8ba2f6e5279c3fde80fee9a32545216ca454b2b93a1fe979087578105d85ef66bf39ba91a0c8cb221", + recoveryId: 0, + }, + { + d: "b1f841fcd2154c9e2fc215ee21724abeaeda4f2fc6cb4765b37d06b13f9e3e16", + m: "e0855a5977731acbe4d3459e76095ac7b809c5a94d8a9e6dd00abda2671d6213", + signature: + "5a026e38a3e55d33b161aa99194287dc14aa67337d94e7611da1f37f43ff600d4c3174e6244eed14339221b7fe55873aabe7e34125e80f149809f9410de62631", + recoveryId: 0, + }, + { + d: "8c7c2c920d0436391e9f8ef3333fc5aacc6aacd05ed03f69992cf334e5e46c13", + m: "d95a654368ba922f15c656ab8c47e97022397ac2783e89f610a09a4e03e7bcbe", + signature: + "75ad97af9dbc2eacb4f0468c6232ddcd5b1bfac96dca1209274359a5001e7a487236e053c8f526493b7a21957d51b00ab246e202f2a99b09fa1490a9d8595988", + recoveryId: 1, + }, + { + d: "479651b70f27a7e54892ae01c2aefdceac7edd3d147bf40674151d0bfe087eae", + m: "2f555b650bbf12b7275145c83a4228e6babc88893ba6ccfe2d00402f8351778e", + signature: + "7f9849a1ac99bbb7fbd69236f093e75cf47a80f1bc231168d515579a951ade26716e6a082869e0304e2013da3b248ffaeaf6db46b822633ee928a278d7aeb95c", + recoveryId: 0, + }, + { + d: "387bb46b4acf79ae3c7bcb23f77b2cdefec8ae6a53dcf5a69f659b9989769319", + m: "0274869e2114ac6b6060b9b6174a2d143fbfe617782ff2ce04c3bc410cecbc38", + signature: + "218eff24c383da0e45f90423c8e81bc12a24493f0950f2614f1644f399aaa11e0b86f7991249cede20f5991263e8bfcd3ff1eeed1ec82c75fc74d04c75904bdc", + recoveryId: 1, + }, + { + d: "7f9b3afc94c5fe04f0adee70186b514611fbedcf015037b35a1cf284b5c8ea8d", + m: "f0b96de70013651d4561c7a3179dd447ea777e107cedc637b5058af7a086159f", + signature: + "c62d8189805ce0dfbe77b25bff70a6f75fc20d723a3c41ab3d97a3b9f18cca3d5fde5196a23ce6397ee48bf9d68f941f3c2e0624ac91f7b5b96d605709a09e9c", + recoveryId: 1, + }, + { + d: "08fa4cb18bfe5e84c02d28e93d1f749b6b1e5a60bd3f564761e3792954182296", + m: "ba89672906729bbf1579aa4f1f2caf14d19fb30ab7a5975db1074c49d8a5bff4", + signature: + "aa6bb70659d1b81127c172db003d68a89f61c53d47c5048a65a30e3febb8e4fd1eb18a43097b65be3eef73118a6b5fba0a37a45edd472536466c9cccfddc7167", + recoveryId: 1, + }, + { + d: "655619f6e83c061d172a522e18e62fbde5e8cd795157debf7dd6c70e3b1ccbd7", + m: "b7e3eba2623f1a8ed723c66cbe7f4fd226508da6853a392f412059b7e63d1014", + signature: + "b2a7ab278fc0d809ed3659c346495ca3a23db0a5be8978fce84d638491eb72602fe9f46f12ed2bc3bc61f05f726a34ffd460d10eae4c5c14a924510f6110fac1", + recoveryId: 0, + }, + { + d: "283d4a3a4c943f8897c50a33b3e76620ab38875ca4310ad26c04871a8ca9359c", + m: "c90b2ba53063659b6a14c212c769f6503d2256a2e27a9dcc7f5be5c20cf848b5", + signature: + "9aa67c956c059bb8998289def3cd2bb1d94960c39f857535192df920de45334210d299c37da977b99504532757425048e234b0aff48b2ea90a2723f8a0bc9e69", + recoveryId: 1, + }, + { + d: "b9e7ac3e8c7687e4f27d753f13d2e7f23289c606d8c58c3542c57c0fae3dd9f7", + m: "657a80ba0fa52bafac4200c94a9eeca770162f556e62f6b2e59df24fdcd56d34", + signature: + "4269cae85c0c9769dd82c1533c3787a1c2f8e578557679d1ca58634fef77e0155e47b020d92d9fe9e8c20ac0bdd9c235ef4043ad247272356cb458d4cdf60a10", + recoveryId: 0, + }, + { + d: "2b0e09204276fb58bad90f6f4966fe3bd7cab5681617403c3c8c8b43a5418e70", + m: "4931423fe856a72dbff78359f0aada0b44919e60aeda418729795a00ce3426d4", + signature: + "911419fab87196b53980a7b6dd39b188739a16444210a95aeafa8d4b3528616f6918353c0a9256a0b3f9ff0f9b97258db88a78f3f158df6e1b3c706addc48b55", + recoveryId: 1, + }, + { + d: "492f1eeae45ae10178463728eae894ccb0cd25e4000b729081a84620decc8f5d", + m: "36761712cda4406d1d3c364d9165d954acf1c1bb88b55cc7b8710b55ece14ddc", + signature: + "80159b8637df989e44107ce32ccab46b6315b0a5b9f70b46a3d6c7cf321ef1d7006667311c0dad25c2600b8e685ca48ed2a0c093d6c2dd605f670a75cd71d5a3", + recoveryId: 0, + }, + { + d: "841c87b7a20ade689dc4757bd2f44cfda9cd6c098870f3154d7079037eb577c8", + m: "ae99d8b50fab08d313caeb4c1aabf48c4378b73958b0ab315233006de48e3c00", + signature: + "92e863f11e178f968cde68cd6042e6a273d88167c174ce06ba2bc5c46216636e37df178089c0a4df10efb412372a60e481e1b97bf02224d18838689911f561df", + recoveryId: 0, + }, + { + d: "deed138abe8b81254673726cda84f380c8aaee8cc5c4d8683b68148fb867c8b2", + m: "8f3ca011c833228898f2f6992d68b4ebdc409f03b797d87e4c804c3510d4dab5", + signature: + "fd2171b7a0a56982c4cd9d41ab3050491150553a37b65d22fe9e9d0266a66bdb193ca14af4567701116c524684215731c79b658b39a90a37df2740497853894d", + recoveryId: 1, + }, + { + d: "376d4f09f26c7dea4447ee9c7d5d5be031bf263c7df2b340daa94c3f7f7609ea", + m: "dc9b6a9a96a24782a7110584a6ccd4f07d4472464cc9121b9ebf5c8fbaf90c31", + signature: + "f7663519094d0a33f3ac392c3adc69dafcc6592f8b9332b377feb4db7385b7ee0eaa5d193cc8ac2bbde260d5a9bb854789858c0a555352ccf773c265d73b42ed", + recoveryId: 1, + }, + { + d: "b318ef7c4004210618c099b5b931ded36d2522a8230fb47b283cb61fd55f3ed6", + m: "baee6c35d44ae0544fe440affab8d8be8a33f09b01d5005332761fe8756a22f8", + signature: + "b22908cc79d2d904805ff9905bdb430e8de89e31a2ceef0bd15fc2ed681eef645e142315b71a2876da4544412af57eaf606d72eed3a532c0018b0ad225bcbede", + recoveryId: 1, + }, + { + d: "b04bf511d5fb166826be7ae1e793971730d712ea8e609cb40084cb92969ebfef", + m: "7bed1bde8f3be76b121158b5360865b657044c85c1b335db4c3ef402d05aba74", + signature: + "5a75b8c3c9b32bdd810bb9bd28e06c0a2beff794f21a858f7aac7c7564a70760275ee7ba6b6f8f01eb74013bcf1247c0f9fa1c5780993fde40e29c62e08925dc", + recoveryId: 0, + }, + { + d: "c7f9fee191d4be58649b6be3eda62475589e3778d4367efc2f9caef7dfc8d7c4", + m: "078d0302361179aa27f9ee28c65e7b7935fdc048f2ec28f2f225fb90a2755088", + signature: + "5cad0d505b293d325c679ae9bda94e411e9c938b9c442b5195c99977bcaa724810ee880917b748123f9e99dc51570072f9c27ad1293e12f3bd614ef55426bacf", + recoveryId: 1, + }, + { + d: "fb9128fa2ff9b70c3248176627c15b032851e9de84358b9f905da7e453928491", + m: "1f2392e40a05d2f64a3e0692a8089dac7bd88b029801bb80fe56599f82c2056e", + signature: + "23411f14f993881ac96721a306307f596ebb4a53aecee5d71b6840c31590f13d212edd44cc812a0281ab4b4d37aa74604c4f7324cb7e704c1acb1f926728a9c1", + recoveryId: 0, + }, + { + d: "6d8fc6df8b635bc2ec1e274ca65ddc8525f66150c447a77065f30cdf291051f5", + m: "b03a4939d5f594d9cd7b4aa97a6d77bf9aa09d206a5cdee078f1179759579434", + signature: + "f01ae69944dbd139d8ccebfba26c863284ffe6a1eac1a7cb3fb9cc9f2f0ecfb125e901d05d5abdd078b59776010175d7b7742ebbd9fb0820ab194f05ad4b7cd4", + recoveryId: 1, + }, + { + d: "f7b7d0f060c66a2d3851b705b9b2c135a3c650f7024db3f1da3d20e8acd18b9d", + m: "0344594244280e8db861df3e757ccf3dae9f4496a338023b32f413298a71af6f", + signature: + "1adc00f41c71ce5106b9f88b942caff872efdc3aa614d2b3f373c3bc053ad89659bc2e8e1409e7abfb2fb8cd7eac1eacfed2743de28ecda1a0e6d3965f544328", + recoveryId: 1, + }, + { + d: "6f17b89b8ecccf6a93585f6a05705bc887bf19de07b3dc77bc00273e51e730c8", + m: "fb531263674d763310538e60064a3ee0cf694cfa17c2bdaa6b021411537f4aee", + signature: + "ee38cf6202c2c2808459737589aca2725a741a6daafa146dd6753676482d497e5c62cd6c5b236cfbca6d8df60b0bab14519c4e7be31469081d066d27d2f3751f", + recoveryId: 1, + }, + { + d: "5f27f95a7da5396e21709c005dd7e3686cdcfb15ad90a396e9af48118ffe88d8", + m: "d0f43b9241d06c741748f3b6501e8ec68b5e3505f8e1d9dd50596654e8402170", + signature: + "8ae8eb73a4c23977c91bd9bfbf34e569248782ef30facd580857b494e43b86ee40339890dd1b92db6646e38ac3392c2f5c5714627984e1dbb23260665035e03a", + recoveryId: 1, + }, + { + d: "d52828202916b26b01cc6296cf1793071d13fa80e2aa54bfe9a8d7d7fc64ec1c", + m: "54014197b175955c31347d918fbfc5bbc0b2737d9bb94f7e2e07ed112acd9340", + signature: + "d4769e4b1eeead36a5e00d91acb3859751d4b71e773a6b1c0fe26775e008c300303dd1ba447d55a3943f44d0543a73e848897a830c70892fffcac7cbb61f9768", + recoveryId: 1, + }, + { + d: "4b5ec5926a1671bb34732263c462a561f335f2d4b8880d59e3571758e5b41f76", + m: "125f348cdc9e3d83a20f9d18dbd43fe8278360e18af93e116f72eb7e51825a56", + signature: + "0b325c2c12e74d76aa90d1a8ff808241934be2a800c384cce5428f621af99c5e2b9050575c648b76318a22dac08ae5502cea1ff8ddf1dd17b8c42a52bba4d1fc", + recoveryId: 0, + }, + { + d: "ce7b50c36c84cff1b193c7752ac6bebb4440a43589e0e27b77b10a4a3e092452", + m: "b3b70a16dbdf5eaf01c392bec5a8b3e58761e62a7d0eb9d5da5b17c1c324fe06", + signature: + "23a10db5ca5e1f09c6762a17bdcedb74a0bee3b9a182b56eef225cf346f739506ceb2db4d6ef473cdf4baf8c062fd057eacbbf2c0369f7f3aa9a82c9adf362d6", + recoveryId: 1, + }, + { + d: "6cf791e2d183e2522a2f81f0f9f00350a019410f72e01cb48cb87e8443cf2ae6", + m: "1736498b7bbf5050ea45956cb6719fed4f98993976783b5d0cdc5fae27bd4f17", + signature: + "f244b6dbd8071b2eeeba3589a26ffcdf6894f1db6cabb0bf2f8b8259778884cd67dfc3ea5d490ca20c7970753c74c4512332d44c9c94631271fe46c18b468533", + recoveryId: 1, + }, + { + d: "1160a43748fda6b6cb5bde7258b4ac2f36f1685d2ab4f78e2d3c671a17cfaed3", + m: "b1ed93e51eba137cc45ed63765e59642cc98111c85ea088e002ee8448e30ef94", + signature: + "a94925cd0b6d386739d87b3c8418a83ff3e3d74a7579abca1bc5b26f90311e282776053a123a9eb1ebab22886b423a1525aa852acbd3e256b21227a8af103c9c", + recoveryId: 1, + }, + { + d: "105a548477c0c84d1b379042035370815ee7354663571142f3194e9f83b57f11", + m: "9a2c510f5b5e52acb5e4127df145d0a76315500d07e7e63ad69c8d5f40922a55", + signature: + "98ac9c741e7d5354d5fa00ca8a24915afcfd4b8208f81cc4d906f5396061be1a4559ea9c39d118fb3e1a93a9b243a6734fd7ecc620617ee775041d4936bb8fb4", + recoveryId: 1, + }, + { + d: "7557e26f47a79635d77ccd8475bb325ee723fe0ce9c97fa32718b27c67dbfda5", + m: "bc7ec8bf178efb85d29b88bf1c06f8cbfc79287f24122eb777c981d43769d4bf", + signature: + "7700fb517ab7b8edeafb6f5b947f19c49b29abf447d1c7f3f43a69e94e2b1e216e9642ade1de76042072c5c5fab2bf46a4851c3f671202f280870c3bdfaffe8a", + recoveryId: 1, + }, + { + d: "c6f47c98c83afd92ae6e03490efcea79cc39de7380824ad3a24c3d9e692d7feb", + m: "e271c13facfac0027ee09c5c3c224b873e9fd50ee0d2b090e4bd6853f1f4077d", + signature: + "226859526f806907c629e40ce452fe413c27702f3a3f2878fc66bedd9094208f0564c74c58c8491bb99e5f72e024d44ba5c3dbf3f0fac1db923d2e04a3fd96cd", + recoveryId: 0, + }, + { + d: "21416bde9a071359a7f127e51e8fcbb6c44c69b395554e75654566e41daf388e", + m: "7148109cf45fbc8d7666ece57e8968c0801119aa1a5851594dd62c700224c26f", + signature: + "af8c3f1f511032d790645489bcd88898867628e1e28dbf28d0cccc38d85d02914457dbbe83c767b16f6764734f93a059dce78c767208696188c48591890a0f8a", + recoveryId: 0, + }, + { + d: "7a106b581c870102e5b69cd77b497738c93ccd6ac78186ba3e0fbeecdaeb780e", + m: "0b1652f9505bed6139b78d60f41e935d7f0ff1a4e9058959ca992cc1967efe0b", + signature: + "4b8d3e5b2ac33da8802a06f8b8fb015d06264834c82a799a91e7f54253a70d8679aef6863c87544c48d7aac6904333e2736a3cd3985f0b8cf31d5ed18e50e687", + recoveryId: 1, + }, + { + d: "6eb55516902cc7549336718a53457a666076034e1ec8889816fa8b522fc5bdc8", + m: "5c6304440b8389ab39eb0a930f584925712606c7573ac6511051e559f4517566", + signature: + "d01e3fed03d49e293f040a538fa9cf756f08fb12eb94344ce917ee843794a7820b19cb081777ca97e773a5b1464628ce9a4ab4c7270d434fc10117ef5b8e44f5", + recoveryId: 0, + }, + { + d: "d3cf1ad7f3d4b27c49fd8f286edd8f14f0292557b6aac16112c45ef09ee73310", + m: "de9a97ac2df5dcdccf91e7f7c141e34c3a7e91eef57d419850d3031a8b80dda7", + signature: + "9357541353f41b3984bcea66ac8b1c43e20082e5254121b3db412597a487212161d584e321e2ef2cf046d1203cd6ff0e0941e04e38ce33408f193211d9798984", + recoveryId: 0, + }, + { + d: "d7e8a0b8b34b17b5ced097a04e1703369991a58eb60262df10ede5fdfc8ca71a", + m: "a50a4e0d5ea0b7f4f1959fed93c6b6cce2abb513a02916fb8d570b883ab442fb", + signature: + "bba900b4fa093c2fbb93249b4dc8c7e8d69398a7598435334fad4efd844717dc45f4b3e2140e3e13ee55bcf8cf989785edea0637b9091a86b302496ff9caba5f", + recoveryId: 0, + }, + { + d: "6b99fdd759877d273a151a104a9b56a7a5045eccf3a767f34ad1ee9c53936d50", + m: "9540450ac041e13d1b636f58a82d5b3b1dbc03de8ed2555fd6dc775d53cbc3bd", + signature: + "dc08fefaba2b761d0148e6b389481050718d5d8ba67e83677e4dc7a52c6081ad67247cc54a2bdcfcb2ce4faf6745a9ffea0271ad0daf46daa5060d0152c37a0e", + recoveryId: 1, + }, + { + d: "3f70a70010e7ca082e937374883925b36750f47a9713cdf98273d95497004c7e", + m: "6ddc4663e88fa47978b9c1b678a721f04c0d53578071ed8eb87b4d44b132f43d", + signature: + "4603cdd684290efaa76922bb49cf29c31b7877b07b655bd73e8e747e7497799e5d92efbbcbd875a89ae724dbb565dd7102348528e475d265d51e8dc42c523295", + recoveryId: 0, + }, + { + d: "7190ac12759476e5350272ee14c966bc44d05f3748e7a31b9cdcfd37a2ae84f6", + m: "570a906edb7d7b63c240aaca52dd61067a39dd77ad972ad83e6a807b8f6328d2", + signature: + "cefa5c4465e374648115c617069e69418afe8a9620ea793928d7f63156cd0ed33c6256d3f1d554f53573d5557d79a1028516f2bc17111aca4a78986ef8bd6dc6", + recoveryId: 1, + }, + { + d: "bdd80fda13531a3ef5d6740c2d9965641c492f12e7f74934a1ef4c5f0aed78a5", + m: "eec6ae6082344d4e4766da2257bf461e8236eb3c3e6c9ccf067910cc8745bdaa", + signature: + "9f9a5e0f4d5b8e15fc99afa27cc4f47d5b3c9ccf9ffc7b0212b0f1c11df95b2357b113e2b47942dfac49291761e03c24c1dcaead4c7fec061792e84083cef13a", + recoveryId: 1, + }, + { + d: "da1a46d0ecc863881328f8c919824f731db606cf4a4b827ad2b288bf80c8f1dc", + m: "88f93ecfc22631e1291e27ebf7f99d1091722ac7a23e664076d37863823bfc7d", + signature: + "54c635b156ab3fa1443dbcb02d67408d01f9d09381274af7c5cdda6399a3e1493a50c91ce9c2e7f2d474453b3c053f49ef6fbe47852facd6484670ff4b9fc015", + recoveryId: 0, + }, + { + d: "70443ff60ea41687dee7e62d71d2ad82854e295e4ebae502be0deff9509d8a63", + m: "251b621310cd0dccbe509c6a743021cb093c652d05ca9e2aa38a5d6d277cd7bf", + signature: + "607f41965facfbfe165f790801fe39c3a22ea417a89a73801e5658cdeb3869810b3b0b71d15a51227621cb14bee201d741f672e42b7efc75eec010420c6818c3", + recoveryId: 1, + }, + { + d: "98ec334eb73d1498827ecc08e81c3a4a74cb55e9cb2d39a33be9be8591d7eba2", + m: "cd81b1eb9660d94c977cef201299d1ce82461da164e513dd781350accc902796", + signature: + "9d6bfe692ba0a9e0f1f1395cd93c884d458d7413892e029fac6184348907edde0191d037685c380a72d4c8b408c417dae148ecd8ade6934ec6b20c814a61c8dd", + recoveryId: 0, + }, + { + d: "20ea846b83c953ecea54645b2028a998026a530660a5efb52005e70feaba9dfa", + m: "57b2d76fbd679198046238a4907251bda00bddb07607539a46f2e22002f34627", + signature: + "b9654ea002b972c689bf101cc4871e7b069bbdcf4c8dd93235e20f44ada9ffe8636efcf7d4cd7c2287ab6dbc5c6d316902decda485d68a93376691c9ad77a5a8", + recoveryId: 1, + }, + { + d: "ad3f90c17747b5d637856a40171b3b89449fe2a505dd230bf58c57567523377a", + m: "ac8685b7d14ffa91d17085f703da85ce59451b9c43f0bd4541521b67df0ee6e7", + signature: + "c507bbb014fc6c1c96331e2634f5ac899492bfe94a8994ee324388dde9553c503203bfe55ee20be0a90226a3fea5200b8b0122e6c766b59f0d77327d54dde402", + recoveryId: 1, + }, + { + d: "0aa79545cb7364715e4376abaddf3242349bee8146491f739b0d951121acaaf2", + m: "177a38d2c49f3d679a16cc9b94037ce620bf49ce21126d45bc8e39171b85dd1d", + signature: + "7393b4a15e2f5aa40c44cb4ec5f8fd5e1eece6b7cae45d3849882aab97899ec475aab6da376e6aad5f64b5f9f342119588b6ce3a47128d36cfc90a28133b19ec", + recoveryId: 1, + }, + { + d: "2af6abd8d4c9ab01af431afebd720c2e102f0570a3f0b2cbd3005c0e76e12a72", + m: "5fcd953fe28c5308f371d5e61d6bf6436d59cb65ab41289e6d458f8baa062941", + signature: + "8cee1a3dc834ea44a545e4aa28ba03d24530da5ef26ced8f1d58d5be9dc95b9076bf53d026eec830a501dca28db677d0f7f504fdd4ef8cbb7c44b5ed84b787ce", + recoveryId: 1, + }, + { + d: "46a4291707d72a3df83a6982a756cc610b38b606dc87f9c292deeb0c3636add6", + m: "a5acc9039916043af13d9c009b8793a3aa2b1dabc7955faab190acd4c0785475", + signature: + "60c02ca645c8a94bc84b4b01ac82483ad3423a287fb251f833f5528bc3068f840cb8180b9c92a83d574dfcef5d8e730b15960b854f9ff272c619126191c01b00", + recoveryId: 1, + }, + { + d: "72025731d993deaa997a8eec77d13e9ff7c3a2044857b7f475d1310c212cd52f", + m: "c1530abf6e30b61c5e120984816eb20213710ea0d753362b335f443fb84a3294", + signature: + "2fd11314a23eb51733c97fc899174ae0bc4670c5b1065e2a3933432b20238376721d9e121796cd4b42fccb796912be40bffc1972ea2388ac61812fb85c309941", + recoveryId: 1, + }, + { + d: "475cc89813c266ad8ee34688f3c5c8294e90b114ab0ee6c5d9a4eb5f25bdb41e", + m: "f33de59c553ed4ea263185546a3a8ea4ba08502edb66514ad85c1a4506e9d8bd", + signature: + "4d3ff7e5eeec864948a2fc9ab5016da15780a1abfea8fbbf3a3cb6f5f56ffc0d1f0f1b9ba48847d399e8b8727652061a98bad642d73c1f5f804e4f838f1711bb", + recoveryId: 1, + }, + { + d: "b262fcb0d678fed7d4b612864fd63adb0cb0f4273f5f051c6a7896d86ecc26b1", + m: "d6b6054008fbfd75a28116cbfc56a60497ae2fdf05b415c6c4b8b53db248ca88", + signature: + "7ab8b31914373d410e5fec72924007a32a900c3ca6b20f838dd5d8c779a31e4527dd26ca72ab32a6f69dbdebb7e92e7854acd04d3827f67f81082a9d9c61d669", + recoveryId: 0, + }, + { + d: "17cee3d8d0f35878017e1f2d0324779aab34b93d75f6cbe26e78ccec47948d4e", + m: "9b773bd18ebab2d4e474d2552ca195d3f7d2d52f7ce95fae74cfef4a0547bdf0", + signature: + "2f4f287fa322f14cf9b162be061e95f1d60955b68cc76843094dad99c3f8aa5b2741e5e2bf8975209c34446f2beeac01483580f44f1e96bc1c6e4f4f499f4182", + recoveryId: 0, + }, + { + d: "63a3a7648e5855c7959ca1e3bc829c58a6ea884913bb993f1be5fdb1c5214779", + m: "e1b255709650bebbc0dd8035834355b4840d7f32b6245c554e6ad82cd547319f", + signature: + "f06908fc39f03564c1d89f5885b17174faf04d2d39a57396c0ac5de1cb9809f77e66d95cc0bcd89f61bf9c34b298069a6458a2d0d15263a1a904a5e682228589", + recoveryId: 1, + }, + { + d: "cb9721e822bce8af3c65121641739f395a2d5c8159dc5e0b0db73b937f516130", + m: "3df2030a0eadc1c9bba8b3549070f420c420e5f6ad5c29ea5127b8ed0e27fa14", + signature: + "959b9bb5451294f8d03c296afaf73ef7b2e8a53204a47dc34bad68e5e84dadc16ce2363cafa505a3473857d353cda29ca1a128997e8623808155a3bff3b7d47c", + recoveryId: 0, + }, + { + d: "5eb2f5451ce7f692359f4db2c26f67739c5d3fe444fba057248f70ace6a288c2", + m: "1c7731fdf287a42a0dd11d871ff3bb71bfe38435c250f6fba34203f23b3b0bd7", + signature: + "10854d7168468f1c5cbb3baa6d052f92ed2e5a66063ff7957a21980ba5e6e6072a3d4a8ade25691c95eddf03049256121f8839dc27cf903b62588d38ee6ba996", + recoveryId: 0, + }, + { + d: "c2efd381001df4eea8c5d3955cda9f7da553b4fb194e54dc05ae48ea31f1a830", + m: "45a302c5df822522a4dc04d4f3673526de8f568652acc6880ccbaa7aba887415", + signature: + "81920c9210d2e950fef3c2a5b9d1825b4ce17fa6e498220f526e6741b496c44f6c6ad2b3a8e5b754798191beaf46afe6b5d4cf33c4e4580688d0f4c12caab8e1", + recoveryId: 0, + }, + { + d: "0baca9093b66825809850d36dcb95c0f09c357627a2426304f1c43af6fad0931", + m: "4b39774d5bc2391f7253a1a10eca6e8ef0503e4e4fdbf1add44e7bcb0f6dad43", + signature: + "b98ebb42b50b93381fa594759b64e0314b5d7e8b533ceff87a94741d5e10051e51dfba9dad7275cdce52cad90b92abe9b76174b3b5542a05139e9c811d5574a1", + recoveryId: 0, + }, + { + d: "3edba8c54a285eda51d68f11866d345ea891cb3d926363219e16f96832b2b752", + m: "87502bf8e974964ac1925a120d292294cceec3df6b814ddca0a29a97633a6c30", + signature: + "d715390160e11a221aa4cedf2e829319e1ee360e1b04d488f39d7ac7437051f472c764e46114f3db7faba9d479367174a20af229f75a5e55782adb4bf24eb921", + recoveryId: 0, + }, + { + d: "8254dffee44a7aa1cb9b8ec320cc3faa89c7b4492f77fb828e5a2718c015554c", + m: "28ee55c2a17f1ce48427bdee7967af168f6d078b5774791ac2349ed6821f9ed5", + signature: + "3e0e6fd9be68858f9acd46339aba17faa1716703ec8427ae1360f4b6d93dd809679030344319c639d18b2b256f682da6f23a219a20a99095fe8501cfc2264fe2", + recoveryId: 0, + }, + { + d: "bbd1a0ecba40d887df282e026fbfd2a5564ccbedfabffb30b95edd0d3b2860ab", + m: "278512729477e8397407858dc2f22450e28012346e75c6d3a13db46d7c73ab3c", + signature: + "977351903437b167f6b1f7b7241de41d60cfec6edd2d5e4471df79ae80ab78c476c3fa79d73746ce4b354a6aaa108b5c21548aba32cdea96193b1c04ee6da509", + recoveryId: 1, + }, + { + d: "d17fcb38d6d81d7f41fc0efda67dae8aa90273abcfd155875bc77537fb952ac5", + m: "30fde5eb1bc74c550e8e236a0e69c1963eaed3a45c21eafaf44be546aa537b76", + signature: + "bc3e6caef6ea486f5fac45d7d5e6737bca3d96af69b8cd7a1ab2bf8039ec90972a95aa819f7195534e6c3159ea3581150c73dea0586491481910b107179ded39", + recoveryId: 0, + }, + { + d: "e7795fcaa2614f3748702f8b91305831e606feb414313ba167e1b86ed7f44c4f", + m: "6c4e8fc5b9dfe25b0f6f84ec7cf93e38601277c7e9cbba7a0a5e4ed8af04f95b", + signature: + "7a5cc098426904a4fa03773257b3b1b949d791d63d91df79c80411f0bba2355472776348ef51f1c7858a0758b3dd570afdb993508d21d8ffc2c8601125af1cec", + recoveryId: 0, + }, + { + d: "9c25692f73c039663f8b8f79989977a06f4c79c781a13d2a1e779a672a9bd632", + m: "e87a1d408825838ea8e6ca93c901825188712d67073023545bb052aabb3b4cc3", + signature: + "c6672ec3e5b84e68448cae96642b55da3484f6e109e52b9ad218b6af86034de02531e366e8a44385f7d826539e6985967a3d3e6c246eaa6a4886e591f5cbee6d", + recoveryId: 1, + }, + { + d: "83c228c75825fe1a6a48044eed2e475d410023c3adce29016351e2c2ac4b4147", + m: "531a004e293906d4c084656cd48b8ef30ec9eee47f11ce9b85ca12f79d25228c", + signature: + "f89d06f6129c4330b0da7ca91a1fb192df304c1b16e0fccad7dae813cfb3834b2076749a18698244ad28f2e552406b53f8c17b2f6b74c128ca58a507790a62d5", + recoveryId: 1, + }, + { + d: "a15fc1a022b919f330a6fe8eccfe4ccf004b3cf44adf7d47adf92243804c1c0e", + m: "73b012452729eec6f9af75f4d6dfe0e525568f90c405befe8a517abe24112d4d", + signature: + "a4dbf52dc2fbb6952b5bb4ca85a33ce486170dc39e6752031adce5cda1f10aaf43cb5e4e737e0788a8c9a7d25b7a515f25678f17469f015a4911c1ba5ae9004b", + recoveryId: 0, + }, + { + d: "60615321bb9985c154bf2f03c2ded37115f5864bb19b9a96993147c9c221555a", + m: "1be19d4667a64eace9328a19e57d89a44c8c541a6f56ac493b443b350ca49b10", + signature: + "ed78f63b6730a480d391dad58f5a0d9ae9a8e80db357230f7d777855cd83f33c153abf450595625e0bd5499a3706b689fca0639a4e38da0704962ff10ac1a972", + recoveryId: 0, + }, + { + d: "783a0ed2b8aa367d751ea63b57f331ef882f2e26a53abfe8c236bd69d5169710", + m: "d4b2602ac9686c662bcb897da92a3e84c04d2077402ff73d0dd33c6b926bd803", + signature: + "98094d3ba5d8a4b4161d86d830d6900dfb6fff735bc5aaa9232b5132927ffb0376e5ba7d935944d2778588312972357722f1184af59736d38c39deec368d1aff", + recoveryId: 0, + }, + { + d: "eda389216622789ef40480e146348d8685517b9350c0c18a8acba5479bac6251", + m: "99dbf2ba6a6c055c9fc68a91788eee162ceab23c8d2080e872c07140eaaf95d6", + signature: + "af4e0fa0c34d889246352fdc3029f08872752aea71cc71945ded4efc97cbf88864a82aefa4fa77295dc01dc3c943a11d5f3274ec8ced0c16dce468111a342ead", + recoveryId: 0, + }, + { + d: "0d8608c824a2a3cee75596df55316fc2ca518d726a55a1c5b6f117717c301f67", + m: "c6de85fbbb0d66b74c97a905e8aae32bb8e24dca0e2982568b60939c6c973fe4", + signature: + "6bb5c07e2efc9c35e8dcd5ecdcbce909b29c4d4708c66ff2cae461fc706e7bf40c1fcd02c9720c2afc285918672a7e7260b6df906aa41b5cdc3b696f6b4f3469", + recoveryId: 0, + }, + { + d: "d698ab57246f332d6b164c3027da6070955b9cbdaf0a45946d5153f32a0540ea", + m: "8babf38949d04a770eede05687a621567cf7ee46cca045e2b6c4a18e0f505f40", + signature: + "fae511391be2a6b8ec351401372ae79ccf26924b9b0c897ee04c9d23d8e3d68227fd3d93207bb2c3758df6193f42e4e51ec1bb6d81661a3dc564fc459be8f685", + recoveryId: 0, + }, + { + d: "95fa28eaeb78b67ba03f4c55861fc80dd16740b5640b10d67017419bd9b919dd", + m: "89862710bb0e250ac7d9e0a4aa795dbb4fca5a8efa94041b2d8e448c6d34e935", + signature: + "c355f2da2f5ae381ec5bf540d559460ce26ddadc1bd4fe3b6f1a7948f47b445848213b38b8cfa473fe090375e19732933483df99aa0d7c75de25160ffa082205", + recoveryId: 0, + }, + { + d: "5d07b80067dcc247beba23740d90d461ae7f826db762c77207fa32a7ccf59c9d", + m: "c06bc1f02d46b99475d1d778d09ea36973439537f5eac740255184ec6b58e1c1", + signature: + "2f55a5a32010fbe3370e7d95cb99dd26560ba36b9877cc68da3e985b6ecccf717e549ec49daa6253fb78f8a78827cc43c37993fa5ec2599f11052a7bb97fa05a", + recoveryId: 0, + }, + { + d: "baa46d165d1ec421b6843ab08499981701b3c5de01a58a4b02cb3ba80f03411e", + m: "4b0f941ba8710672117696de3cda643648df6dc2c7959edee0c28360894ab172", + signature: + "bdb4216ba05fb5037dd4fec3bd5a65c7a59294c74b19ec32a011826a542256e8341256eab1acf01352d9608f39e8742d50f09f982bf38f72c80d1880c77c8142", + recoveryId: 1, + }, + { + d: "a86fd3eb8ad9d3d37f009a50b09b32330b913719f43eb048ebaa0f9fbbaaf268", + m: "c2a1d1614d01d25e1e3251e91ad5ddf10e83d9a7d44bd8d1a05adddea6b18c97", + signature: + "d329074711735c3b5f7f5c314086023b18dc9b433a988ee05c92cdf37627f1092a5eb0d3861e14e05f99aeeb9565c0544182c27f63639a73cc9d38bf0fb39c73", + recoveryId: 0, + }, + { + d: "bb26a90dd4a13c512f0d8f6f1da074905ad4b9560c7f9f209f15551723a0f5da", + m: "f5173b81734be541d9bb73bfb58a32437141b6eb35e8b2dc3151f0f3f991b7c3", + signature: + "e31a12be3d7140c98d4d7f45fe32e989ac2aed4d70c245930c3a2be5ada5698a7f948e3d418a5860da17f9ba494cf3784b621249c990c6e64b999911a3c2f77c", + recoveryId: 1, + }, + { + d: "50c25071b5c29283b8bb9550336ed59b3fdce99646ce6324aaaa59c968e573df", + m: "778f51a07f9e860fa7d14a0fb62152c4800ec388d45ce9c6a65aeaac72e835f2", + signature: + "38c53954da33cbd6180e3b5906b86835cc1b9cf5aca34112d80dc457ee1b8a315ed93730debcce3f68aa3c90f807d964b9d6b2c77c80aff1a667d8e9811b2a83", + recoveryId: 1, + }, + { + d: "555133899ca91c7ddd97cc27c9af3edb9ef4496e70cc34ce1e8511860ea54bf1", + m: "08124316476ac53fe4487ef2c3165c860d3f01468e9d30c11825f0bc17a58620", + signature: + "60965b9ffbc0e414234a80177aa838b266d529e4bafc3ed04113eab65b45eb9d0343c47f46e24244750e3c3de5a25f3c3f638cb18b27760b714bc1f281295508", + recoveryId: 0, + }, + { + d: "e50bfd99c6e5e89c8156b62ee1c54f24bffb324a1af28418582e3782d72cae7b", + m: "91c3ef215fd7ee42d317fd1fae6aa15b44edc73eddd41532ee9ff0f1c03a0b9a", + signature: + "7fea1bd9adcbdb508553112d8d0f2a4ed7d72af359a4e531562ab281e5b7c2122476af66a606f17d6355e34628afd8f9909febd4203d9586db07ce19269cf9f2", + recoveryId: 1, + }, + { + d: "1c881b8e49f196d5184489bbeb8e7a6a2ab7f51d77d9b28017fd8679037ff055", + m: "e8cb46e7de77355669d01b09bacf8ecd527096d24c4f09e80a8b7860cf22022e", + signature: + "c76519a05af4cc0f687c124caabe50f5c57bea9d1b50da128c45002a0c64558d12f4d424fe758a1662ec7289c9bc8a04d1b0dcddf0cef10e28e89546f43423d4", + recoveryId: 1, + }, + { + d: "a3c7de7cbaf64a0a4cfad9fd8468e1bb3095bff5e4959a6b42a767785c05f783", + m: "fb637b04c2e650271aaa9799b0503d24a7a23b137c5ff0a63237ea71eb6451cf", + signature: + "0c0824b96bd7294c4d90ea25b66410843927c8c0f6e6a53b1d8d5d94d131d5d8051194327305b4271cdde2d9c8e8f631045da4c602477097074d440120d0d82c", + recoveryId: 1, + }, + { + d: "297b2ce0495ddd2e9e617c5b3d8a3c2c09300d8f209e32a123d4beef9da9d939", + m: "d42934533ae036132f19d7345ce4d56d48f16feb3dc9bc0569fc47be9a31aaef", + signature: + "9c1e16cfd8b4d3ca5c004a2a977244f800d100afd4127c32370d1d3b0afab18b4f502bbde7cb44e0dba097a978acde6e8d00cd2c8ab9300b34f903faa014c0a3", + recoveryId: 1, + }, + { + d: "1d1c58d621ee8fa08f3fca8d7aa9602d9bba15407e4fafb969efa0ec087172f7", + m: "043025b23fdf5df31db166248a6cbb3053b227450c5dea527e029a74a913a853", + signature: + "91c5fa3aa9d374995806b69891a8c49b1c7dae995c24b34647870aac495440d71eed3cef24124dcaeb106f350ec464c7d454d89ec6c6fb8b0303a7b39dd2891b", + recoveryId: 1, + }, + { + d: "d49a881335672ab4fdb181de69cd660766d54de28cbff12cf1b8b4c6f509f5ca", + m: "cae51d0ec6c04438a4bcd243d6f6b1303889b3bce8d94fbe41144dfdbff6ec72", + signature: + "f215c248481e66a6fe68d3cafc0af03409873c5e58edb9b47509aa976013fd6c7be39851956f172120a4805983d625a0c67309c78c8c45969ca6baaa993413aa", + recoveryId: 1, + }, + { + d: "0e8d1cc340e6b70a3de0ceecf4fa5b74490d39737ffac68715ba6c5cd83a980d", + m: "eb841f8eafad007761270e97a46543003cd4c48d43984f774fcca28534bf9510", + signature: + "37fdc3abdffb9223d6080a6e9e7937b564b727c131a5502efd10fef2b198209a6b2770415855d6a8c6c50e9f49efb8285b3575996cfc6b147b2530da1628581e", + recoveryId: 1, + }, + { + d: "e53f4376b7324ed19854246a547a0e2a1753868a3b2b813c06581230de86b711", + m: "32f4163fec63f7b2774f54c913a228399e714a336eb1023d53e098d27cae2e3b", + signature: + "a9fecc6994358bd1d607da8bdbbc6ee7cf906fb4010f92efe919bb1ecb238cd0248f2be0011d6b34b1610a358c2d18476f30f6033d38abfc93d1b996f35d6df8", + recoveryId: 0, + }, + { + d: "4036e7a90aad754af8db6809b40d68dadf1787263231ecd9efcdf0272dc37d0e", + m: "10df7961724416d8ae6261b10d6b992dfd8258ddeff214e99c0a493bf6043dcb", + signature: + "97647394bcf527388f300d3c0401b706a0d5f86d64d997882aff48d7ee3559a277f0ac418607ea8490ccb911be6895aa74899ca40f43846f680f052b40dd0262", + recoveryId: 0, + }, + { + d: "ed6dd589d5859e9323ede19e6f16122616f69cfbdbe667eb174b8ec8ca30c2af", + m: "d9efca4ffbe38a5b7c021654ecc848ef8b004ac023327b1b41adceec86d1e397", + signature: + "2a00d1d125f7f0d43e93947bcaf755301f4610a5e273f58d735e23033e7d1bb7739e8b26ec6bcdd7c9a781da4291f82b08f39bed02a3b8a7041010dc8f4e9c62", + recoveryId: 1, + }, + { + d: "5084fc9aa782a33109607b8f5c6f78bbbccb985621faec527770d5ae6076044d", + m: "8bb33b3338e32202720d7d479521c6970079c70c8240d2875e32df1d74f7f059", + signature: + "e29f756763653f0c45530b79f82aa631cc58b522328072c5aa088e54074227693a33369ed700adab3d14e7a50941a3bfb6ea17ca95cd6075e18836b01028353e", + recoveryId: 0, + }, + { + d: "c22239d588c62e7f6828fb0c937adef74a7f06c706d66c4dd031d0194e00b855", + m: "67640de895343537e58a7f91d449c6743976242aeb01f9267e00ecb22b612008", + signature: + "e78c880117bee44f08ae46dca812a039abdf60afe777517f6ebb2f59daff3eaa63eec9d849934eb48ca9f406c0a38d24aac6add619f1c447fe4785084f29a976", + recoveryId: 1, + }, + { + d: "33608e88e8038c7a221ff861629f37752097735cdd0eddf468a79a67492b06ac", + m: "cbbd7d8d75ccbbdd877f37e4eae1540b7cb92299764bdabf1ed6cf8fe862c3fa", + signature: + "e2c6e558183df03c34065691413e0072164946d6805364eebdd8851d3bdaa7a948ae1a36cae2582779f64dce2ac2fb33ea611024d80672365c010235798fb19e", + recoveryId: 0, + }, + { + d: "6468d74d978568cc4534bd6dd535d1a21cc62f1423903930c676a38b4377bb00", + m: "150a6e7efc02ca9e1ea1e04525dbcecf1fa7fe06f546acdc5eb615ebb8fc0ef6", + signature: + "19f45717e4a53c621b69abb369bd5fc4751cad0a2fc8a0ff61b943aff4c192f37432491963ad8bf779585e2053b328a3b50413e7ea97014c59d55359ae0ee033", + recoveryId: 0, + }, + { + d: "e98b61bcacab457f7af89ff9fe5f21d02ba9eeebd841ccb05fc9938649a2200b", + m: "21c6bf8af736768a15171d61b9dc5a042c9f31a62e117fc369d7b13306a9c61a", + signature: + "7df922485df0ae7220711b447fb045496782fea3e13318f2e15bd20b4a8f825e3e82f3bfcc39e637c2d239f036d2f8b5eab211f3467a1868570aacde11961275", + recoveryId: 0, + }, + { + d: "ac7c6b875995e523aec0fc6aba2f50c9b26db20b081bec9c5da8db5472c6b990", + m: "1a3972358992a0cce2837651bba3dd206ff3d46c69e4838a4c45dd4271ebb84c", + signature: + "6cbe8ea3025cfc54f54ed45b91108458fd6d4f76bd7c296c828f486044b78d570bf667b4ac984665f233970ef15d98ed11348de82d5eabe39908e5ce41d79be4", + recoveryId: 1, + }, + { + d: "3cfdfbc39bfc30da56452dbec819b21a957edf9ac0de8808d19cb685caf41a55", + m: "9bc81c3fd7d71375776e1e2f119d875f57c41bb2bed3681d7627a3d1812186a8", + signature: + "5f1bca5d8a502ff94bc27728f9c07ac7caf08f86782411600d7b52a62d5ae31860806b6f5a2693d78b5b3889ba7e95a8dc217c6ad05f477877b816bd41892ddf", + recoveryId: 1, + }, + { + d: "f11e49c7ca194c8b8a543c6c962b7382306919fd77ed048afc2d04abb8a7306b", + m: "7cc315dac520de3277fa9b141bec65e4bac315c7ce03469b89d2ee6a4f2d534a", + signature: + "36f0d7cd77031a63ec9f22a77ada162c989089bd448d21361c6570d9713f58223f5a934d453e61156d7c7c948bd98d84ab02075722491cf529faed1485c2055b", + recoveryId: 0, + }, + { + d: "3748b288a7973a95a493dc3d57663e13205b5cf9557c477bdbf1811380f806dd", + m: "df8983f3d55a1a1c7bd674d199f857e6de07285eeb6482e0a7100459bec56711", + signature: + "d689f4846fed85b573a9198d6f4ed36a01f35e8249271b1d897691ed7136afbf3ec860535e6d4b9128a8239d992ecffbe627bbb7567de05d34430d568b8c4c2f", + recoveryId: 0, + }, + { + d: "cc586e2e2bbde03256549cf4432778f88f83185b90cad06a98f6af9791a0d1de", + m: "f0f45507ca470e1f80349a8528da5d48108514350a3507d0564019484f89267c", + signature: + "85e7c764ae9602b4af855b1499911883703a40d0afafd55eac0de9dc6f39f9160d52c2683e31d851d2f6377045cd0aaee4cef28b90f5d0fa2deffc8ef115f7d0", + recoveryId: 1, + }, + { + d: "0d826667ec3d5d71b0fc75690fb237ef7f2a3ede6226344ea59e41d6dd9090ea", + m: "bb65f22d92d27a0721243991f7e118c5aeb3c2a170b0803b0350da0d9eacaa57", + signature: + "8f4167f876d9d6eabe13f9d71e05b44b7b2347623e559fdf55332a36889455f55664c28e7320137925421e79e50e102b7fafa7938d865ffc7e995eb4cef49133", + recoveryId: 1, + }, + { + d: "33062fb835a622187896682439dc56bba8abde8e38dfc5c04f187ffce6640e7c", + m: "cbeddb931433a5a3fd31e4b72a8a89e24a4a4d2ad07177b60c4253dbde3f6de5", + signature: + "e69c35eb07a03caaf7f2e80699d9f1f431aa49bbaef0b01ba334c6647fb025be704ed400ea9fb9dce510c199a71744c4f2df97921b57359e130c215d9f0f4ceb", + recoveryId: 0, + }, + { + d: "974adba7f7e6d463f4316ab397976499719b4ffea467427460465c4cb4743142", + m: "516aa3255a0ebcd875e1c822094253b95722b6b549eef72225577f3c992d3b74", + signature: + "925936ae6e1ceab974b931bb68fbdaa0b7ec9257a6fcee2d050ec273ce6c883b70c66f52682bcf4fa27d4bb12f7a75cba85a54aa792b34f75861cf71ec237721", + recoveryId: 0, + }, + { + d: "29713b01f048dcdf0c3c52e885964817de97ef63221225772fead2741f4c7947", + m: "b9462d320dfd4261b5191792467ae2d080dc734518fb1ed0219c79392daf5c2e", + signature: + "f2b2cfb5852b866ec6c31b235a655e4dfd6a49f36662977cc0d0fc4daf4c353b2d045505b488bf2e02a6889e73fcc59c693030731a8ddbb3e1051fe25aad8942", + recoveryId: 0, + }, + { + d: "867f466fa310e05dc5520245a36ae513dd90dd1dfd672fae390a7556426ffa9e", + m: "5746896312bff9087a5972a3a91d100d27b78922cd3d5e4890a5e5a6005b22d7", + signature: + "523cfe85c14c72dfc6feaa57f4b94d9b98b944c6af41bc8bfe94a80ed55583a92313629db2253cc6eefec07f5bfbfbce447b0b83f60dcb65e7d6bab2c3c15b97", + recoveryId: 1, + }, + { + d: "1976118980148b91d7882e193c44cc1b33d728a1229d737847e382cd6f8b81e9", + m: "010fa6d971ae76b1c655233c7923e9af335af407837e921988f20dc870ae8a47", + signature: + "f1bf1a99296c9308acafb354690423ebbfd6795e56c6192cd485ac1edad38d966c42f8fb51b8809be325c30ad4fff607b4bfd312411b5986e841febbe9bdf172", + recoveryId: 1, + }, + { + d: "914ea2d6f9e770b91acae310292b1de7247444fd1dc81ee36c337398f30b820c", + m: "d8f6bc36d6aef76f0661598b1dd15dbe37a1a2a75ed7976dc92e4378b94d61eb", + signature: + "201a6b8392aa97260ade480183dfb6fd9392970ed57c041db10c6f19f2139886140e09d860910b2c662bf6be3a80756ccc61f2b57f0ed97647fd7ab4b4f5f5d5", + recoveryId: 1, + }, + { + d: "83472967785fe45da14bdd5edfe1c42ccfeec56dc1b75b53eed5dc67a39bc184", + m: "bfe9722136722816fed3d61cecb206f13492cb7e98421c7fec28ee1c0a7b04dc", + signature: + "027b0ea053ce826852bc3ab029143ada839a6429a408ddd2d727da99c31c71855a5ca6eff4e265049dfc2d9d56bacbb575a96b3dbe85db346da83a906e9c6f7b", + recoveryId: 0, + }, + { + d: "642f2db09bb32cbf9b8a0c78c1df6163929a8868e628cd2f41e19474347cef8c", + m: "901a1b9bbf926df3bb791429ed56015598052289d601bb3f4e7a10b444c762b0", + signature: + "1910898a6bf7de3e8d786ced538c7064e97815e440f8b5b8124bced3458e45230e3bdea23fa43a99de928906bb33703812c64ba57023860e44d36eccfa5536b5", + recoveryId: 0, + }, + { + d: "b84825bdefdd139fd496e0477a9cea30bd0e71d652ad47bf6be4897daf7393b2", + m: "e20b05b6587298252a4a7e7a5bde603a18ea3ab027ac1919c994557a21551b54", + signature: + "aae2433c2f690f96b93a1b4e96e10b50bd70257c7981a6ed10007d8decf5a17209149a3b1a0a295ba83a2c5ef78997ad5c44a3a633fd568122d8887587ffec97", + recoveryId: 0, + }, + { + d: "c904d189d6a8eea432137030813ccc72e50cc8f52ac75195a7dc0a58cd6fa47b", + m: "1b0ea3a6b58e53394323317043f6b78e753c605272de539e99a90bc297b6d13f", + signature: + "f5b513d439c1fee04a614cb41faf1f211511765cca262ad617e8b1f038dc60ea54b7dbab19bdcd5b93c84343a6ff5b752402515b895d5f2996c5cf31b73b408a", + recoveryId: 1, + }, + { + d: "c4afe704ca29f40c4a12e996a4cf223ad560e084d42dafc6e8b9042316e5c9e2", + m: "709fcd2e09567d1fda65edeac342ba73e838d3265001a5edaeb7f9e753aeed92", + signature: + "8f8130240140ae32f156e47194ba6893f9c9cc4132e4da31507128b0bfe518d96517e592352c979405ab53f597c92b05b2cd191ee101b75396cfeda1ca363101", + recoveryId: 1, + }, + { + d: "4a38084613eb8d9a117f31ddbda92eab5a10415c860978b7dd91294a8c2de160", + m: "fa0533f6a5ba750441edb932effb6a57956dd9f613d2561308d1e54dd6476f6d", + signature: + "191316b80b0ea4ad7fcc574d985ba061315a8dad4d2f204c0eb93446ea4fad2b61e9bcb14cf7432ff1fa855c40541ad0134228d1cdb88beb90e0758d117de2ec", + recoveryId: 0, + }, + { + d: "458a96f6425d78239a69ddacb4333e38109a007a95f7363d3d03d01601925dc9", + m: "e890d39633df38fa2f52e6abd8cfc578c18bd78e580a79d1af643e7558162fd1", + signature: + "1af92a30800a4944740cead48d5f7a27588c9ca7853fc4bc9cca8d0985a4deec60b6c82f8287f66970e7ec47fa027fefed46b4026578f7fcd51165b3417e803e", + recoveryId: 1, + }, + { + d: "7e996b503235729388b07e2786cab283fcc1214c851da9a7f56e608ed98a2c9c", + m: "c57d497697520ef4a7cc44b6ec49442249349d198442a3d55221c7699f2c6636", + signature: + "87fefc2dbb575050db4c667abed9af81208d6dcaa1f9582ee4c504a04df4130b1f0240fefbf058878f03a4f12f0f117e6ad9c8593d52d3c59ad4679478f98957", + recoveryId: 1, + }, + { + d: "dde8e5988bad83315274d14629b2af438201dc0a13caa04e8477df6a12a974c4", + m: "f6c5549590e315e9da60c978115dd2197c015a9c0569427990394a0f0097e635", + signature: + "dbd920f9a84037776c6654e4d9e3d19630c51ad109b21e4fc94075c2cad7f2b47d3872e85c0650a1dab0e3b6762d8d9250805d2faf26abed91c2d9288873fee3", + recoveryId: 0, + }, + { + d: "83d8bcd885fbd8652f8583823b240fd71e55476b5220aa42459d3a764c78d33b", + m: "539806f20f373a1df76932bcbd7cd9fce1e30f16e83ea08f4cf6b913a4cfdae8", + signature: + "c528192a89e7f3f66375c9964b0ae9f2d81c7c8162bd38078230ba54546cc2b054bedfe731d1c1afd80df21a3d4863f0bf1525a9f25a5db592c65503c5e88c29", + recoveryId: 1, + }, + { + d: "f6916a2f2c2d23af8cf8e0b290f8670fda511d1453a98782aed09dfcfe85c14b", + m: "13b943cff21168c97661c9794856efc6e7d9e0e32ce3efb6c019488e2287bb26", + signature: + "fec3a3e12397eb909833e23a5bb3b93b651475707af03c297ac016c2ed2d6cd9725897f9c2bc2f535d95b7e323b7c98b75427f2262be6f62184c6c5744197bfb", + recoveryId: 0, + }, + { + d: "10bc6d135a7a8c420ac8bc0a4b2a494913b645780df5f324d4873a8124e351c2", + m: "272ebd892fa4c832ddd3158ef6725f328ebcec01b29fe2accc6c093425e80930", + signature: + "24b3b46320a958bee250446f6e750f05d3659268bc2ade432092b6441eea2f125734d0bd34e7dfbeb53cf4b4a3f40401dc860cdf691c81beda875272235d5e87", + recoveryId: 0, + }, + { + d: "ccbcc7a26828ed135c291275df6674d84667fed145be30c1302b20192e9075be", + m: "f8e9fdbc3a0188b039acd178ec984aa1d9eb1ab3a0de106d0377473312b3c0ed", + signature: + "a8d79dcb1e37ad6fb9b6f9c7364672af389b73cc8e5be245adc3a34fb99687413007bb5ae9a0333d42329bac046c2a85489ea7b60f401b61480e3d960982d42c", + recoveryId: 1, + }, + { + d: "e06ff1445e0c8fabcfce11cfde9f74022a8041620fbf1e51de146d6d597bcf12", + m: "ae35c1eff2f00f2d72708942f59825037997779ddc0349859c22e21d6880ac03", + signature: + "82b393cddcded51fe8e49399b2cda69ac821db4b8783dd94009697eb1bd2853b35a20468388da33859eed7a164882beccc306ed060792a2cba2cad55a1f5f748", + recoveryId: 0, + }, + { + d: "cee075b5d0264c57c99d0cd52b88c992015a1a28d43b6a5f6e20879d67cbee84", + m: "98bc4f612332e96e8bfc72632d9c074941e5701b64d586255f2448adcdd6d925", + signature: + "d40bab51ff8573b3c31f7eec5458dab70c60e210c46783b888f4d7ad457787ed0808405e5e45d8784cce3acea1e41777061ee46b29e3a9d3f229854a78fab1a8", + recoveryId: 1, + }, + { + d: "ebbfb9f75918d7b562517d5093693e091b98929392abc821a7ac4fa2de974337", + m: "440caf578006f0deac21360ab7bf86ef1ff940583ae7b0b8afc4e99837b5e0bf", + signature: + "07d8c67f31ddb3511e34945ffe2456cb47a0cce1409abba8d9bcaed81691b4006161aaf4b4799fa2d5abbf8498ffa3ddb0eed1c675b1c8279910a567febdfe33", + recoveryId: 1, + }, + { + d: "4f50bfa701d43190c02e9819fafb1edce5cf8698bb9853470c5fe1856b3db529", + m: "7b15216e0b459d917c2043c8e160c8821db9f61cf7cf1487c89db73082a532f6", + signature: + "891d4cef6aee337f73c7847c0aa9ce1caefd4300cc8a9ae2c7204e37f7b45e7b367c32b74d499824be3d84e6559b73a2c84890332fd3b35bc64446a242a49362", + recoveryId: 0, + }, + { + d: "48a36a398040975cbe40ddc6419d2ba7709805db9037e0f8527682ba03697aca", + m: "cb11f7312230af4e27817bddcb664d7a9d98fbd46619df1f5d5f40557cea61a7", + signature: + "a8f816c62fc11e7c179463e5217adb9c8fe93a0da278984679e1c73f027579d96d881e30f43dff9956364b865d108e889f3a4ae3dae3ea786bbeb38488fa3e00", + recoveryId: 1, + }, + { + d: "c8c8df84414006f879cb4188f565bde032c00218238b4e2a10c6466099c9a924", + m: "a7cb4b5d6b0ada323d62209504eca67cb337fe84de0982ebee05a95e95cab732", + signature: + "9bd9f2dff7168d8e01876df7887f26d85bfe7996913e78d8d4c8b7b7775b18406b1b4cd4a97b832ddd2c7d1a25a29abca6ad0f2416ce3137d28a54169737ac73", + recoveryId: 1, + }, + { + d: "659e340659193e8df2fec52516d0ed2449c1d1f470be53597e57f8e55e4b022c", + m: "f6e1b327def792a7a2d938e3f3bd987b2885a9a67dcf604b8ec54cbe1f09985f", + signature: + "07bb552eadab941e400188fbcccabf0604016c84741ad939957238ada174095b2df39fa31c47e8f5a6443c9d73a904840b31d7c807d44e0cbd8d13072a820ba8", + recoveryId: 0, + }, + { + d: "c36aad91f7ea64ef9ad2ac01cd26585ea681eb0975e3b7740cba2675e134f2c1", + m: "328281fb07bd40f156d808d849c258fa7a4b1455494343fc7037521bb189bd04", + signature: + "66adfc560794127a68f9d9d910eb6d6a9604c07e39db594a576c1a5db42242f90d95c6c423545eaea13dbb20bd0f1774677826b4145c7db36543ff2929cd3c72", + recoveryId: 1, + }, + { + d: "674d3f1facbf8b4559baf4ef956b9bb8fce7c95321a5cb9f920390e0b6eb7451", + m: "cdee95cc54697ae6a47d824d15b83075a13e58983003e228798a7eda95b44f5d", + signature: + "e0376c730cda4e3068ad19f1ea0ed0ca43fac5abca1a6727fbb0c52773c5e8354b318be23032ee22d369f26e06c7b13ed4c6aecdbed7a6980e06393312943bcb", + recoveryId: 1, + }, + { + d: "ac2a0e71266158ec622d124ea61675f935f8f0ae64cc86784cf003aed700ac7c", + m: "122f78a3956c00dc1ee1d73fecf264c6b169bcabf79261ce4299dd0613afc21d", + signature: + "e36c6dd03caf80d953b97b7d2fd925ce428ee4ca9738eb77ca3c2397fba66c1b00df97784965435ef412046e84c76ca1db2f07bf11bf5b32a00c1df3ab16274e", + recoveryId: 1, + }, + { + d: "c4266dc1cadb7307491f44a03037aaa89fb54dba3b72cb746dcb7bcb58bbc42a", + m: "1e753dedd924d15546ee43d71e829321e94875d16b8c64dae0f69845ecf08c99", + signature: + "6fc52dcafb199e885a3a1a02bd1fcfb79552a096009f9bc5f34cc8270f48aa7a4ed3a114517836a7d8bf10c1e3fe16a9d1eda1ae4d32ed9dcdfbc0d16cbcaab2", + recoveryId: 1, + }, + { + d: "98ba0a1439c977db6b04c1f48ee473714e8bd8140e38d7e62424188934d586e7", + m: "0dcf39013562e1b099d70bd1abaa2a722ff73c0a6322932ee88b5b4761038cdc", + signature: + "c9a0f9e46cb22ceb8eff7e8b353269ce3cec72f1442a07d2d491963677d5eb393ae9b4f22aed7d605d86ad3491539f9ba6ce8c37123f98c6ec2c4335135af564", + recoveryId: 0, + }, + { + d: "666457632ce8cfb19ca691c2a20b7731f5c363dca767b5ac7af57fba9a26d2c3", + m: "df95d031da97b1634d1ea8220ce3bdd55826efd5aee10039feb4c820d291600c", + signature: + "156f864e0b5d5b8431b16c83f566ef79445d77d272dac343b9e2c06977709145614ff2a64dd1ec0da621de1b21c96e15a12f7d420c43f1a831f5d62a804ccb1d", + recoveryId: 0, + }, + { + d: "67d79624c272bbec5a4ac38e1df64e154cb7a5ca0cfe7fb2f27941be97db4c6f", + m: "5566c64c96608a1f1ef32a53186825a3305d713cdf7b157373b58deee14664f1", + signature: + "87add8420be66d2edf07a26dd582c2b8e9e9528579c25af9392ca9acb283365445bad2472c88bdf4a77cfdf65a56e448d72376503fe76c4880a17378d4f8b098", + recoveryId: 0, + }, + { + d: "bc8acb9486937ba6a6f07ef64b2d1bfd7feeb897315749a6259f0c7b8de985e6", + m: "a07be3a3b36f58e29858240d4a125d84b686f04ab0f7073a9b8b6f5970ee3db1", + signature: + "32bdce672fc75a33977e88994d0329ed72a030c4294dc36c1474d710fe8b0c652d52b63a40e1761f2f5c635dbf14d045b363ba06be13cc85ba6033cf5df7027c", + recoveryId: 0, + }, + { + d: "19a5849f17b540e1ed6d3a73f9c6cfcd7830f46a27c092b4e5dd5ea63e551893", + m: "a7ad0dd2c17e4b5119a7cced2ca5d0f8c7beb29c64b936cc047a3019d3141d15", + signature: + "636413ac6efe1c1d7222f1f4193e27946f3b9d9dcd92e6a0eb991490eec808ca1deae05258bd17a0b243a206acd30937b22e02be1aa96cca34d878fb7e5beb0d", + recoveryId: 0, + }, + { + d: "30887d3dace221d10b34b76f64378580e409febe3b03a3059947996c6a11a158", + m: "d36a40fea270a6a1da45fc521cf82d1646707ea716ecf52d014fdf8046db603c", + signature: + "63484130e836719051a823a17e3d4d8c6181b3e6073cd6866fbee4c82c4900320c59e29094d38324e39f1ef78b172185787686c4b924e86943d8adc8fc125860", + recoveryId: 0, + }, + { + d: "40e1304c61e7c8683fe98b1b59171acbed363bbb3fb11b4a3d458a6fe03be3b5", + m: "9f14e167e5c0da41994f9e18efc09c3a0058aaf4b7993b844f2513a41fd85a94", + signature: + "a0ddd2315802e7f422a6377d1d5e4ae8c96d435bae6da1d4aa4cee44062a50bd08835981c9894ddfbb18815183e666d5a321e90d32d49a581a5af2854b6beebc", + recoveryId: 1, + }, + { + d: "4b414c00a9c21dbb2935a384698723b6e355d18243e2dfa5a773145f83c3d238", + m: "c41ff3a6f1a8732dfac5810fb23427ea6c0373c34fa68e700c4b8a56de498d6e", + signature: + "5b23c01a56a64dba990a9b04aa1cccdd3303433f697c4b8c93acac143c763af8041f758c9fc6abcd27f2f90b4484d6b7d2aabe585d31c3fb91d51e9775ae2ffa", + recoveryId: 1, + }, + { + d: "1da29e6d22023af6930c781c18fda3d746ba28d5446e10bc75fd592df43aa59b", + m: "9a1ecb17e312b315d21ff2d340b5e798de816abd61d18843e2337122cd6dc59b", + signature: + "8f6addb778154cfa38d7ab556f7027c0136009a068eec0dea352cb21c3112d891b5f4120f4757175f8d777fbf7bd0a72f9962bf4a96c6e491ca94c3f40f751cf", + recoveryId: 1, + }, + { + d: "fb470646c08a3f06fd2fd705ec318bcaa89a10519f69ae205d677e49c9b0d5b8", + m: "051a8e2faff796dba06591993765c872af464bc674ddd584dd8731833fd1a9c0", + signature: + "ff2ef1679663a589190519ed077f2b177b9f662c369208f73c96a4498c0e8e5d3175106cac85912f47da6ac241a20ed85b49672b25cc96088af8c4690502b637", + recoveryId: 0, + }, + { + d: "c759a0518a392e5ee7e0793942beda5eacb368cb5ce06a9e47949a130c288241", + m: "685a9fc1e56e32de75c23a99942dbb563d0dc6187c7d7fdee2575c60745d4205", + signature: + "8aefef625cb88af9d638b604a4aa07b61567da5c860043a8dc1fb0b5fb221c236396c01ed556cf1678418e1ee6b3d3efb11951c21418244e9ece5fbd3bf00410", + recoveryId: 1, + }, + { + d: "5a461771ab7a708afe8452d807a347753158665debd9cb505ac620cda94146c5", + m: "60b4c2b4e1df7bc12eda3a961153eee635e8aeb688c4d31329eac507caee8749", + signature: + "f00260f179d9fab975c164ab997c0721ef399121dba4d2023190f5b64f3235c0414e1f5cbb85d753cb6871eff860a23203a44f13c79c023aa2f038ed47ec6a39", + recoveryId: 0, + }, + { + d: "608147e84a0e7a4532ab76cef330c55fd70eb0d570840ac6c3b5f547e041b77e", + m: "1e27d3e4c726064771f94d1f278d78de882bc11750148e51ec8d97d685c306b7", + signature: + "7ba14c740ecc180eb3f5c4965c549030a00bd487286cc9d90a8490840b432a244d25eddd302cea213890fba29b69e1ac727eb553c4888750f483391cf072ae30", + recoveryId: 1, + }, + { + d: "7bc5be458e0a06c169abd881c920e9cdcb53f16ea6fc98ee4d46c79a6285a9dc", + m: "a61ce02471429f51d14ab6b91a5c3d45839303a0103b7813db5a98d31145bb35", + signature: + "4161cf1814e7a2b0a90d40d767258aea0e4f78ed511b1b5abaa59d0a6f2b115856f11c16ef52d68041afed870a843daa30fa6ace4cc887c63e0927a446c5c7b6", + recoveryId: 0, + }, + { + d: "d016a137536666250c03f33ac70e8ddda1f42b82c3a7777e479e11a5daf175cd", + m: "9eb6d17a7324a17b2b68e0eafcb867989ee91d667618ba2cacaa892fbbd7418e", + signature: + "2206a8a7e54281b356758ef8a25ba69b869b392784d16d35253f1e29b5b168675700bed2c0edcbaae7731d4440e05c0714331bb67b1749aac2b16b6181fab841", + recoveryId: 1, + }, + { + d: "ea9948bb6bfcd79e1279564f32e7f94bc3db39a818da07fbc004fdd0058f2e6e", + m: "2c293501ac6e1df95d7ab4a14f191b15979c26433636b5cacfa27fd715b13e3e", + signature: + "8e862a8886ca97229c03be5b19e635a7a48fa8d03ff4f8a00685b931e5655df011c47dc1bf5b875af6e9595202ba5d6eba7e1901ff7c4f313c9bfad62defcdae", + recoveryId: 0, + }, + { + d: "8a70ca75056d1cba7580a9fbe19dc1cd9e7a1bd380a63c26e15ff7119875bf19", + m: "1889435d1854843437141e9b1b09cd9b928c8e78914a24da21b80f76a2818167", + signature: + "855e4a310235da07970bcd32b141865f1bcae0ca3fe83077833164af70ba479d59a32cc8f0f0bf0f5f423766fc107a220f47287190d3043822b82dff0de76b43", + recoveryId: 0, + }, + { + d: "04feb27caf6c1b29c667dad5e1c270f78dd4cd9d9885f72ce46ac8c7444eeb66", + m: "44b5fa1c9c45aab9e72237172305488157d0e7cbf4733db9362765b9edb3adb2", + signature: + "10b0bfe5eb3ff01f97a11d46c98807cea339f2f26559219cff1b5ca65a978a3e655bfedeb4fdadb371721b9383067e33bbb05e74d0bc1f69014e91f5b658a165", + recoveryId: 0, + }, + { + d: "ccaed0eb3110d7c830091abde6c237d4637389f1e7e38a297e86740810cf6087", + m: "d3f4ea106b7a0e09deb57daf4c4a795605c72477fcd1ba926f92d75b2066fced", + signature: + "7d7018f7804781f367af1382754e4f07b5336b858aa3ec1842cc90b54786bacc7f39e45139d10918b055fe53c37c92e54d1412edf5b8f4f0a5d88af4aa9ce780", + recoveryId: 0, + }, + { + d: "08c25ce9cd24b8f39024a27e48c8686f438bfa836b47ddec3b0fc54291ae1fe7", + m: "9280dcf47569f96dedbf32c8477937d343026b144f3a2c5c0a822bf05da76392", + signature: + "b57200402c508d607c78b1d1c82d5f4a58e7f68a66dc71849f28cd1edb9832d00fe36d26331666ee9f0689645628174833c271c1fe46648e48b335f6ac92b66b", + recoveryId: 1, + }, + { + d: "4bccab88c286a695f36392c8b59ca4435421fd302d4f42bb309b961c7331b737", + m: "c06c2890cd4a5c16078fc4f241c2c141d8c45b65ba35e430c5e16d5876926327", + signature: + "40fcf218f74cef901defe0cf63f0424c355f7e4bf49069e5fc40d5d4f636b18f0456e314a7ee97aaf976f2454100047ed727cf0f602b88faf3e311af20f8dda4", + recoveryId: 0, + }, + { + d: "3a81fe1f03d9bfcf3420eb0df302d33ce050b3ec5771e0fb5a7f4a0a179fec53", + m: "b2eb42c89d172c20b4e5fb3f6e5c178cc996f6d92135fad3595adeb2299c1e52", + signature: + "5863f565c32ac7e8c07f4a93823d9afbd40608e3aa558e81cbf84a954377b9853a66d6f457dfa1a08860361894597b05f4af0c7d01ccd1d37207b98d576dc3fb", + recoveryId: 0, + }, + { + d: "4e3e701e39654f4f45c217a0c291b5167954b7ca6bdbfda26e28883f61fbf401", + m: "c15df27381263cefd5ea2f89e027598f37ca945dd8893acb14956667a162ec47", + signature: + "36c216cf98cf3035dfe6abc6217a95491eedc7638e42ff2a03a6b4718f1db0817fda2e1472c5ad9d1b994e3a3b0375e3fdca185d1f1fa6f3f977a64b34e17b0d", + recoveryId: 0, + }, + { + d: "e6e60dfc74c3b8908c66b5612e406c0b4a944d705f783949829e5d2c9833e301", + m: "b8c5736a950a56ed4363587fa344cf75476f2876c5a745c00c286e602b056df0", + signature: + "82d8210cb5504506ca836096803bbc39a6d8db46ce9555c1433fd2b6fa1465973dfe234bdffdd71400e3f7fbf8ee5636c083db4a7e183f6d0d6d8d940899dc6b", + recoveryId: 0, + }, + { + d: "c238286974ccbdc3563168e58288ee0ce739fa7f9da385c884d6c909a4406a7f", + m: "2b5b636a840f86b2792802aa2980d693d76a7cab5688d5812adba836b2e0c358", + signature: + "f2f2760de4d7913fff18b0e92dfe91f9650969f89c88cc0b23854f4d9db606984fa5b8d4e169451c45833663b35e49332544e8688e34ce92c43c25718c19249a", + recoveryId: 1, + }, + { + d: "11677fd7f09c8aa0799a2d5c9aac44d89b1111593c67e475c15c1a012bcc1af0", + m: "c05063b4918361e7ecd75442a2a26c538aac0f21681e6d37ba3bb94b7d738d62", + signature: + "fb0819e691d926e49b0aa3caf0f38a89deb538688e4701c2f4c9b36418aa5d742493ea68adda75555ec67999f745e25328af8fba923ec67cf86b652655343913", + recoveryId: 1, + }, + { + d: "e0a74c1569a7d3742a0f8432ca8c2b59308296700f5c00e547843f7e8a00a574", + m: "84417145e4820e735538ddd48c1020dbfdef75c69a1eb6d502dda07531698643", + signature: + "ac581e13120ef17f403d689c9cd79660a157d174441bf10e945eda7cfa8577f045907d72e6472b7d10a3fca9356f5d56c9a5a9721d804119aadcd606a1ef8bc3", + recoveryId: 0, + }, + { + d: "d6f8bc2843b73bd6d1c48be4087449e2fc47b3e7eb465404785f3810f73fa28a", + m: "d4ebea11d6d6d3f4ed121c0e2df9311e443ec628dc0c89d2798a72df637cf746", + signature: + "d20ce43f1a62157de7df6693f3485fb49f5c00803cb02e7ef246c11b0e00fa783d2a48d00717a7eff4d849eea0e44c2b922453d472725e9e1d7a6e88ebaa5658", + recoveryId: 1, + }, + { + d: "d5ce9a90e387283841e460719a058869124ac85261a6f0cffa8e1ab8cf14eeb7", + m: "cd8bda6e115eb862d1f49f6d6b5686dcea424714002bc93a58df0e77cf2a0787", + signature: + "1cbbfc1d109e734c1f46e4cb6ff444a04c8f02960c55f9b3045f62500accbe134cf7d70da504016e77f4e19af5628328ea3b39538f7395c7ae9ab0c79669fd57", + recoveryId: 0, + }, + { + d: "6b12d90c99fa7811bbd8065a004684d09daa1e4fd0a1959e5ffb75baf91b098c", + m: "8efabe8a773f91e9aedbc99f31d45dac26ed11c4e3f562e42f50fac91ac07a30", + signature: + "1f113b1f27b09a0e6dfe5399a0be142ffabc93b35d07567e76bc32a70454997f74c334e3fe8b767940c1bd53d62021750a09d1b1cdae20a24f271532ea425d3d", + recoveryId: 1, + }, + { + d: "f39ae92196c4d47b6ba3519eb1701812adbceb3ee17acfe7fda1890e99cdf0c6", + m: "72bc86a399c346fa0a4241ca13e45102e54d01f4f4e1a0db8825be51e3da9d67", + signature: + "35238ef2b6bff6fdd1e15666ed204829ecb2e98796064ac638b88c9d2d8ea24f0f19f310094be05a0d8c5937ece576c020f3458631ff07b0ba6b4a2e03c3fa0e", + recoveryId: 0, + }, + { + d: "1a6497635d119bfcbc75832edf744195ee3269b878f2c6b4bbf954898fb930e1", + m: "eb15908a46295e4a2d681c0c83642b0a4cd6ac3cc20b3bc2bae50e9625d365d1", + signature: + "ea60473a32e5592c97c0daa2492b470edf53cf2a8caf013cd453f8c9b8151aed2fc0d646bede0624b48edbe9f1adcf46abacaa4ba41b3355f6b3057f49b5ad4e", + recoveryId: 1, + }, + { + d: "b6e048e8160c580b814f24b0aff75540f3af66d6b59cc060ac30e7a457cb3e67", + m: "d0f8bc614aceb48aa5e671a7ef50c696873a18b32374331b3f187537c812610d", + signature: + "0b07035f50bada29c5c25e1d8a1e02c9312de94ac0b162035d16345940fc3e374bc1c42644caf06e3d249ae37da5c6acc3f070865be36d4f171bad647de96481", + recoveryId: 1, + }, + { + d: "e0f507ad00b9ca74975f71acb462fb39ae8bb41d17add9579d19bc9258d6104d", + m: "57bc82d4cff8868e87bb42343f0c06a3a7522be312a254ce0af501c52aef1502", + signature: + "c7c6be13c0d9489e592f836178619ced8030ac7ae9784a4ec8d9008dda6929a3600eada2952255520f0e80c828a4b4c9b36941370f3a0fea8ed8b4bf7cd0b1a4", + recoveryId: 1, + }, + { + d: "60d37971a967c1e66b09ab75d7c7705613a5680148640ca542156646cc6ee0ac", + m: "034a2999f6200128868a096354859d9220a87e34f3ba3041a847b258fe538e2e", + signature: + "5fcb7711769df8aa4ebed94dc70891604b8ebe1ece88723804ac7a3755aba91c74074ac34acf117eb9745ef8b3e816d922a328174d88c9f677a504bf127508d6", + recoveryId: 0, + }, + { + d: "540f031110c20065d3093f7c55ce9df53ea4cda56c1e3ab2dd2db2dd2c7cfb52", + m: "070541db65c6f64725397193f983ba065b032bc2ca2241597cfeb167aa507a54", + signature: + "f43e7ea26c8be07b880525e4a0019a4395a9695f50cd1a01a7904b6c15036d0b7422228d13d834734e78ef21b48165675336b293340415090b3e57fae1a9bfae", + recoveryId: 0, + }, + { + d: "748a4c8e763654674f0b8d0c0c1640ba9fc7aa7dfa79a768d4c4dece578236af", + m: "46e8959dc030a0facf9590147867d7903587d95ef12540c0062908042b0dbe0d", + signature: + "0715f100524cba5f9203a3c8441e35060982be4e5470f0d8041864531f4d6fc079a8bb322851a47033c743e18b34ee8c9686b995711c1380e8c351825814fa4c", + recoveryId: 0, + }, + { + d: "c75fdf0149b63a140f8dde397c05323f3065867c565109e1d20401973c9c6eb6", + m: "8db3d82d89d0d39239df98ef03d3ca2d76025e08314fb62fa4f5389fbd5839cb", + signature: + "1f5cd258e19897e547ac89541519b19605baf07d6de6460f2123a861a6656d0709df204999cc18f294df42a12b2da37cfb2479457b4d2ad8117acd78963d8548", + recoveryId: 0, + }, + { + d: "1843ea92bacc2ad3e270cf5a02a5e58dd9e6d5aa238ad4ee31a5a4bc45bbed77", + m: "73df5c24cb7f0913a4322183328101fed5789f8dcc36077fda1922d39660501f", + signature: + "f9d0a3387f98e24ab4fbf36877bb5d2726bb1cd6aa484d9fefdc95953e22ba9b24a72e41f843b847cfafbb408dbf2d6055c134dcaa48195ceca2ec1ae4bb31e5", + recoveryId: 1, + }, + { + d: "39ad72de9d8afe319d21b7ee4f185b3d61cbd2d594ddaa0c9a25daf1a077fbdd", + m: "50e4a5ef6ea7485e33cf9f539eb222ca602cf00e71d772f9fb15819deed34ebc", + signature: + "69bf904bbdeab3f53ec77bf599b2c97414c659b3fce48c0fbe778cc4d3ad9d3f4e1fd04348b501331aad88e5b7f33283b667357b31d7c81b382389b3f5469261", + recoveryId: 1, + }, + { + d: "e48dc4153f21a16d9d26a0c008083128cd3ffd3a7bbff0f1d15112f57da126e0", + m: "684b09f9d1dd287ed4a2664478a348e62c6b18b25ef032d1da45ebe796834de1", + signature: + "cc418837aace4da0fb657940c770a4fd51bcc9190c16cb9a095717ac6a24dcb62d69d61da25114ecfc809a5f3dd4c917e68b1f3365007b1941220bb4ca2dad44", + recoveryId: 1, + }, + { + d: "56fd561b22e865237939bb59c7504588af37ecd140a56804e1dc01ea7e725f0e", + m: "59c933f3f8b2909a6b32ddbd7914862a4f85ee9186ee895dd827633f433a4575", + signature: + "b16cd4875ef7e9ccb4abd8009ca2fba53ce89b637e785042d85fb18c7f02f1c40d10b63eafd1c0d751da2782af8ec4137f11b13467054cbaae02fd6eecc0008b", + recoveryId: 0, + }, + { + d: "6c1949f6e90ad3c72781140af0a4f46c162b9d3cc631c401f1a3dc716d28ab47", + m: "88396ee30cea8ea761d3007fcc05203a9d27d1d7ad367c8f57960e5623dc2ddc", + signature: + "47e37bf2036aeb516f9974c1e61768f0abb0a21a3ca547e5e952442548fafab33d240ee7154ac75f17afa44ee2a56307248675e92b67da47da2e564bfea8a405", + recoveryId: 1, + }, + { + d: "62fcf1cf0eaef2954f4d81ab373ffa9e70d1130a68e916c33648633ea9790407", + m: "d27e38d07470b7c8a1556b11730a12389b3a468bacb149d7187f7ee98c8d40fd", + signature: + "6b6e030ae93dd9d88ce4198caa7633d098813b38eccfab50489f96c00d4e89483cc388c41d08853f273d3f4e6ec846fcaee77fd92ad7d004334fd74e4c4f76c1", + recoveryId: 1, + }, + { + d: "d7cfb2619294dbe34d42709843311b1d820e33d2ea3ed02a1b62b6c689088130", + m: "65680224dbfdf54c644aac6fc5f33e227aa869d3f524a28906faeefbb8147d56", + signature: + "a229bda53620e280c2870d84c52633e32c2d37b042cd6cc1158b78e427ab53676fe2ac7ff15480cf3f500122d3629bc89d805f385461c55c1574c32f91b2cbb4", + recoveryId: 1, + }, + { + d: "3eb1d5eb10884d0684740992e320054fcace80b65fb5c71988a5ac8467f3b629", + m: "0191fd296285491604c34945fd5a7116aaa452a4de3edaf67904f1b182b389dd", + signature: + "3185053e8de30224e7a58d35a047f8923d50c8c8188d476219646867f031920073e8df7985f5e19a802f74b749e2220b5b380b022952e3bf2c7b287910c5761b", + recoveryId: 1, + }, + { + d: "846d8feed0d997a41e9cbb5cfa0d0d1c3a6298d8855c80cacbb5da7ca1fba6b5", + m: "5dcd398880c3868aaaa3ad86d419a364f938fcee90c5125ebfb81715cdfebd05", + signature: + "7e2e8c086fc1afe9c26a918e417fb50e22a1932c6e16fa3796b55cb2e49188215469e635c8991b19baef086bd27adb6e5ebf9e5bc8fcc94be7930d18c61dede7", + recoveryId: 0, + }, + { + d: "256bf3a4dd7d2789139e67c52c46aca7b91d85cfec6f7ce2bd91bc40f669be9b", + m: "4475b75696af62084d2706aa316b2b95baf5906de0438c94de04918e4d386811", + signature: + "5b78ea583d272b020b987cbd0c691455b309ce831f0f7246a5cbf53437a271f708a2fb0fa86e08b790aeb49d781de47324629e05500e1685ca10586c3da14c84", + recoveryId: 0, + }, + { + d: "17bcacfbce0001f9ba71c0ec2c44ee7dedafef922ff81d989fec7f42b1f84a2d", + m: "f84ce27180687481fc89d43c65948493ba30b819591f5b2a1aae03f21241d55c", + signature: + "2ce640bddbcb12d9d55693eb148b694f39fadfb3aabada93ed1507292f3c0ed86d15abcc10f41fe518eb578cc84b241b96104f6406a48a6de12cb8455b566af1", + recoveryId: 0, + }, + { + d: "8545197ebd6f1a43b3cd74a50e1564fdaeb7bbdc756445cb579a062cf4aac499", + m: "8f323774d03981e0c533a05ccf0368f49aae4c257eb278da0138fa6bcd0f6e3d", + signature: + "7611b35a28e8e25947766cf6734cbefa95d8cfff6e5e999ee7540dd2754b8aed046ff5523c5a2adfd17f3454d0245f7ebd83c696191c74820ed4ab46b5b2a3a6", + recoveryId: 0, + }, + { + d: "3dae041a4efe3249fe3ef6a07123eb09925bce710ca8dc504cb8f148cc3331f3", + m: "ebb975d7bf6383a4c19a731dd18d95528d38ab92a3f3c73013a7f2cd67faf232", + signature: + "fc895c99f8f5c7c4a81476d843b1dac84816594021971e5a0b9860a169c47bf65352e75d6ceca43ef0ec47e0874bedec9702ae12b6ae6aa06a8226b794f8e1d7", + recoveryId: 0, + }, + { + d: "f84f5293f73fa678d7a32de08e15a91439b94433e83e82bb9f4eac5538461b9b", + m: "1fa81d48a2aa23ef44f66af5c2dc9cf916e52a012e7ef2be3f2bd39e8e806423", + signature: + "6b27f44746772a7472e85d91bd60432b4ee068ebf7363aeed4c8a36f14307b1f445718f41f032087b5a98ef34c13aabbac735c31446df5e119e1aa65631a00ac", + recoveryId: 0, + }, + { + d: "81ecd3c075ba9ef096e705a99a7b242e115a2b012a8778af473100813a1f1c4c", + m: "932b51403894ebe982261d122c9c458e9ed33bc40927df37aacb6918b97b5bd5", + signature: + "2524e79fe54185bb8470cf42fc1277e6aff3b2a46af02be6f2821979b8f7c44e1b5bad0910ef1af03c30e656cba13805b86ea93863cf859df496cbf232bf8a77", + recoveryId: 0, + }, + { + d: "be41a3f49c267489139c0dc8ca44384a05ea8f3cc3bdc8c87106338bee877401", + m: "5bac612b48480d5adbf5eefb7023ed13e88dadb4a68f798724a60655c93d6326", + signature: + "2527ebbecf3a80386f1c81ecfcefb178347c0673a14995457dd7aad4bb239af3480f18e719ffc380743a3631140ad1af3b0376fcc82a64ad08bb54da894ef1af", + recoveryId: 0, + }, + { + d: "8778813a664cfe9a34437fece83f9e2d146671483a577413fb099d9cb2a4a9e9", + m: "fc91bcd42718deb04e5168fe3ddcfa19d672d2c61cc5e9e7caa64e42470b6d64", + signature: + "8a0f542b21f71205ef0065d2a2219ed73bfdc6aa178f4bd4e75e48f0bf48955740ddeefa61ec67d7bc6b7f155737b229982b94db8b45bf08e9d5fc9e46a78154", + recoveryId: 1, + }, + { + d: "a319c3f162ba71485c51d438043fb4245dcc1968a1666600ad0d3824fbb4b7aa", + m: "457cbe61cba6c4d50436a9e5e9a21be33055ed957d712de9e9fe5c5698e7e54f", + signature: + "64cb5fe00f40096c7e74bed3117780eb1903fe931ef073d1ada77c302060d55a03e7a841dba3a964834d1ec67a3a9bfb01eed6a0bb3d466217628b2f6315d126", + recoveryId: 0, + }, + { + d: "ee0f05d3708ccf4ee1c7d0ef42ed905a9ad6c6b428726ca191a80b5c6b18ca05", + m: "c42d7363d9e2e1fc6d5272f3d57f9ef07fce202b968596b240c28e08d85967c2", + signature: + "22f9d62a7efcb7f309459cb424c0d4c65a07a34e5d38c951d9060ffebf8041013c1b9561f40b52a85c8fb503149547bb6dea4b9c9f3704d88160b543c6335ba4", + recoveryId: 1, + }, + { + d: "2d0a0e6a11c54161f99c301d176976ef91b0eb62580788760fa4f82c55aee71d", + m: "2ce774b477f3e5d8c181d2cb0cc58a75bf4b9eef15856af96c0c070b26bd0746", + signature: + "b660d8bad4532c4bfaaafd4592e9370f5770ca65044d94803d6e1135d0ef3e850b2feb2674c5c362612b9a7d5b83f68ad174ddd036cca73f34754c2947e1f2f8", + recoveryId: 1, + }, + { + d: "8f09e47d526296ec1356bc9f4bd1da38860bcf77f2d7570489b51cba975bc264", + m: "bc44d917f7c0551b739ff3ce9bbdb92041e916171c383356f99c9569e2edaa88", + signature: + "bbde4bd9f3dbb3240127eafe763b95940b3ba930c54065213c85120dc16a050709d657741f22011ef5513a7d096464e725d40826efb4f7d4baa19aa4e3d2d5ec", + recoveryId: 1, + }, + { + d: "e7306c28456816fb7cad74526de164a569af51b30763e22e7a5215136796f498", + m: "83a3a526ce8f783aaad1fe2c2b9a0f7dbb7266d631fec3366bb4f669b699c7ee", + signature: + "0d54ed40f33be9e4062fd66f889a1337a55723e6ee0fea224497590fa51ef10147ed1b3e23cde877211490940620c754cb496d859fbe9c2797369de82d11850e", + recoveryId: 0, + }, + { + d: "78d2afd1f6366626c5cf06a9578d11809617ae181fac77eb9857cdd3faef5659", + m: "3095f27b5549fa361aaf6a542a8a124ef36c6ebf7db1327e1e52b19ec05a96a4", + signature: + "645945110f8002329a420db7a924591da32b17505faceaea177572eaa4af9f9959bb909ade5080a85696d844df139e2971f566604a76411d450d4d4ba0120920", + recoveryId: 0, + }, + { + d: "3a009d4e8c94268c2f4342c2ca77f823e03315563efd3b691b8b6c4eb9c012cd", + m: "43fe613e846d209c3bfe3052533884e3eb6d90da75959d67769e169f4d6548f8", + signature: + "903fc19b5ac9dd45214aabadf8d73d3d62860fdfe75a0842677358493860f51765e062ebb5fd2b18033ba19182033744ab8d3df8fcda4e4d7686e2e476e93200", + recoveryId: 1, + }, + { + d: "70ca91c43fcb6671d848f74f80f24bb7424cf2bfc5e054c03ff7ea4b04132e90", + m: "7be50018c556cc2dd4727eacfdd7bea5181b57f97268a077bf4c19c03cda8bcf", + signature: + "5424dc23e7b39cd7f5a42ea53ebca89bf6e558f13554b99b373ffe92a8d4c45f0600eac0f379a0c9f0206d266e1c1d8759ecababfd8062db8c649a1ae879e9dc", + recoveryId: 0, + }, + { + d: "d48141211781d17b9b5dded77390c739f9e4c0f3f4ed5fab5c7fac0599faa6bf", + m: "a76ed02680d72bdfb082dc26ad565f31c2133a444144170f436b672fd031cfd3", + signature: + "cb4c2bbacce1c855d4c413aad73587454174cfbe54eeb1e8acd683284288bb076311956d0cecfb34774fdd8f9451d2d6d506abe648b3a8a13c07a3dc14814440", + recoveryId: 1, + }, + { + d: "c2647463c5886f8f7fdff9e06ef63cee441aa541615de6db960bbd58bef314c5", + m: "0d5adad66067c2ada01db17031f844c991b52a319d17b4b04f0ff3f64fad6558", + signature: + "94e00d2549ec21f4d2e87d214afb0283bfbd11ec68abb2a5fde516a3855c03d662de31c9059efc2a4345faf9de2de7f2a2ea4a92ab404e30f675ed836c26a949", + recoveryId: 0, + }, + { + d: "abc1a1f1f9d4963fe68b9aed0d7bba174fe6c80115a519f05bd69d10406de415", + m: "3e7dd1358befcaba77d3d31184fe34a2eedb17c89429b0ead99e0bc1b8f92415", + signature: + "83aaab9819f34d46742e8d667017986c95dd423621e2ac92e3b655277bd69fd659d884627da06f0032f96ae8a9d184449c659512d663c4c1094f7f091b53991e", + recoveryId: 0, + }, + { + d: "1899cc42b89e8bd594c3e8b1d3ce176c09345d2de080a43b10739391e5897101", + m: "dd5231e77b211519005c19d88a477d9ccb5a27a80cc837ec2b5c84496018f76c", + signature: + "2fd1c0de4d25c1bcb3da2b97f832a6c125784b8e1d0a6b9d5778fd2073d0e90874f69edc3b118bd1b6eb44818698adcd259d76fb7551bea624cea0793776417c", + recoveryId: 1, + }, + { + d: "f14c1f8a2d4e0cd9f0066dc2e7edfacf151ef45f42a294f908a0f0cd700d73f1", + m: "bd67766899a56d8935e8dacb3e21dcc2d9f129d313772e7f36f82419e48e3a1b", + signature: + "e5633068d69de5fe52c3207abcd0eb52f039ade89608537c82ef969bfb28a885209b76da90491829a7ebdff937696ad9b0b40842127bcd9212323e3a7ec09509", + recoveryId: 1, + }, + { + d: "8cd73951bee88395df87025305e66fab3ed18b6ce536f55768124f3baacccebf", + m: "ebee6496cca8238beb4fd0834e4428ed20d1a07ebaa8482aaa4b5b97a63356de", + signature: + "0039c6abf6c7848a0c101e7baa9b40a7fdc63ab6cfbdaf5c392a5280009b57d80e202d27fcebb25f75ee0e3fc9ab6d6189aa3021cf59155f344e4b775d563b78", + recoveryId: 1, + }, + { + d: "5789bcb48b79a00111e1f24daf1b67c3e565994e5f9c4f355fc98f15a2a3b014", + m: "59e26e874f2fe7809578d6ae670312f226b61463b254364e008892b2a2149986", + signature: + "931f003cf9897322fd10d8b08a98e995a48f9a3981f31e0c94484ea5c26843886b6015f605bdf45114321d181171a4a5bdb4f30fec8ccb44f4a3fe559ad09c8a", + recoveryId: 1, + }, + { + d: "375c71dafe623c3578f86dd360d1b25001b7a60e3d03cc8975e39b7fe04cfebb", + m: "167b674d9592589bf356f16899dcb97c611a3fa9c436250cb44a816e717c2fd0", + signature: + "5f438c385265711ecf2fff9a0e082bf9f291e07fdbfb77f2466496bac89b601b2ac32b8939a76562cadaebffc5cde87c3dc373afd05843566bfd6d08fc6780d5", + recoveryId: 0, + }, + { + d: "ebe6295fe519563a97b003a33bfccd7f42b62a435d5289cae58f216899100ccd", + m: "fb893f78680d02ec5e817c85170cf5f9e2d41a9a31d79065d50dfbe2e3973d4b", + signature: + "0df6adae994dc2f93bbf1b680c5056cedc22ed71b8675b03c57cf4b38053ed841a1675081067d8953e4930cb600575c3c3f3469ad34823877dad0bdbfd38ee81", + recoveryId: 1, + }, + { + d: "a6c1f7fb216c70fecefedb1ba68ab6c71f1dc33d862f0bc1b32f79c7d85b4178", + m: "c3c82d5a076f0dd85ee58dd19ca305cf34ce2f0ec53af56defbf8d212c0aba6a", + signature: + "e49c59cd5b5367020440e95e01578d233b44a83cdc4771b51afb1118f2351e7a71db4ef6cf61d1aa78b5334cd0d448e1a7a4affca7540ebb5e60e3680765668d", + recoveryId: 0, + }, + { + d: "66c313f6fb185a451d76553be3c64c124040d56417294eac1befc832cc820890", + m: "03a521e1b093251807cafc632160b49a68753f5af6894423f8568723bee8eaa8", + signature: + "11ce577649323b3b53d143574c835c9aa311e8ce848e60db9890ed7c843397142d71af78bbd5d72bcd45ab77656a45f2dc7011eef7453ec17d7b4523186edc5e", + recoveryId: 0, + }, + { + d: "6f62cecce3d6ebfd109c6094b0d012024844d7c3de7b96a39dafc79efc2c4e56", + m: "43cb9e935de1f5eac37fed827084452a2f6f62bab7d979b8b8a4a65edf25d07e", + signature: + "9d4ad6633c5eaa3778c2fbcd31c43fa45a8a751b3baf853439b617f5506320be1c9a5357c1278831adffaaf65da26bbad1bebc815f73546b8138edab9e8a0944", + recoveryId: 0, + }, + { + d: "eac80207ac7d2d59b72cc0a2eab720e013195f9ae23b6ce0e19e5730b91c14b8", + m: "b93f7b961f0f9cb32adbd747b371ae79da45595af8f53acd71d37de6c80a84a0", + signature: + "8f9265f5c39790345cc508c870fbd243e3345ffafa586421e1eadef6330a79225d309c79f118176fb0d8c788c6b5463869e440fcef1f40016807f4333b293b29", + recoveryId: 0, + }, + { + d: "915179e38d43fb5028a9129ed9373b28571db26b10dd190ab3a99a7d4f1ae8e6", + m: "e2b740bf85c567c1b8521a06fc9f33b9dd54540968afebc97a62ef0aaf31ea47", + signature: + "216256f6131a6e43701c07c9392dfa2f366b9c1ce92551e9d9f4a902743e09696d803656dfef1681e598111b0c9d19420fd1dd5323a4f157ca74c77c4e1951ea", + recoveryId: 0, + }, + { + d: "5dd09c8f2b213bdc71290617961e952d86b9ebdc4b14782b7c03f24d82f68c3b", + m: "5be95ad56010e73377d9bdf6c95fb6df76cd12757d1ed152e0c725b9d636dfcf", + signature: + "8c55ac27b7932336c555b6765f78fcbb0e9a3c7821fd124f38f28ecdb18e51ce32e470a0dcfa8db85ff95a9ed3bb5dbee57597e539c8cfa989c45da0f7d52a78", + recoveryId: 0, + }, + { + d: "cfce581a0026582df8e027e39c69f02c7330fd1515d7c4c24778a203f2393296", + m: "196b0f3c6ca805048023312178562758534476c399152b2ddfdaa11825259b3f", + signature: + "b2ed5dfb457ff7709986aff3d5788e758218a216a0b7e2b7e76421b23f19aa801a731caae19cde0d2f769971928311247b3cdaa64957e11ea6965182d315adea", + recoveryId: 0, + }, + { + d: "a352e3f9ebc9cb3e2fbc27a76b5b40873845b7f7b50ac711cc270ff27a1efc86", + m: "9ff8a0376ceb0d70e46bb4ef80276244a18cc8de7cc73c5665f7a296d542648a", + signature: + "292aaf075c9829793656a1d4fe974c4fb7e871485ca377009a9bf8121923ac47584db4b690ddb23fd08fe9fa5cbfc0de35f2409ccc0ca1851d6c20ec54f66b6e", + recoveryId: 1, + }, + { + d: "14f7cfde3ed4e5c65edec3fc0031365b82cd187552eef6355ab24b7a245c44fc", + m: "7acffa59c0d4e841855d3c701db1bfc7a0926990f5a7d752c744b15dd79ca4e6", + signature: + "ecaf86395999621f52e376ec201924f0a7e3d1ad54cf91a1f382e930a9952ef84feaceb5ef1969522de0eb3328319038c4db9959dd8acfb318233f348a2d623b", + recoveryId: 1, + }, + { + d: "3add409973b22decda4db156838f5ff611c37080c6419cf3b74c71b084157f27", + m: "33fbd49417a95c60e264359dfa5ae84f85fd61e20e8b0dbe8fdf8f152b5807e2", + signature: + "7770aef305cd1cdde664f61e47f097ec96f2989c0a1bc41ac4d3425d6824650806b9e4d767829c090ed022f83fbcb1dc65f56ca962670c987feedafc49b6b054", + recoveryId: 1, + }, + { + d: "f97abab086dad7b2bc3f130876cb02315b2879ea8fe9487d6d7fabf1eb7ce868", + m: "dc2233357120d5debe5bbeea7bd520397a0af49e134deb285537315b02930ffd", + signature: + "f6a27a4a1e0e6331586f3d90bfd5060710eebe41094dc17ddc29e65b8893b11f069fcbcf672ef3383ca046edc30d70236d3d863dab6ffdc521f92b44f244f007", + recoveryId: 1, + }, + { + d: "9254c8397324829f8721980ee8dcb93c22bc6e0b87e9b6b996a0a6596210116f", + m: "2b6bb986475abf27b491a90286d0292ab78e6b43d6dc36cebbd198fc974bd488", + signature: + "a05c47b2f63d70fd38f31bbbd2cf7437215a0c790520bcde441ee13ce165f9956bdc877394bdf47bf9d0eb06394ee172126e5fdd08ffe8a0eb7f2440227982bf", + recoveryId: 1, + }, + { + d: "46790e5674e8515d418c3d537272e6b7c0bc9bf94a454765e6505456c95966dd", + m: "2aaabb2416094cf4a1bb71e39e8473e7122ccffd771640b17ab99bc9baf8b16d", + signature: + "e6d3cd67b724c8dd0d85cef18e803fa167edb643243b892927df9b95d7f3acd173d8c4daa82885ddd54735db81dcb5ca4593141947609376a88534460aeb319f", + recoveryId: 1, + }, + { + d: "a6a37c5e08b6dc06cabe7daf64d65af3d9ea2cb4d7c510f7aa57c8d686fb123d", + m: "75c3330feb49cc6bdcefc01f034d6f01b5d7d0fd7615e5199c3a9a3ae1fcde90", + signature: + "75fba3d0e9a2b7a276428a73bf2af910928ca81cc85c5ad2a3dc584ffa9799c57b634d23b94a2b2a571ffc76cea922b7f3763c93a6e5a060a23def41922fdba5", + recoveryId: 1, + }, + { + d: "58b9b2db347929df6fef06df61e18c87870c861da57160a296be2ed20867229a", + m: "aab2edfc6de127e5a07a8c54de56c1ed2d9efaae4bfd38d90d1efa7ba9c80aba", + signature: + "d0a00591a6fb5766d27a0ee4de8a7032b779df529a0bb23e4ba9289080e097ac256b3fc730eec8856a115dc3ec82efd9b3e58edb21dfb533c950a5ae1cf1566c", + recoveryId: 1, + }, + { + d: "8985a5a9fb908fcd8d6f8a5b879a37a07e28dba604f0428544870a240a30369e", + m: "b96329950b66060c34f4f792ca03a733202cf413e7b689e1dc6e0eb22afee113", + signature: + "973b784f9dc702e9898d3cdcd7dc8623a8bd832f0c186bc9a5022767f69168ca4b1b72062508fa8f5791ef28ba5dc958505deac3e95a6f9b8f3c24a6cba51d47", + recoveryId: 0, + }, + { + d: "3d9596cf0c5f70d443398472d4587c2c7444acaf6e95be204fea328511ac71ee", + m: "b3cda8a885e6626caad422c2382587f272e6d092890a3e850a7fac0da3d1e7aa", + signature: + "9513e3c825fd7884fa8a018c0c57dbde9498a6a23a47e78247c5eb81fd071d9e22f459db85707de318f36034efa4cdfb7945bfe2033959642023ffc905edefd4", + recoveryId: 1, + }, + { + d: "1ab69dfb92839bf2381412b0f72513a7a6938e80da767833a779ba18810a9226", + m: "49cc74599c7a41a82224ce7dc137a938d27e1309670b6c9c21b7bf85c170b02d", + signature: + "af844e2300ed03f6e772a3cf9605ee1957498925761c0dcbefc0aef45f8acfa668c8984b29a9759e97cf2ca3fffcc87a9d7beb932924fe68d38555228fcca76b", + recoveryId: 0, + }, + { + d: "5b5a8e0994267c462b78ca6ab1b8d11803ec00cceb726d3c03c9de5396af6697", + m: "0c25cd82782d2fafb45880bfccaf06e6699da4c5700ed2752802c089f4919c4d", + signature: + "299b3bd0a677dcb809fa4260280baf8282a07942c677437d3420e19851d8f75e2c997500367882563724fd5411b41dbbb64a33e8162d14625e0bb17dee285685", + recoveryId: 0, + }, + { + d: "02e54a168767ef7402f455d00867872588a0a6fe2faa0ddd1edd119dace063cc", + m: "3915323454320991008c4c7cc279fbd1f3bf00a8f8975a18f574f5fe201ec8f3", + signature: + "a3107ce81f57f160b1727509f90da34b04fe8c3eb6d8382408bfe94ba3c44c332d2d69531758df7547ea7a86ba9e59ad6e486a51d7ac8055252563abe488412f", + recoveryId: 1, + }, + { + d: "6b17866501f55a8bf72065724dd35ab85668aae4c48849ee271e37a0ed66aa23", + m: "6f6536b8cb8d24e13057da8a75b4d6dbe7b8cc8de2d84cc66ff937bd34dcca81", + signature: + "217ac0ecd8d328bb203d75b22a2bbb52dab3c7b0ee8a183a82a67b73117c05a145f09a8aa070e00b3abf04aecb2bfc69f5cc448fda0aeffba7cc4457d61ddf4a", + recoveryId: 0, + }, + { + d: "2229d30436fc0df2af9e1494cf840bf12ff1a2d4f83953ae8e1981b96d4f6ae5", + m: "69585f7f4e58ba896de2226ae3b904eaad0f77e676ca42f7c5345f3464a5f7bb", + signature: + "de242f84d9daf846e957492a575beed651183069932147f425b90a90bf176d3d76d8807361b067de14a5302995baeba5f55535a9b36470d39e1dbb4e1e216c87", + recoveryId: 0, + }, + { + d: "0648648158c6cce169eb733860c6775a8e63c44eb1f0c0b46db8cdc53557069f", + m: "23babe4154edd85323c88712f39d62f5510fd349c51fbf24045bf32f003c805a", + signature: + "58e4686f6aff7ad756a88315ac15a2a428410808c6384bfcf72891ebf708dab65ec97f6f6a7c9fd9bf4dccd779161a680b846fe34c1af72c822016f921826e92", + recoveryId: 0, + }, + { + d: "1caa012957c7bfa8160c4d2d6472c2a8c4b63e9049d81f7fbcaddce759e6bec2", + m: "6ffb46563b0b840705303724898a8a324f82a0a82c7fe52de70108a542f2408b", + signature: + "dcbad497cd7e6f23fd55d48b7f8d94f387711319185bcea6b73cc8e02b0d33b401de83568e2faffa5897778be82ade617ad96647541ea10808ffb8a39fd7109e", + recoveryId: 1, + }, + { + d: "45e9e48ff8d1f67ee4ca11abe60a85eea07aeb29cd1a20b52332e2982324a405", + m: "d257c781b6dc2f49b2a856815f64f9be55d5ebf71c9008175eb6f71278f67cb5", + signature: + "81985bd13f8b56ef0d734ba717ddc961761d7f0377654d5d433e0d59671ba9003eb82bc5250137ea7f43b8fe194343e775d02758721d5517736073492f8aab4a", + recoveryId: 1, + }, + { + d: "75b01e68eaf7e116d8ef6c788079272f7b48855472cb22d104799fe4eed9620e", + m: "14889e05673e26f00951fa2a280bfb2ddfdfc96f91a526ef426e4cc725598b7f", + signature: + "e651ca4625e4da3422a618af815c066b6a27cb0200a6ece44b310cabca5106cf29e5a8d74c1a71efff91ce163b40baaae4b96e9bc1c1d5898819cf52317eab6b", + recoveryId: 1, + }, + { + d: "8088cb5f3a1967d0dd55ac979e7ace092959b3161a0c2e03f0a21be3f8050e27", + m: "eccb9497924fe79857d471385a0cd1cec886fe1a47824300eaafe10d22d0e6db", + signature: + "dc5e45b8caa4cf1ef2c23bf97f81d5d439cfeefd9171abd56d7fe190ae10c7cd0b36e7800add9ba8e59825a43cd8b06590006c9eaa66cb81419576ce8870b0c8", + recoveryId: 1, + }, + { + d: "87c3801fc31d36051babd205116840ab7a3747611911a1572ad6cb3fe51bf471", + m: "77eb2a604d2643856192135ebccad6d94a73c5def76d94c2f5254574af612016", + signature: + "3853e8d581b9501f67f443911b0a3db1f7ac0d8f7659322b6b2bec9535884ae16055e7b1f80a86434f6727886741de6be9aa70a0513577c2f0284b7cd762786d", + recoveryId: 0, + }, + { + d: "8e599bda8f38e1dbed995ee1c25113efd103dd901ba3013e9a27fed7ec67627d", + m: "d40227ef1a28398ed6bf98f171ab62e9a60b6237e98ebf1a175efa6e55bf18e9", + signature: + "ba8eabbf09cdd30945980ff977e9dac7e47247393078a0649ca70bc08d29fae26b54ce60ac8cb151dc516f354f3b6c40e6ecf13bbe0af28c3224ad9fa96a3875", + recoveryId: 0, + }, + { + d: "04b31c48e8be1fbad1b43a5dbf2387399d3378839a1f550a6d6c45cf93ee4ad0", + m: "de512ed866ae26988f36cfec82ec6c79b8b6e82c39de9c55bf34c615e164f4da", + signature: + "b8038d2e2db448e6d6e687c66fd241106f17fd149b8d7047c56a71718a4966d23ea6a1119b14b8756e131201731bc2fd415e3e12ca76fd94fa80403f05ac9d85", + recoveryId: 0, + }, + { + d: "408909f9fcef9631d24e0bf195020eb892c8214e41db751e829bda4b8adc1331", + m: "da97d8d27739492ffbf7e8e1fb647e1d8af16baa9e6d7a8e53e0955542a3fac6", + signature: + "66624d1bbcc0c423184f9f06a4c4493eed9d7e4cd3786e329e22b83e4bb4dad3481b18f7bb576dbee0765f4062fe204f481fd4e0bd677023652b0b4cfc176bfa", + recoveryId: 0, + }, + { + d: "c00261098a8cfc35b6b40a2641a06c589f13fc303f8eae71ea0311a45d414e7a", + m: "1526e8012da2fb0aebcf4584d1dbf1ddde25ebe0e8092c7ff9f498585beb02c7", + signature: + "6ee27f72c9a204bf66b2c460641b7f0d76c1dd60ff1fd84a36ce66b313fdbdb3020d6053a2eea388cc6052d7f1c479d064781eab2532e653a8dab70f5d89ec82", + recoveryId: 0, + }, + { + d: "d260439ae02ff18db92a1e40d849b34dae1c0e81693be78fec681cb9177aee34", + m: "1254f47de90919078548d8ea646ff42ee9fef11bbee2d3b0b57e9909839af322", + signature: + "07c7a840e57aa31884fd570bb6351b0d37737b1b6886a69ede52e038c4a8facd7eddb1a705544a15738d5cbc5e52ae143ee268c32721085d7a8552cc52e36aca", + recoveryId: 0, + }, + { + d: "c5763eeb50a44f7a4b7b0f3ba747c2f6278d872837f38fa7eb2dba7a7c067641", + m: "df80e73622c5306a4695139dc0d55de796019149da6085ef93ab8294fda93a94", + signature: + "e27cf2f7fc09f23177f3f1921ddda4241f16a4c6f2435788e53f659efa1645477547bc8606b94c8cb7d13c196adcb7a489941bce6fc89a4418fdb727a0e61a61", + recoveryId: 1, + }, + { + d: "17842814501249778293b4ad778126f80cfd2a5c5150a939db62473e44a2f1d1", + m: "c00bdc02db74729859633c9c07b6221b94970b5e4bd2c61f3c3035a347df82b6", + signature: + "3ea3eda5907145b51b46a75a463c90a6d0a67f955040e5591a9d5e8f59ad5eb5223de09faee52bae20c481fbcd21df557a56c594cad84b178979f83328e487d3", + recoveryId: 0, + }, + { + d: "bbd8b219c44af9ded6f5a77dd494bc29d67a27867dd7bc83ab4de8c3c09d2d3e", + m: "ecc907b0fcd26814f0e5101eba88af22899c2037fed7385e926a97bd74058dd4", + signature: + "bd1ea2c4447e57bae1b7ff584c46f37774a4b4951c3f44061a09269f655a8d4e2eb32431e1e37758fbd642d5b7bdc38c721335721bef2fd1a1afab84801876d2", + recoveryId: 0, + }, + { + d: "60e2e2193757f8748d37566c5cd59c0167f3742d952baba6bbcbc105c04d61dd", + m: "4cecfefc6b60284f8eb8ca25717d09be1268a49631d9d7ec01a8c8642f8ee79e", + signature: + "39e7660b83e6c150c4692072476340bb7fe49da89ddbc829129c03e8b0b8be44031c45b92be8d2f4411b8e93ed2c775ed781132694842cae5969a41bd1274ed9", + recoveryId: 0, + }, + { + d: "7f746d4ae915fb37f6217d9bc2f9a14c11247228ef6acf534003857131a3f4a2", + m: "bb92c4ca6ab2c0ed3bcd0186b791a2774192bc113a4a51e76c267365fe5b3e65", + signature: + "696d75220d0f2fe2140c97840cc8ffc733f73e413a5b5c4bf4ff319453a1409570f182efc0e6a85f76c04f08b0126b751095d20b2fc589043b3507f008010187", + recoveryId: 0, + }, + { + d: "5e2f921138d30cddbcdb596c0a0832d67e956cc1bf8dfafd245aec749a0ed2b9", + m: "bc830b16129a2f058fbaab99daf70267abac47b9ad7f099c4b62de80899172d2", + signature: + "1c964b5e68da29bea68f1be508101ba22746f482840800c529ed40c54957e61050777c9453e2094f382aeb558f7dc207498be47c167356be17075503dc11315c", + recoveryId: 0, + }, + { + d: "d9f3eac83e02c591f70870c38163ad4e2d3f2f36bb86b35fbb13279b37055b04", + m: "f9e7177409f6406b47cf96ad1bb436a2aec83691b0f5074bde40fc4cdff46f62", + signature: + "b1b563cf2a9773548c07a152dbd8cdfe9bb4adc4e3cf800d656288bba317f30e54c9342bb46ea79dd498df533d17c482f22c51f9a026005e9622d5a35f9ddd16", + recoveryId: 0, + }, + { + d: "eb6f7c198d0198e6f1139b8c296bd43ab57f1a4c35fd58905de39378fd5f071d", + m: "45082f826a97a9fd6bec7929eff79423f397a0c50cd9036f78f74dfa53e46c83", + signature: + "44384a86186ef3cc8772bb691f31a52a2792d3713e203723242e112e344cf08f6929cc849b7ad350523124318a54d9e7258afec11acf264befd220d19c1be42e", + recoveryId: 0, + }, + { + d: "5f8a522cbf07a3fd1b90f9d8220f28aa339f9acff71d400e6956ae09319b162f", + m: "55c98fb28b9c08869bda36aaddfd5f245e204375f68fca9a1f508fd3756f324b", + signature: + "b480a54d15c0ba5606079659eb40cb55eba625482db3aeff125acbff6151801c7748f3fcdcd4cb950c346255cf569f526e69bd86d996a446470418773569b308", + recoveryId: 0, + }, + { + d: "ada661d41fd1a27441017aa51a899f5ded8434a31119676b1017d4f6337c0fb8", + m: "0b4262cc2a12cd3c2eeb8cc16f375991f8e6b125de100d701d98e714504658aa", + signature: + "af36f67b6a1e3003ae36825ea30289a29d755b8f5efdc8dd2afd2b70c3ae146d3a9a27fd4e529a8b95c805865bf90a84601ec453ed188e13e7b1f98d1cc0d3d6", + recoveryId: 1, + }, + { + d: "c45a0a387692f66c17c1054ed177d65cf3c0578c4dbcfb4972dffdeef43689f1", + m: "78712090d08c11d09ac44c014d4b06904fbee3ceefe8f1f2a2780bf2ad5861aa", + signature: + "9231e74933a85f00488431aee04e6582df29a651d597ccf5b76c6323796dc1d22d231db6a02bd5117fe734be75f6c979269e1965355082d604ea7a77592e5157", + recoveryId: 1, + }, + { + d: "4649c9471e10d2e3d6054849888e41f0fdc25fc30496dd8a469135f724bbeb55", + m: "748686194c35a9d39d636f98e4a0302b87d28e45b5266e0fa87a8a8e76a52e19", + signature: + "89afb3ca3dd76baa2dfa9129624f2dcdd275cb67a7160f397b3b6b2e87c2dc2347e209f517a5b2ec8366a5d2cf121cc69aeb45bc1084f69eeb8b6fe01fc43418", + recoveryId: 0, + }, + { + d: "6d776a67cf6e55eaf4b714f3b723264cd3be767b5b05258d587203a6a3caf1a8", + m: "8ff4d339c5baa4e71a59c72a4c210363228d3b755454989e180970ac0c708a11", + signature: + "ba6ad073007caf782e5e6eaa04933fefc2c747eca78b659ae0fed45038abb3e52d5d51b49f220a1140dcbad31646aa13485c1571da8ab0539c87d7dea655e8eb", + recoveryId: 1, + }, + { + d: "a83fd837977a232b2878aa3e2bedb2c4648dc960a15783a3043f9e61fefebc44", + m: "93585d92736de4fcd9c564c29da8a3110becdede4154964718a23e7901e21a49", + signature: + "c40d7f4a2e1d48226408fb8935579a26d12541cff41a5d90b8b2a5c2df8756c8675fd137517b289076836bb54156ee0fcd4d1f1d1bf6f285f3e63e3f608e1bcf", + recoveryId: 1, + }, + { + d: "220510525954b8edfb459d38af28e1f2a4881ef2494357cff43f9bb38c124eaf", + m: "59d9c144771d26ba7f20263a1f07e9d6cb46f81df01c6f6efbb81be850010723", + signature: + "ace9e7cb89d99da9f253ed7d0e169cc40df88d9096f0753576741a0ec0f1f4ce1d719d4091a82824a510ab92a7711629834c6d245f48ec2de9254b85ce19e268", + recoveryId: 1, + }, + { + d: "a13bf5e1355f1d3fe72af81c8b7f984adbcb7cd8e64ed338919b0894ef996196", + m: "806c76273b69f62dc08b4ba4009f2e421360f309457f8e331a8041b6e21f1009", + signature: + "14e96a799d350d2eee7c21e1acaa15a8bd554743e786b6ff4b579dd605eaabb371e251900dc221d15747068cddcc727788577f8679d5da6875771a39152e6dc5", + recoveryId: 1, + }, + { + d: "bd3e1200080f4dda545ef7770f9980d0a93d6502843f8294144906e03998dd61", + m: "bbfdac25a6af56cb1607427a23f62e1ea3f4a0f2f4d756b04bb7c8d765087648", + signature: + "498043e299213f01d8bc8c83282f941199b0f350935596745efd756f0b9f1f4a09c97ba416e23d344a9556e63e15a74ffc0168e6321350ee3699b26a5fc6dda3", + recoveryId: 1, + }, + { + d: "360f1f4f3890b14932ce5db52fb0de62086b8021bc87c4a99dee359212e23c3a", + m: "853d3fa4394efad6432b4b066d156f806921f2d735a31e6db0edf2340442b158", + signature: + "9f3740816d2f6ed763237bd9245203cbf1febe237d95f3dbc43482cd43c17db3095d85249d9e781cae73010769fd77666693c07202a92ae0caf4f5bff78c67c8", + recoveryId: 0, + }, + { + d: "b568031263b60da7e7952b29b28f80888ba9a2ed8a442904c43f93e3ce4f61d7", + m: "e765910c9ba586bbc94e5bb3e3d3740793f6d48da7bc6ea7912b168dd37c68a6", + signature: + "60c7151866267eddcd85cb07bdd24ca773fa7e5e8dfa7fc0d447e3343e06f8625221628f8d2bb547b253991c7a969ee7b2235c64df04badc71d4ac82ca65ef3e", + recoveryId: 0, + }, + { + d: "5d7ab3e26d5eaa22a059483b50033b1ab2f0f567198b9376132e61875310cbd5", + m: "e62810a8695a958a955042b1407216037f68d9fe0e6e5d2b3b426f2d48374442", + signature: + "00469e570b6fe1fcdb9025929ffa07eed1e09a27abe0b4aaa6a1830af7ee1bc1109d5b2693c49ec822422e5b327c23f081438b7cb572a03e0c75f392ae77f361", + recoveryId: 1, + }, + { + d: "5e8f7fb69dab5324eb22b8de6d0ddfc89646ef7eb5775e7e2100fee5aac7a6a4", + m: "c300759e62f222eb795e16b9165243561c5124edfc70b4bc4fb376d2208d4ce7", + signature: + "830efd15965ca23395afa8105a6b3aa25d7fda8b09a158e91c860016687be3b536ac4996325a879a7eb0b7da504d3c52eccdff74237799c81e4bde4fbda1e388", + recoveryId: 0, + }, + { + d: "feea048c93da67439eb6a47f5ddacb77493787c6807b0211cde710a6a5521cb6", + m: "8946bd76abe9a5d28ca8a2fd1aa7e606fe620a6360a582115c8c093e93a1a560", + signature: + "1a4214a12d44ea1d61f35742c6ab6c5b89d737becf0d9ad8f6088a6c161add2d5d06fdadd9de0b17104a6e361026cf46d585982504560eba030bf06d2610cfe4", + recoveryId: 0, + }, + { + d: "b77db2eb7aca69d157bb87c97d39baf286b4d53b5b1f12f517040ef64a75f0a7", + m: "7a15265b8b42885a2a022f5da9986956c2081e3c87e65104f61a1a185656f152", + signature: + "60c9de348e24e569547da8a1f7bd5a6fac4d27d0dad6c800b50f4719a5795e8d5cd484863bf1a4f8da93e4ae62248e31e804d3fb1e17bcaf7b020b6d168cbcea", + recoveryId: 0, + }, + { + d: "e76a59277670ccf258cd9112214ad9d9c2a1607fca7313cdea5457e2d0d91f36", + m: "874d3261ab12449b1b679f27ddd378b753029e3fa8d68ba83bb456a42df18c9a", + signature: + "81a9f32c622454af79e7c7b9d83fc04b75fec9a69175baf2128e698c6c9f0834736a0d04b7f94e5ead8ee815e5293eaea93a60602585a176f5b7d36ab1707cf1", + recoveryId: 1, + }, + { + d: "7a2eeb6acf21f26e114b0fdcc088faece830d49429190b9ff5549af1aea4642f", + m: "53d4697415386f0c6355b7076257673f97e46e2f3c55ca61735a5856bcf6d6b7", + signature: + "af0ac4081ebfaf61a99ee2398c444539b03ee5c26d4cba32c535b64aa7b6291a64dfe9b474086d3a97c8142f580cbed9f1a5f9e5af601dac8cec478c5a95ee7e", + recoveryId: 0, + }, + { + d: "3381b78c6b4c16d8ea484246762b99b65228c660f0a20a4c29d8b75f2e3b0ef5", + m: "01386863c675c088795484da838d27e182deceb47085f5ee59fd98ab7c5f9eae", + signature: + "de6f439989799989cb7b6b606d0765e6456d0869cf8842855380c290d9998b81576e763b37f08781a3a1ca6708e459ebf7bfa05e3ea6a55e6a1a8ddf14791b54", + recoveryId: 0, + }, + { + d: "5ccb857d4191b8ad9dcbcebacf99974c0fbcb5dc68bc8b548e18e7e3baa6729f", + m: "eefd16b76bda383560a9ee7f39d5e13bd6369e0ea2916d0a69033ecfea9dd1e3", + signature: + "f05745b4f4133045c11dd58493a5377dd7d8f1ef8a18ff7bc9c772f768a8266455ebb181c52b183f061dc23bbdd4f520709fe4391cb401e25f26a8cc676b7f18", + recoveryId: 0, + }, + { + d: "862b6a00d195b5e976c61c48e7d11054a5190fb48ffc5c48568ce44c684b1e2d", + m: "17c3480e209e10f366e21b1cc32e3eea1fb9be80c53e547b0bcfe2154725e991", + signature: + "ff86d9135cf7603bfbe9fd13e946636c8d79fa15ec22c51a3b66a48e6ea2a6c8658139c2ab672934cf6f6a9e3ba2b0ac51312c7798535dd1e14a78e622345c83", + recoveryId: 0, + }, + { + d: "3778c910cf29bd545057b841799004ce5d0211e0da6e61b005a808a7153074b0", + m: "17246a560254b5531a23ee3c36c78e90d9c4f5e88cfca9fbd0f6dcbcdb32ef56", + signature: + "f471e9093b1375c4466dba298a67146762bdccdc3f25b87cdc9ef92fdf90d65f09663da4d9a82a0356bd21cdc6cbe86adf603fe46841a8685f42aca437df94b2", + recoveryId: 0, + }, + { + d: "0fb32031c29f4a48a890f69f40dbf0be2a174f26cf1dd5d49d9de617cfcfd16e", + m: "21fe0d2c0cbfc5636db713f898092143daf793d708b5a259e9ca535de51bf3df", + signature: + "9a3c4cb23ed04c7f3aa1c8a7fb3a22e82e99a8ed00f45d202c8175e916467f8a72ffcd8f349cfe5db273525eaf15ba66511c96ebbc88e7c3ffc02699e4ab67cd", + recoveryId: 0, + }, + { + d: "4ba87ef190e07d4e8d6bf7222152055d81533a6eaf00937b4a533296ec603a16", + m: "4850e71ff2303c6e0fd9779736931395b2a1b50872370a26fb3dfc6e11cadaa6", + signature: + "90de91cde62df27752d6c165a5119b18038feca96f01ea0918ae982fece8880c4c18783847271363a3c1c8f2839bfaf84e0ce24b423a434e26cbc4a02cdf37c1", + recoveryId: 1, + }, + { + d: "3f0c0ab476e2c881a9c23f3e59a46850867a8b3591c96c179de2822d24812335", + m: "da3293983500e5c669c7b623a3abcb9feb1044f924f152d7763f568825b491c2", + signature: + "00d57bc2d31c3f5bd05333fc8b97d485d74d17c281cee464def487cebbfc3a1f0cf602d5706877214d2cbf5e9c86530147d5662b9df343891ec9173eed998c54", + recoveryId: 1, + }, + { + d: "d5a8917dae07b7f76ba628b35ade665378511bcdda71ab03b6cd752b8f43c04a", + m: "40d7ebc692c29ebe1fd49acbca322dce90da1f9c0a3501af5e4faaabd05a5009", + signature: + "d697991207761e30e2ffa904f4f3afc6621630d3604731f66fe3a2be2f3ee6600d21699fbd1381111083c50b779051beb4558c79f034c05707adde67fd41d375", + recoveryId: 0, + }, + { + d: "2b3a907082fee0eab62c72c8bd2b543f51695842baaa759074b1ceaf15970a15", + m: "8f273de557d550c62874eb9e0a2f8c57bc7ac3c7e845ee41306795b764fc3fab", + signature: + "5d2e6eb1ce933b487a5850d3ceb76d1a0fedd66a89508cec6dd9ed6ab0732136468f35f26a75315c3000499f473cb16d18ae5ed92e4c38a9b81f2664f4846063", + recoveryId: 0, + }, + { + d: "d9d88211e484d63ce05aaf263e298a9464e1b75a408368df9dbfec39c0d11930", + m: "054209106ae22bd8082686bf10fd29e939d1b98438d1e819fe2b8699e6de0da5", + signature: + "46b31c9394b7fb8aeff58b453df10480e046ddda5d8327897aff9cb8f1b66d5d6a5895d9af3f61531ebc6440d5f5c35201e0dc0f1c9975383ca2c323b2447cff", + recoveryId: 0, + }, + { + d: "3a10dbd822f079fb99c101573c75d59bf9fcb757dda0690348262df21b8c1676", + m: "17801b8ad059f2dbcecc24f95531c9d33d87bd8742a72fb5ac45863eda0ccd72", + signature: + "323dd097c45aae4c04798d40d01029c12833fd3021af602a8abb27125becb68e4378939403715cc1707e62da7a8fe349d03b4386546609bc90b0652731214725", + recoveryId: 0, + }, + { + d: "f67a961b0c8281cac8dec9ec8282c702dbe5959e2e3bd405bbb4bb5ad04c1b8c", + m: "28b69d70a5de76b8c8b779b20c4bb26751d1afb5604f111981ecf3963093bd05", + signature: + "c9d90bd0578e0f8d3783ad07fa293d1af1877ebbec2550cdfb5b9ad3f617f2065cdeea2652d2882037655918b3adfc5eb28fa29fb8e08a0af64d1f5c09fe5688", + recoveryId: 0, + }, + { + d: "9f70776907cdb39071f83108b17f8ad1a961bf84c893f57ccd32fd8db0246010", + m: "36c2312e186c16dcc9017aaa38380002a63a79fb833ab8dcd9dabe4da957b95d", + signature: + "1ee823a493ca1998b5b1e65af29f51ca0f1de3eb907d67a7e5f9cc27fe4a83b57f8a4e76628b5eca8bee12d78b2b7be350b8aba64296308fb370cf81ccd42b02", + recoveryId: 1, + }, + { + d: "c5ce1e967309a65f292e0efe4147f911fea36173eef40477124870154d0e58ca", + m: "bc998e6a6bf08a5f678b7339e894b9973967a35cc2060b195cc76cb5e93d363c", + signature: + "b7c3cd8f260f63bb08a998db69d7a130d620e7968665278bdb17a030e145bde20526f5469420b9b36dae47fd9bb2294d64ade369a69c0544fe2f0828b2c5350f", + recoveryId: 1, + }, + { + d: "57e3f5c241024abfd7c53955154876d4846342af9fd984ad3f154aaa1ba0b207", + m: "f8954ec2d07942f6e78e0668bb4478ba7597018949b4a977430acb7072053a50", + signature: + "d18fc578e9c3784f943aa8ba34d31f5f3f77d07af1a11ba9ee9ffb0338d7b97b7d7731a92b2c4f1eca37afff0c7462fb158d0755243516000d953a9ad2118c5c", + recoveryId: 1, + }, + { + d: "3e89ec6d96323f367bb8f54f8b0300d59f586d3912de7e59f815fdef1e47b2b3", + m: "e7ba9974c8e7f0860b584dc90e728d685898edf85d5332d2fa3551aa68e2b8a1", + signature: + "090b89468567621cfa2b5f348a2b1ddcbb85a01cf61f068ca42b294aa194ea3a71d66aba9d6b1255705b8431fd8d9896081d1707288f0d5de47d41631024897c", + recoveryId: 0, + }, + { + d: "2cd1bdb241bcfa924f26a30dfe0876eee5a995bdb900ee74b4a47d4142bf28ac", + m: "760a49884960654055fef080adc99cae5963c25b12e220e30f2a2ba6be93a2a7", + signature: + "754d0c45341d59481384af1ae155dc21cb854ec0e83259a5d78b7c2825617e764988e3f2fc419798c09b0ae319327a41df424cad5ff04f5c31e900db36fefa19", + recoveryId: 1, + }, + { + d: "b357e0b0359d0df5b2afde6938f8e5190a208b77efe3c314d3694cb985aa5105", + m: "f6ce62ef3efb4cd76ed7088edf66ae03b7f4395f4a2b90aa4db81b2717ee24f3", + signature: + "37a8973b90f085275729d6e8a4cd54e16e7158f3b0e214d1929cc9e474a258a22b82c5ea95198a99dfb6485d1ebfa2e8b60c06a2f2d1491be9f3289564f1cba8", + recoveryId: 1, + }, + { + d: "76550a3b4e2e6b31771fb728fe5dc3282cfd0835e5bf173e35182ce35dccb12a", + m: "e7e6337fc0d905a892a6b605fc1965758d9154d6303dec8edfb317ed857a7afe", + signature: + "2e4d324dbf54b01415557fdaf3bb59e4b63205cdcce413cd07cd8f5f33af4d6171ce9c66c593e72a67b3b86cb8545429a1769f5808a77bffec53e66db61354b5", + recoveryId: 0, + }, + { + d: "93f24ea9318c15ef4b887acb7902a5c6a742b756b565af3de66c656bb8acbd83", + m: "475354f3b9e2a81fec19e78fd0c96203cf281a85ee53fdfe2d59b91597c6b74a", + signature: + "c68f9c9139f800f84cfc40fd33619547a8b04ac5755f96286aa7fd6221eb6c767443943e0d6cf990ca0f16ef78ae7b1486ddb87a9fd149d6d7aa8458211dbc90", + recoveryId: 1, + }, + { + d: "19fa6ffaddb2646cf64bfebba75494220e2d13605c7eeded45ec5a90d58d21ce", + m: "6faf5f7330eb0078a3b8d0a10895d319e0ac42a4bf730639801bd63e40819e05", + signature: + "89f757fb5fbd750e6c9fe067bccc78f0a29248126a8132f703c413c873961f8f60aaa18b420970a9dcb921145170bac3f4536cf45959e0f00c069b3ae37f7d9e", + recoveryId: 0, + }, + { + d: "1dd7b02fcab4ed20ba0e09aa527811a8eab95c81ea4ee195cb5e4ddac94b8009", + m: "fe4b327311d7c1a4697df8dde9cc6cd5774ef7492275c2988adbefaf070d271f", + signature: + "0440a4ad47bfb2da52174966ee5b567d765bb44d6ed839f3ca6c0d031ad77d1b603b119c3166f3ebb0a8450826c4b246ff8037f5b42b970a14029395aa838ba3", + recoveryId: 0, + }, + { + d: "72c7a8023c58a820a53467fecc5ed09072c3a21028a1f50491e2f53020742f48", + m: "66f71b6e8c1e70026ffe6764e4b7f1264e4ceeea0ccefc68c048aaa76b42fb74", + signature: + "a1b54373792cf6f555cad4d79336fb1dd3843214b359a6ffacf6d3e5bb3a8faa5d7f2f45556bcc37a30af63c6e94a6b5b37d30ec7c95b81e65a7ad320f2bb3ba", + recoveryId: 1, + }, + { + d: "1e4bdcacd6b7d67363c643582bcc885efd07fcb76a0c11e452ad12324b200697", + m: "ca854534845587c11acf421e68b833ae5ff8bc643a4c8bd0b5bcfc7711f31ef7", + signature: + "7d206fb53260e6cdaeef82e919d0677c2ef9cf604d51d5cf02026eca6af178e32d4f79d725b3ec7c2b34e3f0e652f58ce48e52cc84d29e4afb7c8c0e0a52e290", + recoveryId: 0, + }, + { + d: "b204175485af8ad636bc9a294d1797dc9339566cf7c1209d931aef3e86282f8e", + m: "5f6cabcf16b896ae19a4d1bac6f9f12ea1af2b3644a2365e89620bb601d28687", + signature: + "9f57d4b48829b1246c8ca80be2c338b0a2e40c93dc7f1fed290cad4415914f3c4f8b108e1e1e28dd8df393667cec690baa241f9c21a17864f66dd914e60925b2", + recoveryId: 0, + }, + { + d: "00371d83271c68f9208e5fb2496cdfd1e6a7c92b8fa5146bf4b8013868d462b4", + m: "23d69b9f79bb9b24fab929f205a7e26f8eadb192cf704f3f29a61d1a3d3c1110", + signature: + "c6e0e0a32b42ddda14e4141b3a8cddb3af7c851a6fe2b37a1264cbe8da3c5f3b7dbe05d6211422e4a75880dc4841a4fe9bd3652cde93f57752c02e9e704d444b", + recoveryId: 0, + }, + { + d: "1debc21e31b80820af863ffa40affbf3c8b7e3a1c49d15a4512386c8c16a1709", + m: "8f5e17f358f267d6bf8a0659dc89f5cb0e4f71a78c22b4b1edc33ed9d23b3185", + signature: + "e4a95c8187a1131146ca6d36d8d1c90f2ee6c34f2d960d4f2a0458da229fd6ec5145ce2a5fe14d7eeebfef636657f082e6b56425407c8da0267544ce6a59580f", + recoveryId: 1, + }, + { + d: "2d56199c75398a64db59fe0b65a143aa91e73747e296c492ba5bb83ec82429c2", + m: "9587b681582407897047686d8f0dc73744f26d2064ee2fb2325a84128fc1aaa7", + signature: + "1852cc5f96e3e286b5fd78d89f3bb38625e7bc6941b7f1a1e5f2e4e121b9447e3ceda46dfcb188da78fe36a39fa1c37b14b7b8fb5e833fd087f4050c26b30a2a", + recoveryId: 1, + }, + { + d: "98b69126925d977726b850d17ca3802b25a55f93b2b540ea5832e24ee995380c", + m: "1ee2b59810a4d5df005a71667a14c5c2aa16cf3c0db4e0df094f3c785b7db157", + signature: + "5d42e77b794e69c3b1a00d118f769f84a227be86c13796f8b7f2876813e93c2140ad8e4eda5d372045f50347f73e191de8485e7be70b26d5160541b8694861dd", + recoveryId: 1, + }, + { + d: "f0f718f9f57debc009f10ed245a901e959d1cea254b959dc1db10f3567f29410", + m: "a132e83f67fca18b4ecbd7903f7210bce9311a12b06b5f017ba9e4fcef7a0b50", + signature: + "92aff97e7c8a5eb169ce08264f4cbfd6b69fe399d719de09ec963efadf7e82b95ef895d2a00c2ed098755265e1c5be47fc8b52d3e9defd64491f419206c86f61", + recoveryId: 1, + }, + { + d: "b0aac1c7693751b808c2445baaeb0d714e87c4af875a1a58d4fe52c7869585fd", + m: "595789ae0a6ad8ec1d1e09c8ae5ca9fc766d3f02ad74609f19219b20b2a1d96a", + signature: + "b829f0f96f29423f4eae322c0a14cd6081b0f19067ccc9b58086b18b6375559a6ec23d69f701a23e86014056289da854e1ad9ed332855c9e1246320d6cf9ba9e", + recoveryId: 1, + }, + { + d: "0c384d9523ccf051630df156af07c0d5f00b5a4bc724277cdb1443fb62f2955d", + m: "1e708f399d87ea43bf44f7134beb6b062b178874ee760bc282153fc7e73ed409", + signature: + "89901a0efce206d49dc5eb985a853ad7b1681ee1c3b4dc62f84921f2eeee531120b83328a42b28b6fc1a4bf55ebcf11763ee9192bf16429e4c23ea4dc8ae8400", + recoveryId: 0, + }, + { + d: "24ec833c78e1109a30febdc83599c050c16bbe7b6aa849a23b43d8b3e1531051", + m: "1c2cb283c7560f93c110a29db8c672db8c653e64c2f227554217dc9b0aa7cb4d", + signature: + "313acc8f048bf13f705fb79a83c2f1d5ff140f2c96b2600a52e2394ac02eb731005eba8e80d1f98b5ebcb1c0d29c5465ddb8caa527b1502c4b95ac92f41a89ee", + recoveryId: 1, + }, + { + d: "c0ce394be5cfed3102ab148959876b123bb3555feb5533a4e645a8c810929cad", + m: "fe6a301833ef59409a8c99684fdd84ac869e2b1ce88dd21823373e2fab588d88", + signature: + "9676027d569d64204acd586129912f24eb158d83979270239aba4bf69f8e93dd03c38a19612da2a693e90562a4c17855a520d9b151bc49d314585b6aab664a16", + recoveryId: 1, + }, + { + d: "61600b3d18c60c5ee59b350ab47a2301d656db330774a91a395c0c239cc2ec39", + m: "a39d0e2e6aa571e66abc69b74dbe0ab14a21122e82640bb15ff9acf0c00dae3a", + signature: + "0f323d39966f89dd259e5aff702d4a61f63b4b8e17cf027022ea5bc32e6ff714627c8401c32eef775a88d0f004df4afe18fa29c2a57004fc3b1ce47359ad91e2", + recoveryId: 1, + }, + { + d: "325169ba744f446b28087e8203016f296ea6b6d6e27659264fb6ec20195e7767", + m: "137687ec5c0caec3d0b2d61593f607999532b17ff82c354758ae0f4035aef286", + signature: + "c02b4677974ec17ae82803f9b806d24d1ae2394745c69ccda3ed22a5ae90dff27d5d74b1a558101fa762f75aa680056eab01f4d56e6f559b142488460ea9515c", + recoveryId: 1, + }, + { + d: "31105d702cb9970db5bcc36822994f70f94935f3d882f3b3d8eeb828b9575129", + m: "a21de8bfe8955a0b5b052904978228ba1b05451bb183aba9197eee1587ac39ef", + signature: + "a4ee63c8d43f01b3cfee36b139d589ed1f5eadead9365a9aeb7b64adf6b154c17b80996ab8d51829577e0d04be575792839b65fb90bfd8183e542be584995069", + recoveryId: 1, + }, + { + d: "362684aa99b464f2c08ff889c23eaeb8507d8d8302a63c701fc6a90122b86163", + m: "1e5c37a4c72d9dcb2854d9dd0d15f71eb37367d212b48591e46a671018e0bfa9", + signature: + "b9fd67a264bbb32860d9eab5daff206cb2562549de2952936182e591436bedb915325531d849ee93117bf9ab87cb9deb108c8bec3dbe54dc5ebb0d705de3f909", + recoveryId: 0, + }, + { + d: "e0b75f1d3673880014dd292d702e5bb75fae566756395711232c2700dcb4733b", + m: "65eb9efedd65b063c0e9211424a0a942f0bfb5df62971eb5b60cf8bf1f07ee9e", + signature: + "4e8eaef41402606b03473907e37c0c84b6ceef9eb91dec60c97b3149867b4d722104a2f93154f7de9cd96a15923aab6b1e5faf51a49d23c5b044fd6877e9a1a2", + recoveryId: 0, + }, + { + d: "9f42544f1086808c732cb5f41cb9fbb2795cd58dc6b3c2b84a28de2abfd29bb8", + m: "3d24a0538fdd96af6324a136ead56dc7fa7a5d40ca351b49c6ba287967bddcae", + signature: + "360230a180adfa6e4872585532796d9131ead425fab0d93bf2a93b9cf87671133dcf80fe33024579428f277b9e0d8e983c047b0cd1b0ec023e83e0b03756682e", + recoveryId: 1, + }, + { + d: "c534076db05f1691816c342d86dc205fd6bf5f01d700eadac0f98a3fbeb3cc51", + m: "abc0c4efcdcc1edb64725fedb61bf016854b375936a4d2041e41319bf0211dd8", + signature: + "684a7cc2dc1e8c03c9bdab45ab5a637aad800094626bd1b2b93e6d97231af2e26425c4fe5288f95bd6de8fd07cf3711f8798b586f5b52b0a42e66971b79e06f3", + recoveryId: 1, + }, + { + d: "2384ad8b22268cdebfa7e64e388e8b7ab285e726ac352516aa2cdc2459f5196f", + m: "3e928f111ac1c39ff812f520645f59de3c4563197ad41618fee78bc8f7e40ff1", + signature: + "feceddbb63393cb1be614c8bf67684fb9ca898d4984f4901197bb0cfa7b04a890b5e5818c3656a2991cd78f0bd1519e76f47b63bf9a14cf2c4fb8fb760bf6811", + recoveryId: 0, + }, + { + d: "0757e34ec69b9d1db91386b397e46c014504f570f1557578550775fdb9a2345e", + m: "1c2004e1b0f10513f75246ba72b5522ed072d6d51e4d273a17c689efb9d6e3d4", + signature: + "bc09a315b90807efa7b436b5defefeaa97152f488aa05510f0eb3876abdde0fe3cd1bfaeddb70c2fe02075cbb199f6500ec13018cec43c175cefd424dc4c66e0", + recoveryId: 0, + }, + { + d: "9ae4508a5a685ef0e421ed851e3f233e9df2669890cb02803234df235d747dd3", + m: "25cf6f4c5a4ddf1e27b1794b6918396c98bc9e1b019742fef80307bd91f7baa1", + signature: + "bd7e3acb5d6b5bbdd5ee1a3c79397e00fdc564211edc160f8afd79c8e02d26144b27e5c672687ac0e491886c953fa39fc2d5418a6a8b91a6cf7fd16cd1c6f189", + recoveryId: 1, + }, + { + d: "ef5ef5c9bb106dcc9f02f05a0930d94f414e0fa412dc6be7fb1946444a470c3e", + m: "f1f8bc69b31cc58dc0103420a8c94c5f8987d9c048511bb4ee52a64ad653e3f0", + signature: + "496e6fb73853388e38488de4889b7f76f0243481ab8f05cbe09f03138e762eb94f862d75603fae6736ff37732aff083fed3e08eeee0d2574d712d497b9112981", + recoveryId: 1, + }, + { + d: "700cbd380d05badbc473c7b19fcc6fd270295a79963cf27a8dfb40a716f5492b", + m: "a97c6b0c7b076dd7561cd2292788c257917039cda704031286566e7af593b662", + signature: + "b03e531e1b208913f9138a20c98a78fa3111b170c7f8d79f34261975ae1d869c1b9adccab46c3b9417b7537be1cf8a24886d6203dd1dff49e9d85ff90c88eb33", + recoveryId: 0, + }, + { + d: "4a385ca1637d7929f0f62d4996e901d58ddd9a68dbbbe7cd3da4435ce6c7837e", + m: "798c03f2b333b1b047a655297ad60921ca2d6635a7d3633e284b86c0cae120d5", + signature: + "d28c57e2357953247bf6961ba560c8c0eb7f11f011b01bf191444010e580880e3e41a85144b62531f7f7037c864d38ba6442bb5a1161b715e453ec9f8fdfaffb", + recoveryId: 1, + }, + { + d: "70f60499095293f8cfdc4aee94836d8963729ec80010a772adee60d35faee16d", + m: "1e9d4953ab137fd8d6baa0f86f6d0519795649d62f9747d8de9bc82b02c9ab9d", + signature: + "9653f12b0ed009f201005368f41548f86e84c98a68c835405d12cac150f78a4600dcf169571970d64f488d2899b5ef2be08e1f3d0a5835d378e8708b46f06871", + recoveryId: 0, + }, + { + d: "cb625622a0ea0fb7d97935a2db87baed0a0d914e640c11764c92a53b2a68ecad", + m: "5e1857a5feb6e27b0ece5316469de827d230602f126e364d374db59199b8f1b4", + signature: + "9f4f232fcaef5cc6fc021a24a42e564e34ac97f0c4777cf15d37c5f7763d660838198afe03ce0615835eacd7fc5567692804f3625865c0a649bacf7004f9828e", + recoveryId: 1, + }, + { + d: "0984e079c303568eaf8bdf11b501e45ced2fc1a5a72a359fd036cdbc26920b7f", + m: "1928de0f45e1c599842b34d5e13cf5cbedd5d4b1d324bc2bb1e116e7b0163a48", + signature: + "a7b1a475ae7f6c2974fe7b7502dbfdcf297a14e5ff3f42f7426b120c640efa8128685c0769aeb9c7edcf3c7d822e8c60b3d25c48394dc895a4607e29c7287b5b", + recoveryId: 0, + }, + { + d: "f3336028f8e62d86452cc22e2aa6e7f62e188749f27527001a17f4516b9be5c5", + m: "9decb50aa270bd519af7b1464b24f651a475a9cc16dea49a3a125799bd7582cb", + signature: + "ad099afb82f913e2ff38b72b9801912ef19d0aeb6ac4e5d53fd10c5b8b67e779618e42860190040ceb7b76ed9df3c9da5ceabc18695b5d9475d068d358103b1d", + recoveryId: 1, + }, + { + d: "a78dd32da98e3f417afcf0bf49ddc7983c2a2bdae1e397948c3d9d07ef5d7f97", + m: "22331819a4a6c762fbc557fc16d4044a3e7436e6c1a142d90767a549aa6a67ca", + signature: + "678d7b02dce4b214d0157ed9be1d214632a578c440258eafe8837bc23b257a0c5f37e9afe16b2daa095ab5108cfc48ae91a8a5d807d4067f9abfede10b6af690", + recoveryId: 0, + }, + { + d: "1eb1d28117ae05e91a707c9f50fcd399909951162f188115857e81f89aa5eeec", + m: "db2e403ee36ea5d3b05c616682ee5b4bee6b0f57c92a40f27051f570357c55cb", + signature: + "b2c286b1355d47f549157be5b6be0f23fae371f03c27f529f51c7d73788b29cd7b6af72e04c729fedc43ba2cc7b7aed7dd9c74e1d1ad5a980625377568ac40aa", + recoveryId: 0, + }, + { + d: "ee3df08041aee15b6479a33e40fd4951a7187c70a242fe8f4351caa39ea12861", + m: "f787c82fe5117b0f89d4d956d25c1a825db53c1c159eeae9c3d7d0bac205ce9f", + signature: + "aa4918cf9b5c508bb22093a0929ede5bc7c2283070404ca13a5831cd0b0ae81a1ef86b3d39851e26243d0c5ab5d041f15f5cfdbe82937f10c3bcd6708d58ca97", + recoveryId: 1, + }, + { + d: "a2a9c9a306f6b8c3e30e4d40bffe4a6a026b1ec84be9d1b068311b4b12a659b6", + m: "7d61c2e12b0fe83eb10523ae9b836055234cb22346b50b29c15a3e9e03818c6b", + signature: + "a59e984e7e4b02cb77a4a9547fadadceafc4775b3b0999f19ae8b74ef08fce813d7738697fc3a48c5d43a9d4da75ee0fa66ee14c949b7f991b76d12b41f5e6c4", + recoveryId: 0, + }, + { + d: "541863f6a59cad51b14382a5225fe595300ab10dcc309126c0c47f8cf60bd888", + m: "6bf9d52f0e525226bad41f6144358701bc825faf20e2a688f26026712166c4e4", + signature: + "93cb211578f9b50ceb9b89850c5025d6c1d817e9df9d927afc0b62d33d889e8a3948d0b0a805a3fb859fbe7ea50364953b73707f20ed46a0204c18e296410692", + recoveryId: 1, + }, + { + d: "142a4acbf7bb60aa1156eee97fe84104d07ef62dda3f985ba6ddadd009340780", + m: "23161752962842ec12f70b6a63636691b5f995a3a17e35e1d04bbb58ad529f05", + signature: + "328c1e228f220e4b6990af7aa93b45dcfedfdaf7ca142695cc089403fb0c072b60500f43e1658e0cd712f8c54d7bcf483dd23f92fb3e78365872c8701f428369", + recoveryId: 1, + }, + { + d: "c1194f590cef71e116af1afd856b0c434a2c44d520811dcf49a8b4cbefb032bd", + m: "58ca7094fa89daa04d2739b484c82e477be93ae255f9275aef1e7f849ac43c57", + signature: + "ab48bb7998043e2dd9691100d88e75a4097ec18854bf601f67d43fc007655be357f9d8f9ad83363b54535ead66ff9f5ebd89a6ab8c546d111d50c3f0ae255aad", + recoveryId: 1, + }, + { + d: "d0d1190406d172a180382e96f3eaf006c1e8ee196d53080b87d96eaa982c69cd", + m: "9c858f64e50b55a589c0051e323bbb9f1dadc0bd9440a7ad4733b6e983c07ff9", + signature: + "cc4400dcc566ab8527ba9df67809ea8e54a2aa16a3b57157212bd4518eb51f2c6e90ea189fc8a2842099d93eda2602b2a56c8d1067733e4d9fd5fdc94c29dc48", + recoveryId: 0, + }, + { + d: "746f176f1e57d0fe9ba5d540a84283b56b24f178cca44dde5c7c43bc2e968271", + m: "78ece5171487302f5b469fd5b4b7fb02fba9114f1caab04e8be1a229c1e929f9", + signature: + "83048a8757631da1337394277437c0a257ed00131b37f0fba8f6d00f49ff068558d2d0f8bffa6250755a1376e8be6f38cfd85ffeffca2542f349576a5a6e676a", + recoveryId: 1, + }, + { + d: "b533fc41b333576601ba1f911495f255d9eff6eb63a6a6948fb828e86e31554f", + m: "bdea030bc2181755912c15143549c36a88b08415643c3281161095cb03676df8", + signature: + "bef6b3e3240fef569797aacf1381e376a2d61696361fcf45aef77d8927488e234f68c3acc5db8ee8e206ba3815f90811a5413fd8a55ba02773845e18bd2ca0d0", + recoveryId: 1, + }, + { + d: "0859ca3bbfbc4639884e8944acf0d56c31a947b83347a14ec1319d2cfc14b728", + m: "f58e726dfd1fcc570a334839477a9244fb66b2df693168e721bae97f0b785243", + signature: + "82b3cfba336661a1f68003ee4546a0de5bc67d866a4cd3b7e368e6b3a3459a9448b3a011f4f4e399614d15975c5f9b9b3c3ba875d41dbae6b2caebaf3061f195", + recoveryId: 1, + }, + { + d: "7c235757644c942c20b76ea7a4b5fd309f3792e702449c45dcb8fbd348953d63", + m: "b88f23ee4cf594b6baecb299c10a638f017841e9e6ca65807b199f44caf26c69", + signature: + "5601277010013a8dbf405f129bdb395e565f4e8a811a0e2983fee8e1363c9074551ef90c76a4f02f8bea307829d5a82bb5b79a0213a28dfbbd06a9680779142f", + recoveryId: 0, + }, + { + d: "3632bef0f7c4b7d174d6cb2de6b8e01cf5a40bcbc24d4bd2c539d0e471728324", + m: "b258fb4bb179e85d38feda461ed7f26dc45b7fbddc8ab975d089f4cbdbca4ad9", + signature: + "9b952595942a421ebfeccc3eb952108fe61bd49951824135d2cbfacb831e4c113d4d53ba6c29143f4fe75cd5a0fa5b778d15de71899a1ff9e6817cbd0df29ab5", + recoveryId: 0, + }, + { + d: "41e05bbe441c1874a7c22be8c331ef60652cebaa49a3de868747ebbb081d2240", + m: "35fa343298df777029e2fd435c5509553219749602953e0e797a327a3ef8e722", + signature: + "90be9e993b4dfe30bb4e4956fa0ef5c79c3791598fda0a6cf06219d651a817e72ca1458d51de0a1acffe442cd5c30720b3dd5c3178e5fcaa8d89b4868f194002", + recoveryId: 1, + }, + { + d: "36ce33965696c03782dbca41b5a77d8934aa3d16dbda7b0e4a3fb7a0c4349698", + m: "736c9b9d676c7561c319a5d3bc3e567fa50e2a2466257470d4b1d76da5c8e1cf", + signature: + "2c6181aee745b9fe029c5ae959e4c34d1919e2a1eeab79cf4bc9902a0bedfbf75ee7769b5cd556227f6bf12212bd14630b33162eb843516f46bf6ca0b8400d42", + recoveryId: 1, + }, + { + d: "6f11fdeeb1e5581d00655a22af2ad4863b59ad860185dcb4437f42882879f684", + m: "bdb94ebc31f25522855b86081055486830a5731eee3e664032738716fbe9157f", + signature: + "f2bcf2154c631bd98ab65746558a3932837ab56c1d0797453bc947d9ece84fad706db4d0f07ff8832c45c6513997ab27c375e1513f40b0218a764f23f02b463f", + recoveryId: 1, + }, + { + d: "c9cfbccd77e99993d70fa50f19817162bb4b34ea2d69445e2ad1672770752c7a", + m: "e7e57730987becca7e6814dd0f0f7d846f67837f640b2b1a230f4ed2ecc21714", + signature: + "f0b07676a4df636352f3d4a17c81da979cc3b50c74003101fc26e2faa9607baa68620735cb536f9d4703274e51c4a9c7c4c23dd9051155e7692139c555e6e544", + recoveryId: 1, + }, + { + d: "0fbf2f482af7f71343f46a0515440c28d75361198c804beda88d21d65928c39c", + m: "9121f8b7381ec766490c8065abe36400112947f364bfc7f994a9e5e6dc858712", + signature: + "c869d7b6895119a3a047fcf64b33cab8ce1e4cdc6016d1cc5e94fe3cc9ab904645ae4a9007af9823428a6862ba530c09d70a8806fbab586e64d02f468bd74230", + recoveryId: 0, + }, + { + d: "2524a82a308c7e46932acf35c9d92d9e3f41dff5de3c1adf8eb9779c9b36d016", + m: "cf0f60cb095d1404203d49a795da76dbb6a1471c4646ed11de019eb1d2e5986c", + signature: + "5ef740ee697ebfd6337d27c06f391c8e036e10970f498c73c3f61043668071d03300a701fe544e2d4cfe187381f952f2d36b6658c2428d7e88ca151ee58e58cc", + recoveryId: 0, + }, + { + d: "3aa31bcf4c9faab4385702cf265d3b2b59451bce4ec67d06993970a8df593e14", + m: "81fecbd37626d467b76a3486359bbc4f2b77add667be806dfc3a1894803c9de8", + signature: + "4f3f36d5520d14631541786582bddd67cb621254bec7d79700646dd3c030f90c7798b012b21ec0890fa5e546139e33cbad90862090a56c571d8ca7e1fece9cc1", + recoveryId: 0, + }, + { + d: "a453db92672780ae50cfbc694330720f479bbebc88894357e6fca0351c114ffb", + m: "0d46b8a4239a26f4d2816e2a845a5e81174a42bbda5c06e4029cad0c8aac8d70", + signature: + "8d6f02f8715d89d10058440665eae4eab1ac80d42525b51bf514abf5df2b94a9275c093400b064fabe045b4f774c59143ce62cc5f24899035bb7e52e715a3a34", + recoveryId: 1, + }, + { + d: "1a494c0ba12f494d34682738885a79d3b51edf5076501c7238a615eae29d67ec", + m: "cc384b92d2ab8c14aae9c115cb5d7446372fb751e37e237c9f0c417655d39290", + signature: + "eb744edd96177642a0ec3f29aebc50c5f30867b4f416d3cd65d294ac5f8669c379daa7b8d315341364335677fe415c8112a74c743a08433b6a01fe7d603783f0", + recoveryId: 1, + }, + { + d: "7e51ab2a0aa5161acd1428f1582cd5a4f46876497e0b5935c25197ec3e3e0b01", + m: "1206a9e7ed65a1e3dd86b36fb9de6d8d19883e1b04475ba91a13fad9dfb0d7ac", + signature: + "c7a575586531a85da98c9cf007e93a0a43af9d77ef4d5bf8841c7682c1cc814f5ac9bdadb0959b918b39c888ef82628822df9267c0bbe3af1e2a2e78737f3734", + recoveryId: 0, + }, + { + d: "e8af5fac299db578cfd6381d1440d4e272654c4ada48669ca2041a4c47c69cd8", + m: "463523658fd3e95c5632190945cf2969e8eea69ae67f625fa7e86394f3d12d54", + signature: + "a8d73aa3e7e5675db3dc573b482189f894acf6f84c41f074492b15bb47bced507cc885d602b42ab75c2a4ec332996f9aff845c9eb8de10743fa84c219918c708", + recoveryId: 0, + }, + { + d: "4b1e4fd20f9e5a8994989d4e9ef7167f21006966f1c1e38b2ed803aba5228355", + m: "e6fb47ee6c6fc5067acadfac97018192d9bdb22d7f60a4e05d4fb90baf35e912", + signature: + "7d0391c7ed495a01b0003ed23151662e25678eb22f2d9556fbd51cffb3eb59886aca852ac2b08fba335747e474be929dd1b64f5f234b32e5692952c40bf52a5a", + recoveryId: 1, + }, + { + d: "11220b56881fc1d05ac5b4c5c95539372ac968557a5ffbe0e651a4bef91e2689", + m: "292c39b3f0f72e4c1b2d5412ba875061a06e8c23dc3bc50f21a4d8e4af9fcf7e", + signature: + "d32d7c18c332d77a891ebe767b3790b08b9b6adad981b54f1f597462879dd6b213b537919d5d7a28364aad3d39699bd89dfe17e3d8ae72d93f7bc32f87f91e75", + recoveryId: 1, + }, + { + d: "d826e155c21b61455d53672ba33935df8f6f861c7a147978241f12580f027093", + m: "1a6e6c59d52380c740df3516357ab905e234e4c397b4fb796f0d8b3f61d4bbb0", + signature: + "e1cfcd2da9bdbfc2fd5f9a477e2add8bbd5e0bae0c8ace63878c172e0b4996e77f6747116239b7a52c26251ebcdfb1919142c15854601ab18b8af3ed62acc046", + recoveryId: 1, + }, + { + d: "857e5eeeeef1fdacf9b590584a6a9e16db1ac1c552d267d4ea4ebfa6a820a0fb", + m: "8616aa28e01a953c9bbc006d7487136e0465f11469786fe85cb1abb773aa58ef", + signature: + "f4deecee603636881d0a255d9c5dd87d07178f1262b0def2f1c4fc0d6e8b209471bbfffb5c708a9cd968d4f9d1d9e9e2a5ba9740bf392f4a5b35611dd5111c0e", + recoveryId: 1, + }, + { + d: "9e54ed51cf3ef7560c363bba5ae21754308c499c009d97852cbc029417d96e78", + m: "c1cdef9edea9958b7ddebafe9b8a78a3b68f8ce88c8c6f264a011c614cd1b117", + signature: + "768bcf05beb16ce8e789e83c00029ea8151eddcb11659acfd824f67d094997725ed4a519d2a2d16193ba7a4bb2ec2c7c489e8c96050c8222604dc947e9186ea6", + recoveryId: 1, + }, + { + d: "8fe0a7450a3a1d7f1fc27d006906671ed4d5ea122e1d55e064be7c667636860f", + m: "0f8004bfa74a4e9195dbb07a6fd30dcf1b392eb26798e44136fd91458cd0898f", + signature: + "aac035ca4561d68575642ac1da23ac2a70b4f1ecbaaaf1f8deda7a08a2b60aab3e91c1409352d121a1c48f395edfee72e3e2fbbd3d432351cacdcd55ca74ebda", + recoveryId: 0, + }, + { + d: "2203d4aa32a237c8d8c0f9acc109005dca05df3bd78f69ce3d052061c28682dd", + m: "e8635ae1abd26f65cf2995c7aba2d8f87a0bf2ba7571f05240d33dd6a5d1b7eb", + signature: + "70cee33a20e8dda2865a463927ead9fea7bdb0174377adfc0ddd6cc9955e8cd104076408c1fd1b92cf4731b284970a7507b96f8a10f85bf4400f6f43fe668377", + recoveryId: 1, + }, + { + d: "ce42fd0c110322a5fdb826c627db08b9b48e95ccc1b30bba56906ec0bb31317c", + m: "0029278496c036b8fb23d9c1db14736881450dceaaceb89fdc63dae776da6024", + signature: + "33c6dec44d4f4b2e985f3e15b1fcfafae0cabb2a4e45697242c05cd6b04af4000c0fc9e8cf09f192bdbcabab0e1224f393110e6d4076242d8535b0604e0b2be0", + recoveryId: 1, + }, + { + d: "8707d1a0a4a9c1108060358a008a6b4a1e49c427291375706038e0403f39ce53", + m: "c8362887ec6861b31fe09bf73699328ed96386ea1d6aa989472c799f6eb58bc1", + signature: + "052126bc04180b2b089144498a00ecb8bc037e57f2528df9fb0bfd1a0271f3701dc875e793e621bb8e279ca3a358fcf78f349e4f976928271377aa955434af3c", + recoveryId: 0, + }, + { + d: "c3b0ac32365d0b52e78476d0459dd45166de89c2d59321b58375aefd6c4da51f", + m: "678b9f220b84bbf62d9a49ad5ed304c374363b62cfecf17ecfba685d08c121ab", + signature: + "da80f894034ba0bd46446490471db73f49f193cef5a5443f526a7115c60403da70ee5d7353e33a567fefa1834b5db4ec8acd6e6e1f782dfd04186d6bfa05fbfa", + recoveryId: 1, + }, + { + d: "47c14dfc1aec24050098b89baf09a754c152864ee37856be14c3c71cefae8679", + m: "5457a1d400fd8f0fa983ba73c26873e4dd62264541f66ccff7a51bfddcb54871", + signature: + "ad3df77f8aa4d8b3f4395d5c4c1fbcc188c1932d7fb5179c847d2fef9bfc550f6b1a80bae729bb3ba67d9457a5f9ea33f8a75065f5dc956c8a35e2fb1804cc6f", + recoveryId: 1, + }, + { + d: "173eecdec5d98e91b05838308692a25c4ff8396786af6988336a29c75571aa28", + m: "355e120964ae04f2ee62336777bc6c6e0262823f35fb2a247ca519fa2489d940", + signature: + "d45a510c3268af362dd823e8696452a992cd81e3b5e1cf9b97593d8413ca107f47009a690f142f1c45e6187ade4fb76ffae26e7904baf3b4e93256f799d040cc", + recoveryId: 0, + }, + { + d: "8d7275a735ba9a5f72a6d4f07e6f850443d78bc6d45091b3c1515f733121c219", + m: "1c46141c188ec7615e61b08e589a2d76481ac1b6ed2e984ba6a0dbaa61865b36", + signature: + "004ac664d845e738ae072a4ba39815ba2dc53ce9fb93768144cf21e21a3d98d55efc84fe3645d64bc64a30651a913b2d54f26864e1fd4c309d7b2039cbdf7379", + recoveryId: 0, + }, + { + d: "4d2854672a65b02efe246a61c9d334d6a19d60c1642d49b123c803119ccfe654", + m: "8e583bc36c82c558aa8847cf913aaa288eb362826e8b249b39559a93573bdf85", + signature: + "0d0317674226615fcce58185d12c5ce96bbd1c451f1f6718fa062bc66091b88f71799612d45c51041c2ef68aff873ffd802cff3dc3fe268ffb46e312862ba78a", + recoveryId: 0, + }, + { + d: "c187cb3635359d723e90e80b0f18c2d99ee5eee1693a2c5bd0616b89c24560aa", + m: "b24b1463e0bf1789ea44c0d52321afa026e5041e9861299deed2c0bcbb0889f6", + signature: + "c367be94231acb8834ea14fd42b7ab3beee0338e29b23772ed7ed18a2f5242146fd775e6ff362900697410623818b81d067abf22b9ca378fa6e95e43d1a3dd23", + recoveryId: 0, + }, + { + d: "05336ff7bb4852371a8f580ae946e04eea69e54fb5d2d4f8d8427a4d4843348a", + m: "1d293fdb5f7536e030ea49f31d14a8d97553fdb2f99126fd60a2c2787a6ee775", + signature: + "6719943571ed0f91f41624c75f5c4ef479bfe5dfb55d8d94ac14df3ca8200bb37c5c23a4ee7a35b25fce8162c1db8e973c28af99745bcb13952402ce40d7a5df", + recoveryId: 1, + }, + { + d: "04fdc4bc22d34b9e59f8444578f497a0be29798df4fa1d4b9db9250a358fe360", + m: "06237b3332451b5dfedc6d17703e75ebab85f92c26f8fc65150d1e41a9707ce6", + signature: + "0f90f05c8e49d2452703caf1e601542a30dfad15692bd8e741ccbb47fa398ce23078a6fee5ff7382b7220ce481ac21f8579dc4d6a6f1d9778752858b12a89101", + recoveryId: 1, + }, + { + d: "59fb31b671aefd359012d8be8a24fc858c7381f4b71b74c457b97ac18d5c9f51", + m: "338bcbc9d94da3f8539576dd27688aa2f281511813e9914fc1d0dc7edb4aa3f5", + signature: + "0b9381e4eeb872173acf64f08a9985c4b4d7771f8e4d75cdbf0c0870a88f2a8742976035c4ea5baefc4680a466cb3009f4623853bb056acccbe00f93e6f60c68", + recoveryId: 0, + }, + { + d: "8708bdb60ffb50ef317dfcb7cf25de6b63d3fc732a7fd45ba39138111a68fc9e", + m: "52e925397f73d13e977db9e1b28ee23db9fd2521e26a92b9a2356950baa6ead6", + signature: + "1435a24573e0d0072227d2be33228e4d54fb4991459d6bc3355b571f416cdf3e351cf0ccb942c3ae35dc1f71f70f2896a2c064d719a18d4082bb4c72993cebbe", + recoveryId: 1, + }, + { + d: "f8f6969e3e617152b81d786a7e30b6ab8a03e0559497a0e695f50486521c4339", + m: "00e9260a591162653d9c99929d22f1ce93d376e87e8a677ce358fe07aeeae975", + signature: + "0b8affb77749ca9197b9315ff31152ce6f6781108645feefb86506628c05408e3ec4355f8ef1dba265a8b248bca959506bbcfa6dd82061594f85a1338b2dd4a5", + recoveryId: 1, + }, + { + d: "b9b4774d11f6f53b03996a3817d22e030baacf862c314921fbdbf029d834a868", + m: "b51fbb69051255d1becbd683de5848242a89c229348dd72896a87ada94ae8665", + signature: + "9fde44ea8f981bc9c3a9b089aa7543006998d9a049e33f384ac4e9cf36c2d7e62bf0566b68ddc546d31cd3ddbf2b3a32decf413e57649230f904ff2f7cacd243", + recoveryId: 1, + }, + { + d: "e211078564db65c3ce7704f08262b1f38f1ef412ad15b5ac2d76657a63b2c500", + m: "41a221c5cd180663713bb83fafdc628eb5da6c1d1cbd601659d3db23e3f088a2", + signature: + "72664e970d2eabca0765ca3d9a300614369bd1a86f5a4746f250a85fbbabcd2e110fae6c272115ed58d39286b3d4d5a78cde59c39937841c77a920d8e3481cbd", + recoveryId: 1, + }, + { + d: "0a07ba07d56bd927ec92c7696fb40fad0ee422a29d3f81968f52200202442459", + m: "cfa1fcc0eeb0b67c7ae3446cd4515fcec29ced2d2c078b0e9492771856261983", + signature: + "6c6a63f2671999dbf45934851b483e79086fc23b7430c6ca7750d4101dfe9b4d44b824ea7b315b6c6d851816bd8580432cdf59fcff1b24f8193570110cd01718", + recoveryId: 1, + }, + { + d: "a3cf03e2441892c62070f1da7bd9f66174ddcff65c73d900b13a0ea542ee8f8f", + m: "74d7a4bdc5a519787940427dba135d41cdf6451c07a103f8e211c5e1aa84a470", + signature: + "a1a40d5ea56f318e47712bc32b6e5a3cbcd279dc2ba9c3f543dcd6895a7540486a4a1e52618bd6dbf696ee4690344fe9ed32bbbda832e801f3bd398d6d3af1cd", + recoveryId: 0, + }, + { + d: "d42e26d8ee9ecb71ceddfac261d422a31ded617dadad111ba94491a6c9dd0ebd", + m: "43764fa7e67b1fe88f9771eec8a89489af8e4ff52f95088b8eebaecb1965be6a", + signature: + "78d64fc4fe9eafafbccfeab62a588ed4f1e44cbb8f053bd66771578630d197e71719433dcbdca91352423f70a7b488a64fb8c6c6797e6b996ba41c6d374f32d0", + recoveryId: 0, + }, + { + d: "ac74f79d50813d7680bc3e7f35a401c2c81b5e07e2852ef27c3902efa5fba915", + m: "09af3b81d1561b3964558332777005daa8c6a6836b356d95ce88a6012c1435dc", + signature: + "54352795da27770e655dfb46bb821c8e60237cd2769feb95945fdbc69810a55841470df6a7ce8b85a49ab39efbda5eb84064dd197926358773ae253a429718f0", + recoveryId: 0, + }, + { + d: "c002857861417d674472452da7d12a101140c4c785499464122f3f9e4aecf200", + m: "18381666393ca21c5c2e61ecdc44747e0df44e965b0e7d0b7d4023b5ed849770", + signature: + "559459ba00420ee118f750648c8f3b8d3f283125c080d95ff2858c62e37579e01adf49ffcff3f90437d7f9a8af1ade8aedb1ddede3af02a68dfabde7e1869694", + recoveryId: 0, + }, + { + d: "e46f04b502a5e1b0dde5a14081b5aeac7f5c0039b16fa4984229d8d4fc55ea0d", + m: "8608d72f0b3a7560aafcb41df57185674572152884d6ca11900c4592d61e6c3e", + signature: + "b7e24c613dce50802addd56ee5cca4b34b6bc12690fb7af4de869dd82564286f3fd7c50bbfdca5dc9b8eebb955680bbb0ddeaa3cd9809e53ae93e3bf00354f5b", + recoveryId: 0, + }, + { + d: "e5c59df7463daeb8eac85af5f01a3a3df46621bb4585a7246d57099465601a29", + m: "f47e029f55e101c49fa1475b81951f14f0c980b846e0310fb61fa2664fcdd99a", + signature: + "5348c6fe41a55bc1edd75cb98f99a0481c242ca08be244cf255ce87e05ff4b431c3633918ebb0ed6ac5589c9c06aa0398740bfe9cc37a075bcbbbaa12917a430", + recoveryId: 0, + }, + { + d: "9e0ca7942b9078b19564e6e9d50ef74d0b8fb91c54fa29032ba52de2522e9401", + m: "bceafb6053d88983c042891e798dc77ad96a8a838abe7bc6da9378237cb817d6", + signature: + "d7740a026a19edd9e3e405822cec84b3230b64af36f158d5a97131f2327c97f072b8d3d96b010bd66281299db1eb9469155636fffccc777d8aa20cff257f16fd", + recoveryId: 1, + }, + { + d: "dad4b2d5eba366dcbbeb4e5d27a7f920adc48872db0a3bca7444853344900551", + m: "0ce53d5a00fed78b5079f651fb5f0b7c4bb64abe9190e245a30fe2bf4d1d1617", + signature: + "fdb4a0fa9af2ea526eeaccc6b8b03c061c7801faa16aa4ac6dca6c9a227977796da30c92b4c71488e7fb739c75e8b7df035fe310bc92465d75d138418cc27776", + recoveryId: 1, + }, + { + d: "2a70e86bbc495f1d34f8a4d87f6ae98be907286fdd1b29ae1c6c75c3269578a3", + m: "3c379a0888e05fc77db00eea54d1d48ea07b047e80727e8070202a4200cf77a8", + signature: + "cff5320bfada7e2ccb323137b1528cf12938a22cb9dc30391503fbd116c76f186415f3793dd5882925dd4b8c09efa43da51b9e7498c6096970a282046ca9a723", + recoveryId: 1, + }, + { + d: "c512698ae041ddefb4809cf22e5698c7f4fdf5b14958fe18e25b733bdda7b8bc", + m: "4dabec03e3fbbae2bb3587b27b5dcf4acba56071bdd1baaa582457159f7b16ab", + signature: + "27c85af287f71cf06bf4bb8f7144124075427151ca589114e946b8bebf7e4bc05957bf40d10fe83c9ec4e83a599051018200db7399ca33d7c7e91687ce77245f", + recoveryId: 1, + }, + { + d: "1939f2afbaabc86df835731ee21bead774cdaf3c1d1ca3b04d01f6b35752ca86", + m: "3de7dd3522f7d6abadf74b4c8747f9a5bc69093652f310afd6e894353433c5d6", + signature: + "f3ec1bfa7383fe42e8fcb9c3647716dab67279cb7932c8ef2329aa5dd28660a274759e00448e2dfe5e40cd578275cfd170be814001fdcc7f82ec774205de2ca4", + recoveryId: 0, + }, + { + d: "ac0af6a1f727c90421587bca5bbf8f82bf317226fae2ab69598e4c05b741d076", + m: "259b7f88db7d11c34c72cef2f4bb7711a341825d3a9e37a4017eeba9d327a1e8", + signature: + "72e74c9c36935d66b8a4ef4953239990507c467ab6df0f0ea23efe79aa015167119fa6ff1fbc778886818ec02c7923bc375230c32cfaed78c7d08ae1a280fead", + recoveryId: 1, + }, + { + d: "6ea5bbbce615d66da5f53c2f7f66647d005483a7f98c5515e2062f881106b6f9", + m: "d85ad2ddc7e908ae53648bdddd75dedc5c2d422537bf3e66d446953f55253649", + signature: + "322e5a8020de5a323b7c6743b208471d82e14ae7ebb186bffb8e69d7ee7c5a662140927f800da35702ac8370fc231597a4ccb893861e1df80f6ee6076ebaf184", + recoveryId: 0, + }, + { + d: "3ece3a66f0b6df915e255a1a3baa346e7c20d8be32b923ce7f349c4c451e5846", + m: "bd7435b86d1e3854ee120f0f614db3f5970ef530fd712121c4d36dd8c8f375ac", + signature: + "518009b2e730fc862149841331e17f777e35617643fd992c4606f48d249cecff7b1be71f49231ac757c6d31d398c0a250e8db0d4f50b6340485fdd951cb36a95", + recoveryId: 0, + }, + { + d: "e014e839b9116ac2e1a96246578ff0d87d24bab667c8cc080a67b5bb06f9d3df", + m: "ead33b360820a4db85a88f819fb38c99fd8cd71ebe17ea308d14e5933dbbb200", + signature: + "e323340b7d93b79bea3fd6d1c3caa2011bb5198388f07a1b37432ddde957b3317006419e493dd0b1e5848c0e5ff35b5b8ba05b6c8d9794029cc541f574fc59f7", + recoveryId: 0, + }, + { + d: "f44ffce2cecbb93828859aa583831ceb3dbc30795335bc5b32cd83456e75cd95", + m: "340ad6f22a3c367f5bb2cd19af91c6a63dbb3f87457ee37b0b848dbb51b8f975", + signature: + "b45bcbd8ce02c21500e5c379b5fc5f7249c343e8902a2636d762beb6cc8ee52d580b47f0415bb4eb0ed6fe4ce3a182957833c5e22a50390ed081a476c2148d14", + recoveryId: 1, + }, + { + d: "9f5cc92f117948993eabd24eac25f2f759dd183932709f2265ecf65f2e10665c", + m: "98ae38ab494f6ae1dc84b1f55145e55a4a7f606abd79524245d767501e3a3570", + signature: + "7152d0530b3a136b3f639e65ffd3d5a5ed64803be71c586ba46cf6760d21f71e7f9d101d6a1b5744e6acd7a36fcbdeee328095d8af8badc8469da9e56c0d9ad4", + recoveryId: 1, + }, + { + d: "537a032a059ed1e213083ea2d534362cbeca711e072d4512acfd41731940184b", + m: "11c617742668aa99dd79c85dfaf128a214b5a8f9687c7c583ee6f9357f2364d2", + signature: + "2a73d5e392bca5614c4ef969fca0fd7c1ea18664ae70a32a0c357f1552851a2434bc73d419b7cf277faf2bb6f6f758a96083530e16dbd6d9cca9f9720c66c187", + recoveryId: 1, + }, + { + d: "41db6353f98506a2d34f30a58c239d23dd7b571a309422e49a38d49a7816a87b", + m: "8a7589462520cf8afb86add38af09f38bab25aeffe06f74c8bc2bf38074760b8", + signature: + "5df16c9b15e97477cb04de92091b2150a7941dff924bfd895bc92bb9712e6fe52f8dbb361a0643a1c53589f5ac5d1b8398bbd078f832f2b6429ddaa96d50f22d", + recoveryId: 1, + }, + { + d: "dc0e6d039839195edb60326f9f718488d6bc99ce611eed30406167494ee6d4df", + m: "27d333f6ac94b61476a7d59c5e05e1bf9fa48bcb1fc393157cc5aea089c283c5", + signature: + "db90817e760c84c54fe03c6786e5dc309e62ef7c160e3f9138bc064e5f5b0d704475e4f4ec091e489f27332376d91971c9a1bfb764c77cee43cd9f0994a146db", + recoveryId: 0, + }, + { + d: "ba14ea851065ca087e22db44b5bf84579183a2f85cbf461e518f369a55724a40", + m: "6a6a1ae410fcebb7dda8ac256c4dd720f4de266032af0567b46178df4d454396", + signature: + "6f389e31b8f3891226e20dfa175f52fb1114bc8614b31f92f0b21fabc76d7f0d30bd0fa1cc29b849a8f93217c0dd8835a9a1bbaad473e6cc2cb75f683e202495", + recoveryId: 0, + }, + { + d: "d1a027c74ae6fa0d1b07cce41e153c126eba0bb62a9bbc8f5af500cb904fb468", + m: "75cfc82db0497d5614309e81f0feaa717229ac4629f8c88c194ad47f31b6e025", + signature: + "4ce24448e27cf5be6b092985450ff36d3c6a3f63688ca410d73a4d19a4f2cede509d878d5239ae100a229bdac2b4e855ce24b1521e9c3ac3e64b232f091726f5", + recoveryId: 1, + }, + { + d: "ce54396938bbe3b33fb8f6d9969157f3814ee12d8af073960e729a4ae2ac1969", + m: "0f0d5289fbed44fe9ee012d91b6ed14f00373096e963f48deab47c97575c0cdf", + signature: + "2ea5feed3fdb8f1ce6716db42e889a42c7d83741179ebc0c853063d46b43d5ee07cd41ed982fa7f7d0589e1a5b5dbac897c262eaa4b3a26334a2638e4303e147", + recoveryId: 1, + }, + { + d: "0224c1fe369bf048fbb6e2128b977dccc7fc583958bf310c5ace2dd20cd88600", + m: "e55ba6e406f93e3a644beea868f312861d0e0a34c8e00c7b03141302b045aac7", + signature: + "c71fa871f307797b3a677a813c45630515d970db0697594e539c7063099e179633ddfb891c00385353f283cf45a7c5e1c0cccd81c4fe06cbb1b5b51ed495241d", + recoveryId: 0, + }, + { + d: "2683ddd254a20908e265497059274f60e67f370e0b10450c578986876b46c7ae", + m: "a7c7dfb4d2b3597c66cf03280ed3970e8d2e370dc0dc391dd8cb8738fc7aa89e", + signature: + "e4adf182a32eeff42f18fc90a26f14c0289d72753e744dd389a1988b6f77c01d579ed2dbc1f13a682a1cb75cd7fd9f81bfd0e8e264f529be4a4b1a62d5388628", + recoveryId: 0, + }, + { + d: "1f06a27b0e97ad90421ca515a993181d9c179ef1bc5586fb7b1b13508cc32ce0", + m: "8ec819ce16464e65426e3c7f1a3821661e4d5ace5dfe82aa14462719fc6024b7", + signature: + "544ca98ff2034ead977ab78378d7903f0a061b80229909526324a2b1a38d57b250ec67c523f399afc5f59b982e65c4d463e1437af1756ba4b3077899b8a59776", + recoveryId: 1, + }, + { + d: "e3759cf1a473b2f2f67728768fd6ebec2493c077c0d58f4fd725815403591763", + m: "cfa1fb1b21a92771844001993f03467fea3d46cc76230e17f3fc96d5e5e54fbd", + signature: + "29b1b94fc1dfe3eaf62c50f0b8916e00928561793d55efb1647d15dbf6780ab51159968b1a129af9ef18108faa6dc45819e439771c4485676ed8932339ee219e", + recoveryId: 0, + }, + { + d: "e635ce01f1844110ee78d41cc48c828d0fb89a9b32b5505b9f078af6e85606a2", + m: "56e01348d66d1e62b918c6ae1d8fc2848d99affe93d5107a4b2ac03dcb426d2b", + signature: + "205b424753f2d6738db1be603daf731f79a46f4ee3f846947b31b10d5394fe0951b457fd5a8fc65a80a7671c9b921505cf1cab927fd2ef7e82d221a3312b86ba", + recoveryId: 1, + }, + { + d: "3e81c968dfad5fe4376c00f74cae3a27c8647778295114761987c12099b2e8b5", + m: "e62fa2120c174854275762eb4d94875a5837c2505de6f45ab9c644ad7d18aa19", + signature: + "547524360c52b0399e4eaf53aac32c2e9e9e10a48fa55dbefc77d1888877bec53ec7eef0269c9d1d45d4e19c7783756713f7597cedefc5eb412410793eec06ed", + recoveryId: 1, + }, + { + d: "7e80a4a6516225935c83b99d6b1b802abfc63458affa51a1d436dc35da32ecb4", + m: "abc1060ac24696fd9de4677ded9a5dc4bed766528d6604762741bf01992fc835", + signature: + "33f6cf56a7d904ed3d26dfe71290a7481175bcc7f36497294f4412fe20bed88a53a38db1ab39afde32c8aeee288ea4912e08bd4710634a98877d856fb8463842", + recoveryId: 0, + }, + { + d: "b6d7edf85f23fa9734a8e9d2001c0a1adf55a8ef69ac4d5bbf94e909fd344296", + m: "071e6e1e5a39cbc261957a3703db4078cbc72fb246ba5419f760bb937b0202c2", + signature: + "d95b6d3be3b4b47bf4df874ae6465f8d9dd7855e9f79920cca68113dc74d2fb1493a1bc61bd756ca487269f9724796df43e03737e564fb6ccc5977cabce8cd82", + recoveryId: 0, + }, + { + d: "c54cd5a0dcdc5e61e8e793be1c6d83893f8b865a81aff62f2574b1b32f00a015", + m: "8269fdf48bae96589db983c639a41d2d0521a1890a6169a453e2b86bb0077050", + signature: + "1734a48ca3ad961ea7d84325fb32573484832febe9ddf9e2f0698914521f319a1bdf9d0a953385cbe31e0ce074b8c24daab9017561c62dd5ce0bfb3417c1892a", + recoveryId: 0, + }, + { + d: "f183d1625bbd43f3d08271f43b0269241b99c2bf9f6532cda8704cb74fe88b10", + m: "bbf3ab3b8b01f5c10eb92c96318ad71e031a9f9597bb605c31ef2a8b5403d956", + signature: + "7d6b3f646c67ef1d87bfdf305f90dacb696bdb7fb43af39f3eff7827c681694277f367af0587ec38cd5dc304f964382903bbd3a3ba2ba5cd852c49ed97e59e7d", + recoveryId: 1, + }, + { + d: "f83194d738a85cec5a1602be7c1a0cf3daf6c074e0537e8bfc2758b425dd90a5", + m: "266e42df32df8d358614e0df2ccf55a43d8ad52aeca66be05dd453cdca715bc0", + signature: + "a6ed462fcf2044ff7fadeabce94edce2dec253c79299edcde41dfec6ac7f77b06f619bf41173a1ff6e2f010968b52039f472bb2ac657e433b87d2f80f3eb0e35", + recoveryId: 0, + }, + { + d: "ab4cc15c03ab58158d50b5d44083cd6a4a9218eb1e09b0fe5c5e6795f009b1f3", + m: "9bc3fe5993f0acce0764a3259ad2fd6b1e490b8e3b2d251a542878b704cce8f4", + signature: + "151a2d5cec44525b2e6c1d0b7d25e90c7d8ec960c7665c180bd4d36899fff88c1b7850ddd42cfa055469841e3635c35fc1dca01945743d2fca23ab966df8f909", + recoveryId: 0, + }, + { + d: "c2d14d66ca0ef3e41b28c7b5f530923419e147a9faa619c97ca8a240330cbfc2", + m: "fb3421086ba20c7471809da854c524987c22b335750301095dcae796c6b44413", + signature: + "af3b4d502912312b24703733b4676b3fcdb3fd4d2a0e4c70c525bba7f4162ea3435435d51221d268a86bc02c137722333818fdb220f94d737b67747b0a50ca26", + recoveryId: 1, + }, + { + d: "7359691f7dbcad9ec952406a3b1a1dd26c389a8d4f56c6a52c0f04a1019f2e04", + m: "fe17d285ef1217d9da281e7241e88f7afb78321fde55bb3adaa71ea461a658e7", + signature: + "f69808f0a5fa15bda30ba1323289afa0d3bb7ceb668a5236223bd57a4e818bdf31abb90dd5d3b1f9bd72eb4d562fb60a7f68e70140df1019b12312efbce66995", + recoveryId: 0, + }, + { + d: "880bdb5c3383020fdeb8a2bcb4cf921fabbc5ab1b1b1713d4d97214d1ec822e5", + m: "b01fd5f98cf72604052df78cedae8b1948d24bd11c2096972f4297dfe87fd2d3", + signature: + "c671dc506c69e008f47407e5267700c785298eba4086637cf230e1db1832dee21ee93189c20d9b6b473589e10e5258f2eeb8fca267f7c39b9371c247049bec17", + recoveryId: 0, + }, + { + d: "b10646ee8cbd04913452b7ba02cff122ee6007eac4e3414f5b1e7760f6d420f3", + m: "4ad317b3aa18959e7f130dad82a2273a700383424f78fab919f0a7835b351a35", + signature: + "ad7db651288f73122852343b10a51e173c63ced9cf2b1038c884bfab4a8c999c2a8248b2ab94e5eff6b357e8e896106987ff1c7706b60828a4502b09e2f3ef7b", + recoveryId: 1, + }, + { + d: "a53d51224147b186fdc4513f90a02be100672028b97394d0fb8b894391565d4a", + m: "810a34ad29a32cb92414df945be9cb64403985e91edf78324f1f67cda508321a", + signature: + "99a8d29abc4c213fc3bc5d98e2faf78c20f42c1cd5349e530d8320aad12d291714b306a12845f930e4a8ced9f205926a797ee097f0e50c83edd3a55f21c29d44", + recoveryId: 0, + }, + { + d: "e078d3375dcd557d77f92825d023d1e713890316f9968a948199a895cfbae106", + m: "d52c1318b34c6689df498f72f73c0345937fd00d52062752cb7f1f1be7824407", + signature: + "6d49555789e74e53bc8e38704d9a581120bcc99296f4b20798e2ce403aad47a90fdd80176a1a8dd2bc78168fea531d3191deb1ee97b1ea051c6caa47bf10d6c7", + recoveryId: 0, + }, + { + d: "b95845680e31729d6538d30b95b97037007ffa8f3aebc26a47295dfd03ed3047", + m: "11f5172e9c6dfc136ad5bf7433c6f65423814b13ba4b44f721610c98ca88aa8e", + signature: + "9173eeeecdc6442e42a7f0bea3cbca51da4c3e2901eec38f44bfb0fc82ad73ac605947ab7931aacb7ab918de36f7222d70251ab49c22fb98d5fb70f0d0c511e2", + recoveryId: 1, + }, + { + d: "8b39601f0b2aaf249fa47e9b1dd267fd1acdf664e7f6184a845117eacc1156fb", + m: "6fd5129476511a41825af4fbd222bf986e9767efd6c72c9a8e480f807ec0df35", + signature: + "4cc6de87a73f0e241504cbdc440ed57fed10f64cac06fa798cf6da48468fe0ab73242f31983a3eeb953bae830e9b51286095da77138533d6aaf4a7a9876e633c", + recoveryId: 1, + }, + { + d: "1be15e0e6178328a959d935f2112059e69d1a67cbb7c675ef2285f301f20b3ae", + m: "74aad76ca70af99d6e225cea153db6726de5070cbd17fb6b47dbfad8bcfa0db1", + signature: + "bdf8bbe14f8596656bcae403c736ba05527e75db7057d6b7e567da9f59f791c0459603780cd0d3abc6feff8c11d425fdd910b592f97a85af370d983f234b37fe", + recoveryId: 0, + }, + { + d: "369fcaec84d20592f972af5189e577fdd5de98ade7775945612d9960c904debb", + m: "163ba0de0b262822a9c69c2a8b58586242124a0ca9fe63cd46c5d9558b7bcb29", + signature: + "ee897ec5a290787fef2a4f9d436b8e572ea2478d9b4fd90675b7cc20b95b94552a4d373d4ffb908648551c8895a4cc1eb6ad94659b29c739a88ae38de6b106f2", + recoveryId: 1, + }, + { + d: "6eb4c5a832114806f6e4312f432ec9c0718e8485779584c60e5a286bbb45901c", + m: "7203cf715aaff668c7c5ac2ccd548c3b8bbfe6d0a076594935a55a0c7bace602", + signature: + "14534024e5e5a9ad303f64ebe16236b44c40afe65e50174c828ee92bbbed058d329faffcb55d721dae0fed8be0baf51cff99ac2a496a33096f2f2ccd9f158794", + recoveryId: 1, + }, + { + d: "0f620d56827670f166c5cfe95a0574415ff9fd891ce692be716a77a09abb07ea", + m: "76877ee517c83e72d60fa0ea4bfde94e2f581951cec9bbdae424b81f3b88d290", + signature: + "8c7be88e7ef813aded41258857589ccb87ad43566dcfa4fe0245a6cd02cafb3741977575563d3cc4aa25c0382f33f666fd74df5d7720e70401864ab1aad64edf", + recoveryId: 0, + }, + { + d: "d14b18a754d138f299f2b567a36c09a664695948c8da16a63707159fe83208c7", + m: "9694891d0cc03310cddc77ecf0b23452829ae6f56a0e57905a8f96afbd994270", + signature: + "58b58609b44cee1b2484d8db2eec9ef7fb2999a6ee846315956c4a33022e817c36f1e227131021aaa406c82d6ca2d60ae3fc5dd8103a5e571153fa49d9fc9ac7", + recoveryId: 1, + }, + { + d: "b46c0ab12d0164a9991ee21e9091bc33c1156d414233a9ea9f14def96bcb1c25", + m: "2e01a3059b125651791225af72ab64db5e2bfc6bd1581feae755ae417eeef255", + signature: + "32b22294109235069fab105d271a080282d0544c47ed1a054096e3a195d2dab13382caded1c64bcca48ce74ff594e0c494a9c0c56cfbc65fbdbb692838c8d607", + recoveryId: 1, + }, + { + d: "a74188d119dd21786230d8a0f143e1d4019f350410651f9485a22a42285b2e1d", + m: "c251ee9274b3613b6245f52af8b78956128e644e441522631df485d1cf02a665", + signature: + "efc11fa21a9a2bf7d763f2bb958a4efade7c8599ba64b5b6310d0a9ac81d355f6e76d5c3f98a7c16d83235527ed21addd2ea1e1d54749dccbe3bc58bac8de0ec", + recoveryId: 0, + }, + { + d: "377e5779c0b8e2e6dc47b5e1bb78a8db65a4f4b8cc706e457a4364f78e122a23", + m: "6cfbd903283c7f031a32897da3acc5ce678c199911ea9e54bcf743f3a60c6351", + signature: + "049aae442ac599210e9cd1bdb16b1060b77fcf07f4a2af85d30075c1e9772075031fc3f60e730cff33bc135dbe3c9d810c0cf512027cb149890664c77c2a6c1b", + recoveryId: 0, + }, + { + d: "5c2688fbec5436269f4221faa9fc17db692b0d860b249ab1d6f67941f2a3ec8c", + m: "cf77313cb036e35b1980c9d1027e220fdff473a9e80ab22ac5741f6c8c2c7812", + signature: + "8369d953cd16aa5af062ff60f82b74fffdf84640f8a6a9b58fbe21cc2ab6d3aa43784e7eb1f0dd7f2bc7bd4528ef9a8a3b43141a88403151704fda9e4eeaf407", + recoveryId: 0, + }, + { + d: "256720dfb8535f6536d4e9be846cf6328c1cd5c6a540f7fd3304257e50fcec57", + m: "59a2b894e0e0d9724cfe2d923c4c126cabb10004c2ac72a4aa5cd834668dbf9e", + signature: + "7a137c662b9a729f67aa7fb691900d86e6aa378d3ca2680b8ff677a080bbc877744bd3667149c873f24be3d35d8bde97f9418b1c66f442c130c28de0ea19fe91", + recoveryId: 0, + }, + { + d: "8ba22a4ba9bcd4d3bc953820f9d12a6c24bf5270cb92484441737fdbb3719d61", + m: "030fedf3f9b692c5c8c8b60a51d9245622512f147e8c55a7941ffe0085c3c3ad", + signature: + "69f4c9ef7eaa95aace6f57204b41141a29a904e8f0c3fdc89ef75c8803a6d736716dab2e83ad931393ed1d08f4e9762b5ce2704b29ee3a9282ff19e304d4fca2", + recoveryId: 0, + }, + { + d: "bd7d3c6563fe018ea22157d74fcdab9b4c6a51a64fb15a78df5794a21b102f83", + m: "db7eb2afc0e5d7903e855868e758ba80daebda4c2e7dc1a5e1eebd6b3fa46d28", + signature: + "4107e6c67c8d9156ac4c78fdfa4fb7967dad82fbda4683ed796b8c1decc011b65397f84afd3de85fbe9e67bf2b8f0538db5a6473c9c89b484e304fa4ca42fe9c", + recoveryId: 1, + }, + { + d: "5457d86d2933df4ebd9c7e920587d139c6cd584b7ee2acdfd985d90965c7b712", + m: "74ed3a4bf23754af404e492f7a5826464db032b7340d027353e7adf8bd257613", + signature: + "bba3de0158a311067d811e9d5bb1f43da8d96afaa4b6ff9c070bac0acd938a90650b06ee364137f827c68d275a90214cc9957f928966f635ff88aab8c235b318", + recoveryId: 1, + }, + { + d: "bea2fa9b706d267deb14c265be87e80364acf228147655ca44d973541ab582d5", + m: "ce90ac85ae15152e80d35974e0de97f35057d50093230e8a4a11b0924738b789", + signature: + "6cfce8c9d5afd309c6c6a43f0caf802dcf1a69a4a31ca2ad2d1d6337984714e739d457d336ee130f7e6a98b59c26ca3dda74efa8663545958c07b502aab006a9", + recoveryId: 1, + }, + { + d: "e7e6d121d35a94138d8ab141e9f42b1a93e69fd4702a86358f8119a493e3a918", + m: "4f2b53808a73c91095d297e734269b3e66831890ecbadb32230aafdcd0e74148", + signature: + "da56ba0b483bbea5d56dfde429e46155393d8f5eb29dda0de0fdf084d9b54a95304a18d96f3f14881ee05b70057cbb5692a6dd994f95749f93dd1ffac3884c2f", + recoveryId: 0, + }, + { + d: "283b13b76ee8195227d1763fda7080d2517126ccc75f003ba10e21b2f7e0cdda", + m: "6449538009af5c0465574c60e02a590347cacbb01ab254a9e795ace7a9c5c111", + signature: + "4541d7a3bd495c8fb32fbcc812810fbbb469fa4c066bae313c9e545ae8cdb6d23304d4fbce53cb8576f2539be792cd738419afaeb1bb6b96f0c01d0aa68a67dc", + recoveryId: 0, + }, + { + d: "e099b7b55e6cb5fceaefd70b8d282a7376d86adfcb1d8c62368cc2df1b716309", + m: "ca110f17b2275aae304dfdf80ea1d11030d12c4c677b570899a46debdaf3108f", + signature: + "f51119d79c1a77f720072ccd6a560059df30f9ed2ba7c99bf831ef531b36509873b899604754e8f5a9585095e98174b505377e78537a2c431bdb7e5c49eb91f7", + recoveryId: 1, + }, + { + d: "37434b78079d380a54442cced8acae75db43fc926072d1251da9d6cf641e831b", + m: "d6be3dc5831460f99e6cd958e08ab9f2e0b98e1c1e69d0a71d667dab0132ca95", + signature: + "b64d8e5f37cc8ca50c25dc15221e0d3412eaf103109aa107e6b2c6c61f496651493ea3e0bdbb2f36366fd672010f7a970a50163ee1c5a93f4552dcf594b9493a", + recoveryId: 1, + }, + { + d: "da8c240543c675402f0ff60092bb165bfc9240db731b3642d9c8e8fd8f5e7bc3", + m: "865a2ec7c03e388879db60f0fef92028bc891339b6cb3bf66c8cc360893ec303", + signature: + "7175e610485cb198caa87fbd8f0c091787ca09f8e4499ee6a72140dcee520d506c2c24ceedba0bf8fcbcdb56e08cbc596aa057411b834156831c3b6c7ffcf101", + recoveryId: 0, + }, + { + d: "67d1a959ea1a32e424311e2164fcdb0d5115070ced51e9434dc9d1d8479c664c", + m: "9b461c27054c6a07fa59589b34e524ca3d65e1dc35ec49525c4ecd29fc98e470", + signature: + "8dfae0a7a790adf0d93f1be0ac193a810ce7f640b886996bb5d4b68fdd45d67c0548e87a756f8815ee80e8aa88598f83feb5e870c8cb84aab32ab3ce77823503", + recoveryId: 1, + }, + { + d: "16be4dbd89db60d2806dccf11ec064788a914928fddad8f31acbb3078c7a7b78", + m: "de8139656e58784e8a8b3f41e12259a7703aa7814cfeaac0899677c48c87532d", + signature: + "f97d54b45b156174448bf7d47c8b94755748f2918e3d9e60b26a4457d9f18f7c0aa6ffebc8dde3e6e2a29a092ab6489e8c7643f81936fe5164a37214150e2707", + recoveryId: 0, + }, + { + d: "f4d2f336965f9f97490c328791b5e20a12f54518660f6f68e55cfcb2e086beb2", + m: "7c43b690af6589bc025e3e1b5e4f6928e3bc1c153116c776d70c3ca007185cad", + signature: + "620abec2d6f6e8be01ccb79af2cb246db2c1d73675acdcf79af72808d0fa302d0a00a1def32c5650e80eb4e46d643d555ada6538f12e470556071e7bcc49ba98", + recoveryId: 1, + }, + { + d: "857c6cdfccde879d903b6135292c5b6c12f6deb50cd4940f8e34f9ca0e7fa04f", + m: "d4c477ebe92b4b755d683469e4ce90149f606aa03d18aef31d2afa87b672b329", + signature: + "b89d351af00ea192dbde64eb4659808d38b302b2fa41e587d77faf2352b4b06018bd6bdd7565d0b395afdeb8bf1ed384b6635da2d14643d8a5b263af81a989a9", + recoveryId: 1, + }, + { + d: "d09198d5beb7b23da7d55bd207db71d5139d1a660a4313e958cb94013151b678", + m: "8b94d6e55e2b1dc671667150b18ba3bcd50e2a80806f729dfe7c506f99a1b24c", + signature: + "d9a323c54f3462b54bf3978b2e1f4253ca6a047eb90d00d62ed1111e5714431d77ee6f577a73492d955b84a0d5daed6de0e0ea4df0b86b729c99deb83049cf3c", + recoveryId: 0, + }, + { + d: "fbd27b19c810c3cdaa7c7ceb749b38077d27530cc4327cf16664b9c6df6aba19", + m: "2a563fc8824f228c3ba3479b6d58971844e1a4ae3b22eb2d068f2c4185ae5420", + signature: + "17b8ee5623c130d105e524cd295476771cf8344b440b73edc779aff595f09af758e15ce4a3cef0faeb8eb06c30ef786c2ce0d619b5c6c681d876b968d1a211b2", + recoveryId: 0, + }, + { + d: "04c41847265bd5d11632562c1057b71eb0582d836a37e26aa00a29861a87427b", + m: "93b296d59483fa6e58f29391642feb1965312f467e8f3958a282f6bb824c3a26", + signature: + "686fa015a6059f39438754ed30effa0e59caab383896624285bdea6fcc6c52820ee6529b214432bd69345ca17dfc706f98e1f0ede6f424e319e843ce35d62d12", + recoveryId: 1, + }, + { + d: "b556463955647879ade299de2e91b97f158a07a585c57a6a4c4a22f57c912427", + m: "3862c5b5cc34d0ebebf209397f0652c11ad4dd9ecd43b7d228e648b9b730fe6a", + signature: + "a04c07ccc695534e1031e8c6bb0201603ffaaf0e7a946a50a06ddb413cdc3a1203c89840a4dfe8b91766918a77dda88ec2305e032453ef2fa4c7f819895eeba3", + recoveryId: 1, + }, + { + d: "82536186c2e25cdab4550b8861aa171d83f7305639e3e76e00c920d78293ef39", + m: "ba813c0b6751cc4c71d9b8c97a50f2a23db4bf5052720997019726d9188fb039", + signature: + "4585f25b9a9885464be3dc7d3f6751b3dd784a8a1b1c79b6c4c140c6d73a528f5bc4da124800aebe9b459545c299cf66bee61c488f5cb3848a670040b3ead1c5", + recoveryId: 0, + }, + { + d: "071e044c7a2aa88afb882610e6081068d3008e29c54536775c3e5d7e001feb9a", + m: "bd0e0bc49eac44dc936671246661d9e8d8c117fb93c982067204fb420ba8bb61", + signature: + "534ebd5355ec500045fd5a1966132e0eb6e2a7d27c7aaa99027ae37efc755dde2eab316ddc8288ff5944422d890daaed56a4920b50a47ad1862580b4b8406fcc", + recoveryId: 1, + }, + { + d: "47ed4508aa190ad83340a0037a1b3d70299e8aef086f6f58cac30c201d5667fb", + m: "6fee02d08fc9b6d6dab97eda124c9a3a8287db6d02c2c9cb084f656199f3c4a0", + signature: + "13ed14e6d6b2dc3b9d8272c7e694002a560588c83bdb6b063aed2afae0b9eb6801d76a6c80e7aaad37a049b6978b9f501b7c1c39c05c6f38f2aa3bfb1340961c", + recoveryId: 1, + }, + { + d: "c306ed91908cda8577bf227a6ee91be43e771f5369d25930da5cf9352f0b3724", + m: "c244774d824eee9d3239c4ee146aa2bd8f79fc5fbe01f8986cbb8d6607fc4962", + signature: + "73ea13699837e189964595243e66167f02273420accb9b5e946d312ea1ccec1b3ffd36d706abb16dd586f35d5e4194db230fdf50f313fea88f6f762e1eb18b3b", + recoveryId: 0, + }, + { + d: "d07f4cb5d20bf72be95a2162393e3654acb16cde4d5425366f265d771a693004", + m: "b92269367e8dede45fdb5fe1df8731d05189931e1c26bf88a5bed26e562ee56d", + signature: + "dd700e3ce03e3a96f550e19a4c2b00c777b24155e512182d1a43a39b966b7da23aa662247f67ae8d61f3444c00a9b4634a5e7e1f8e138d6c9471815e2ddd5890", + recoveryId: 1, + }, + { + d: "f46ac1fa0e56ea6219dacc5d6d45f85f1ccae148a51e3b3a2161a24651cf3381", + m: "136e9a285923ee718d3229605202727c3afd1c01cee1adbe34c5f5f5a81be232", + signature: + "d356a7e402eaebdbb6e1dbcfc08a9d56d26f237720072672d76aec159dbbc1601f2f72891159a9ea67ad174dc6157c9652482cb523ab4f393b6776479f26f8a2", + recoveryId: 0, + }, + { + d: "cf03c8f6ec8a94bd72e1bec089ae75c8104315d49e55ce886ee2b31b4228ca2c", + m: "b8e83bf5215873ce87e6ab7f7c46cf15b11cd9280b5c07cf6196a893a95c5666", + signature: + "17e9e779096d2a5b440fdc9d81e0b560f44d663eb5a2a3e6b601d7e66540eec368a6b0879bb4d2dcc0710a6cc2957f09027f2e8630f9217eb9941566f3575f37", + recoveryId: 0, + }, + { + d: "f95a5bed3788cfcd7ed8ecf5ab48d7c173a829f68abe37d2147a6f59f91619c3", + m: "c6a36a5a7b07f9583a67bbd1e0fbec17b69e5b68fec56c1967d5fdc0a14727cd", + signature: + "28669085898fa22f754d8570ae98ce35c18de9f8c9a16028fa6acaa7d4e5e95f2337e0fea7ced51a79e5fea985f71e9d1850a0579429efda04d915b67e9af96d", + recoveryId: 1, + }, + { + d: "c50d8dad88c45bbe5275f952a82e294ec0c1aacc89df8fcf4cddd6a8f0ade84d", + m: "3509cf9bf0918d211f18be57966149873115aa034aec40f7c897450a8d95ef42", + signature: + "d6fdced4b7705c8e4090a1afcff06aa8c1b62f95a86e92288974e5643a388b7b4c3770a670e44a82ae46ee5727b070853f49cc588fadcacdefab5eecf93bfd18", + recoveryId: 1, + }, + { + d: "67dc011d11ccf035dcf43e717c5bac36be284bf4e1c6d9d8798b45d533351e00", + m: "d2096678f5f20674459d749f7b013862fa8424caf57eddfa4f8b7019fbc05726", + signature: + "36c548a966ac401f061c90f8621c26aaad9c7b540c4f07aebe76ae65dec313a82338624205c87481ccf449468c5282f4fc1e68e36f2b3a087fa67d5cb5101bbb", + recoveryId: 1, + }, + { + d: "367fe382815c05efdcb603402425480cfb9d02ec135c275c75b56d41bf16f6b1", + m: "b5ed7ff742804f193acc46decc8d411df7e9e3f453d723efdea807f612642880", + signature: + "c807218be1df76c136790ecb0c0313400ef185e7de68eb60e2ecc36e6f2e796f038730629f8ce68e68de81f59e27f1fd954ddb07a58b989c7e62593aaf411c97", + recoveryId: 0, + }, + { + d: "298230a44b1459b8121b36d744766fb2db2876c7ea42b1cabf50864870b23aef", + m: "62580a7e98624485cf8f54e78aea3bdb9ebbea88fbfe2579ed587b454da8cf04", + signature: + "3cd8d7db1cad6fd1655ed69d0098fbcaed2a892227da852452904ecd442e2606286b4951a3c2375a4bbc2051738ca8512335480845363a4434d1405cd865e9ae", + recoveryId: 1, + }, + { + d: "b0f0df4ce6b4fd17b045e37ce932a4d3eb27d9be678ebfefbd4cb029645e6927", + m: "4517f4f6283c2a37cb7e82dc11fb5050078357f8d119dfe2a18c507726841838", + signature: + "ec3a1761bdc41e66889fb331b6fd4594ab57ac29bede3cff6ccdc1e6231382db10ad9507c7eb2befdabe3a3d770dfa85174a15754f1233d637d5e14a98cef574", + recoveryId: 0, + }, + { + d: "2cfa02762c61274e26e60a8000182c0f2dc74bca30e04286e37460f36847f784", + m: "6818cf14ab4ec66a58a8d50c2e2f472797bc8cd5a1db88b977109fd82e9d2683", + signature: + "20c96f01877d9ecd22add8307b43973ed6fa232c812900b2543683205628ce297c3b3cd4e644daff7d3049b0de19ab4acf983a4af13168611cf6d531e62335f3", + recoveryId: 0, + }, + { + d: "28169c5c4586cb8e44a2f3ee7cc2b0c1b4df4ff11509893d1ebba450f1f05d54", + m: "94aa01bb252de4ee5470956731fe00b49f4b5c2ee533699f23bf3357b33fb8aa", + signature: + "cf1a195b335ee6b3bd4249639f8ede3ca88293b8ef56cb860fe6c9fda1a793f5161fdb9c6523d286efb5a9a40dc5111e8540bc77b4d28326c765a725c9849ca4", + recoveryId: 0, + }, + { + d: "5eee35216d11f9930d9925b2f01ace4c1df8d47095bb141041f776264e92b034", + m: "e50a96dc14cb0323b1efdf7b6079a6b50d7d89f570ea1145ab0a093bef066c3e", + signature: + "79f74b0a01471564d25859ab41f67f70c10cfc7346e0b61b8fcfe2b412b8559b615cd0d693161aa10c6142d6ba3ed4cae148e7eaa66c2c516454bce73979590a", + recoveryId: 1, + }, + { + d: "dd9aceb27c38eb13ae604b7b39213d5c42ce30589a79426203f1be067bc7247e", + m: "4a5e2dde3ca9b4611e6ddcfc68e9c39092962a616d0667c5bfbd2d02357ad011", + signature: + "cd84cae14598bc944ec6188b2a625a36fb69bf7d98e3556f72dfc89d8e6cbe672967c77f799ca57698756cde8fad1f23b927e5fd64ccb8290a2d8a4bc209323a", + recoveryId: 0, + }, + { + d: "df8913c6b6db36c1bc8ae92c95160bda9de2d56cb5feafa2523935af696240f5", + m: "54dbbb0b9b8c916c9f0c352ed277ecc0587ebaf1646baa11542e307708c56c6d", + signature: + "a47040cae682989d3d3ac7258a9003b3b9b0cd7e39069c9feab19a17871bc33221e81f7ca5e7a325a68ec33e80f5d20d074aead1e737480e9fcc2245a587242d", + recoveryId: 0, + }, + { + d: "8dba5b8e19b53f18eded3f006df9d700edbb4c8af34cb9d7f69b7175963dadbf", + m: "21dd008d335bf576496df98349aa80c8782a172421c343292e7349b44d4be85b", + signature: + "8648f8a4065c743fc27405da2f3e80ce3305f5e1eeb51f60cbf17add8b013b775974fc9b2020ed6f7a018dc3982ab27e58184b978a0d0e43a02d236d546e343b", + recoveryId: 0, + }, + { + d: "10ab2923c74e57c869f51d621ca5be317e03e64b849364b8ced27148927d8bad", + m: "509090fe4a211d1c1eb004dc0915ea9ee351ddd6196bdc66d49603d8db3266ca", + signature: + "64f760903499e7de205da5b4396f153854f35c116a0ee18b61e36e06a949e13f3ce904ec04f99bbaa53be7520c4ab77778d61125f2ab915ead9aa484adf8e959", + recoveryId: 0, + }, + { + d: "74744b5cd2357dd245a3208a57d16f8ba475b4093de35a2fb7d4f7a988c3e509", + m: "15706c3f60f9be69a9832cf626d95b6e56f2c6b78ff8d85af5f532d152f08640", + signature: + "a6289cda1777e2a5cf21bc767ab5aeb3e3c1241aff2ad1f1624249eb347fefa11829f431862f72bc80b143ce62a3376d3e9b53c625d12e6f5f5ea5367845c703", + recoveryId: 0, + }, + { + d: "c4dc41a5d6e0882df6923f58c040c561d4d84e98a02fc1b36e6d641664b98803", + m: "154088a93def4f5ae6d4d47129ace98c34566edd5186bfe5ca783578d65e6342", + signature: + "c08fd2d2925f2001897d8afa82c3f602d5f97a30641c4003d78e42a269770ba17bd91284c7e40cbd170c1fc5770101c84dc952f215a8b230268cc383f3aa71d7", + recoveryId: 1, + }, + { + d: "9182c92417c29bc05ff2a5ebd4547db6f7a23e9cd853c1a6c4b07c466a88b965", + m: "33aa5acb1bf99bc07f47938922d32e6173a986fe6351021b19015c837da17c54", + signature: + "7d45553aae0710e89a80e6458a55dee2b53b57a4fd14fc9b0612a57ccf6771bd1ff58897eb44e948f124ef558c3cf0820eddc32a63c2b3242e855155a5ddcad6", + recoveryId: 1, + }, + { + d: "9eb10109f25f701832d749dd3969abf73f7bd6fe6814a631bc713fce46d4c32a", + m: "68c24dbd68181649cedb49f224f6bedaea68485582158c3a14444d259dea47a4", + signature: + "635f1518fef62fbbc56c22439e5f8a8ed0530eb87bcf7d533a6e30c46206e62200abab22098a4beaa1461119c767648514d956db99d76c1262fff71fb1a346ab", + recoveryId: 0, + }, + { + d: "96cdb0bd5a6466bfe8fc47df8bf2db739c77f935b1728937abe2e681106557c0", + m: "051c526502aedeb00bc946de857b09f7790f535f8b91f34685c35b5f0d935f2f", + signature: + "ee746b8cd1d0b9465d382d35987fa9afc9be42473a08bf5447b6085fd20ab4f33a62b2f25da5f9a64c61067a047cf3faa2dd7a4ad82c8c06a93b041b43f37302", + recoveryId: 1, + }, + { + d: "626011674ccc2c7b1d3109e04f21866f17e1a3915f8198bd760c5db080d8cc53", + m: "9cfc636fe0bd05f9e96f91dd4d038236a9684a116cc64d0b4a4324921a03dcfb", + signature: + "4a87499be904739aa4dbce7a04bf867d42dabf04ca2095788e63c8ec7b3708a74d47b209f579a6160c30f7b33d176a5aceae5d77c9e4fc5b0b03506832da7408", + recoveryId: 1, + }, + { + d: "ab353e233964bc4dcb5fa89b85ee86396b203867676894b37915f0d941c78426", + m: "06bee229492749f1c2b1c05b18167c13eec2a66873875da85768566c33d26904", + signature: + "6bdc4723adedbc4a965dcf2233eba01a688dbf4f3ddedd41714e413efa4017247a66df8834bc5e35d2da8155c162c9b231a7693183d917678da2ceda77c78161", + recoveryId: 1, + }, + { + d: "baa6eca8eaba7fe6f13cbb09ab56d1ea2c30db7139cfb0ea21bb51d0dc7a2364", + m: "c694e356d95fb37e1deabb3e9ce6c7ca68169468ddc34f0282c9efc40f6499e3", + signature: + "53c3458cc33bc5c5d711d4094f77c07e9c050293f87b526dea760cf02594478d32eac2396f71a1a0f18000735ddeaa9357bf7a197525f2ee9d1db55a83a2bfe1", + recoveryId: 1, + }, + { + d: "d0c286e6d746c8eacb5458bff7227ed62adcf4c2cb8a13342d99d0c5db6d392b", + m: "c0d25a739fd3eb12068a83f4365a67115808c008a5671761ae783ac58a95dfd2", + signature: + "7888de73599ea12fdff59c5373db94c31c01fbd22f172f449d8d39898999352c2bca4d28681cad63985fdb14d32a4920d5a31ec5fefe994af56cc1465ebe25aa", + recoveryId: 1, + }, + { + d: "ca4a214b79afea1c28998bc88de7073174df34dc370b206699026e3b2b8b71b1", + m: "b9ca330d4c9af03a1013f1ee204e13419af45df5908198a45e3106229432baf9", + signature: + "a56fd85de7f055e3e86a34ed19c269d6b6e38a991a871a8455f7d2d9a28de126247108dbe2ed8dd692185424d562294c0e99e15946a8518cd161e594d197acc5", + recoveryId: 1, + }, + { + d: "ecf5d65eac8d11ab9e0ee9746d345a3ebe414bc00e053171ade6e1bc8faef1db", + m: "5c5ba50eea4df5e5e649b873d80f18219044fbdc8a3248edad1955fdf1f181ba", + signature: + "fd2b6bc9ea8f1a130307c073bc2fa2ca87f5c5013d7bdf125560bcdc07dad2812cb5429be26b6d108fa90f544b2197b6eb1c61fd1f3144e930e8df858d2d9a00", + recoveryId: 1, + }, + { + d: "9cd3617d721aca49062cb3f1d02af17cea277c2fee4150ec16eb69bd6d9de709", + m: "dfc81456eb17d5f570916dfc99920f36ee632c45107398f43667d3704f97549a", + signature: + "9aa131d35806112a5d2b065536969324d8986cbdfb2776e6928bc044b21c7f0a1b055a484dc22e1be44ecf3d731e7d87736c0eb6c954ee696e38874fc049e332", + recoveryId: 0, + }, + { + d: "a9409428fe47f948f35c3b1167c44ee548e7bdc8b446c3b7517653bc1ecc6b8f", + m: "0055df58a4f8e721128b54a6a0a4e8bfe8635d6ca6e53ae599fc02c110663279", + signature: + "706c5de4b414017cf4357fe13d37ad7bc2631ac25037448f41ff87dfefb0bc0c1fa9048ee35bdb0bb5fb8392917796f88d68637735fdaec06a48f566b8ae2098", + recoveryId: 1, + }, + { + d: "48535ff6d57ac258e2167982155f4566c8f57103340f931aa7c58cb150a33776", + m: "69670389a30b87fc72642d467e3fb60183ac294c2591a5849dee22df0fa76d0c", + signature: + "46773f264a69ea7cbcc04e4f4127593c60452df142fd821fc34b0340b848852a33b29173d4371c3a191e3de9adcf9b1a199dd3900e50afa789d391842f638878", + recoveryId: 0, + }, + { + d: "2abd12e86b54fe7dea70eb706015274c087f59399e3fd97896355e62845a762c", + m: "a35631fca676ec1abb9ca6e28945b202587b3998fd97fd667d2f655cadae128b", + signature: + "d8ec93c39b31d91497fc7989ba968d23a8eaee0037b353bde2452065c5564234430a709c011b7e9035c41d6b383eb1974d0aa3c24ba225f31d8d90247b15c3b2", + recoveryId: 1, + }, + { + d: "8a685aed382b64df8534467dd76ea9b1c14266ccfd776cb6e235786da96c540b", + m: "fef24e7d10c1062913c7f0299735239b68c5a71abace7fd692895edcba66d926", + signature: + "2317ceccfc620b6d7827cc55423a6d9db49c6273eff1d3491b92d01dde17f2ed2ede6283fde44f83441aff60527e792a9e3575d17f8f268ef6103f5cd6cfdde3", + recoveryId: 0, + }, + { + d: "e94fe43c68c4fec2077aabb74bbe45e5839c36dfd7cda053d96c07d244a4c2d2", + m: "b29be5d36d5d84e67b6d1dc710e2e0048e04713240926d3609542f199c254bf0", + signature: + "6263bc6eb032a85faf42fad6d6b580ab80f2cf0028406cbfb887204249a77b7c28bcb7df40608ce7253f64fdfbfc3f498af1234e1ea65eb1450427b6cf849038", + recoveryId: 1, + }, + { + d: "6f701b866c4b5e131c8d776b3978e9091d6a95406953a9ef64aeda838cc97a92", + m: "f8ef60b056989e0d3e283d2e182f016074c0365fd3cbd81cd1673280b4be96c1", + signature: + "c97e02ebccf9147e82977b1b1b490eaf3aea1af22d01479b7251f3ce50a136ad664af02ceb53ea20f0b9e818264b0acb1aac26800f1bc5ef8714a3caa847d7cb", + recoveryId: 1, + }, + { + d: "5e5367715ee433db576b659986e9211a6816fa672912af1174a7526d37790475", + m: "c8bf9b9272a3f12c32c583e0b781cd727b6f8b695de5cebf8a58f94761bd9851", + signature: + "bfcff43d39a1aea603f8c0787f97744dd94077eaa86a1057ebb11cbd42dc4e8333fd6d791128d55047919ef63459338dd90f45c23fde78c21e01b8173a0d0438", + recoveryId: 1, + }, + { + d: "b9b942ab63c29c7840f2b25d3fbaa33156fa6f65ed729fe39e84c68953c57b05", + m: "86e48d919c43f46f0b7ed284d525bbfa216c9765d1a8309c30becaca5f9be4ed", + signature: + "245bdfb488408b753caea74bf774dd422f01f6b2cbdcb25be2fc00123c5d8ebf6c3937ca62170e5fd9383a7e99fce341a13883a92b4109d64049ae41a920713d", + recoveryId: 0, + }, + { + d: "0506c971c2ec41d1a5ac565fa4030472c0cc98ecdc71f18d548f8ec81a2a39d1", + m: "0c2fc53f2c5c94372af11c5c87c8a5eea6e9801902e20f59d4e0f887c65e8fe0", + signature: + "da41ee84069961518f2a1661f7f3831364ee7a47c801814ad2d5fb32198369656bb4cb5011edceef8654fe616e4b592a30b82a0b00aef937a9b4c79f6c384694", + recoveryId: 1, + }, + { + d: "ba72afccb43b633e742d6835327bbb1b996812371cce1446fe260f5003c715bd", + m: "2aa1ec3a73d2900c0ed04908ee813230c476d48873d7a98b39f97ef0fa965f52", + signature: + "6aa0ff6518f78160365f8c6bf699f45c21cff530eb1a1b8f78bc8a2a62d75ff8232e3a98f68bbedfcb1e478642c9e0b7ced798e9ee8d503d2d6f73f0d1da20ac", + recoveryId: 1, + }, + { + d: "d9e049a0e177aa8951eb433be61a2044de5607872b8d7b3e27b870391b08602c", + m: "d4458770b60ceac473b7432b9cd02e142223d157ea5166337f7e9877af09eaa4", + signature: + "c8bcc7dae5497f48b294a1a9061d6f3a6d76ea3d4a3af99d61ec7e6ec08dcf330a206c72e038eb380954765a0ac11145a62ce36195fea9bfb890499a78febaa9", + recoveryId: 1, + }, + { + d: "db348c89404c82c8705ba8c6ed35dc1d8d9f3fa634b8a0a240c184aae6f3d502", + m: "f5a534c769212f20d59a97d3cdf50fcbc11c6c4c626b0a1b6e27584e8d8d3300", + signature: + "baa342738f134e3b1a9414384902575e911cd09212755c28a073431e9274946f00ba5ae06b23b8b7990a12125aeb34e5743024690f9a0fee13e73f5801008faa", + recoveryId: 0, + }, + { + d: "f715e406c8c5d8f7b9546c89915f18439b39e50f3e7c6b4d94df0d7a4a6e10f6", + m: "9d41a4a6c5eb0733de7fedb85cfda650a843f8d28fe772efbc7c1c047ace2a1c", + signature: + "dff2cc21b77dbf6d4e0d797ce8bb1b20c12717176412b2737257a63a5147e4bb2e623144d81d31f40360dc3596882d62605e25971102208a27ad42b4f683cc8e", + recoveryId: 1, + }, + { + d: "4252ae8d3edb6f26fa8312837c3326d8ece0fdba09f2cbf5087f9410798d44e5", + m: "b26ff0903f5298fc6a7b6503ef5633cbdb221800a782cce0ee70eb7e9b473513", + signature: + "68b29e8fa65830b27471b0e9c1bc5fe31eaf2144a8034cf75bafd28e23ee10e0078cc385a2dccddb4c610159a98b467161bb590fdb66276c03180dccdcb7b917", + recoveryId: 1, + }, + { + d: "acb961a7ed125c3084a8d6f72c32c2cac45d00807834eb9bc46ee08694fa5862", + m: "0906eb1a9a47a080f32c74b945acc0c2dc5a4a3bb561143c4cdfc1a6d183767f", + signature: + "5d8dd6b05bd654efb96a296115d177bff2ce11941db604e8397a5415eebd4fcd68eca9b380e472b3d06b6c25aafe173b59176b15bf4e7e68f843d51af216b6a4", + recoveryId: 1, + }, + { + d: "aa1f041fec0289ebb25cae15c900f9450c8fd7b0587e6246f194f67eddbc3c2f", + m: "78122f5a0d15e27ac365084685cb51f597c79d30562c020cfd2c8ba43ac77f72", + signature: + "d293eeda6e906cd882f3905c29cfa171cd7534ff06a28d46ceebc0aa0f5803fc08ddebd72fbc8b69b35f6214f2ee0100e96b9feb57fff4dea53a786ab453a241", + recoveryId: 0, + }, + { + d: "ef83a72d726d750260d86f84f53511526e62c7d5172330a0089300889ab76dee", + m: "a3102e7cb0658d2a21dc14d4b72d10a959a899e51c6205dbc0b978ce3f298dcb", + signature: + "fe70811af0b059e0755bd6bf516be9de24956364d20e241e71690889634ad0674c4e87a5a2add3140272dad19870ed2cd2fd5e1c27d6af9e4d41cb40d8267477", + recoveryId: 0, + }, + { + d: "dc78a41419d1174246ad2cbddd5da3e1dda29bcfd0a4518181fb9f3e74acf681", + m: "56e1812f1c0ad193f904d7bfd85b053a7fa6bf9f69a25c884b2c37452e5ed01e", + signature: + "614fd77a2f42815ad4337a24ee77a8472135958c6ebc10a1f6f9856ea2dc9bac3e547328d16ecc630321e54332041686866982790e9024294e40814cad632079", + recoveryId: 0, + }, + { + d: "d23c68798c2dd04c08e61e2f729a175452e0178dd0b97df990907096cd4d091c", + m: "7dc75bc0a574128817c04827ad0f1cc4c71ee01eb2b5fcde2ef6074bb31a19b9", + signature: + "725b981b7f09d49de8263629a257768808b0ddc3a44f695b021dfd99bab6f7da06cae97631a83f2bb43946fd38bb4d166692fbcb3daa46896d72f86684ddd226", + recoveryId: 0, + }, + { + d: "977c469f6ff24519f9d67f88b33d57b2ab6e0bf74bdd130ee0b5f04745d21152", + m: "eef5e70766333a0eb905155572621bb15c8f3d4d38e4a9894d2383bf84aec571", + signature: + "2d8cd345941393d1150f3356d16bc6f6c4e1ab1277c620ac0d9787f83cd5cdae21ad4b6693379f2cbe3a50a7d5c47add98ae22c5c21d6c3a550d6aecb1456e92", + recoveryId: 0, + }, + { + d: "7bbf4fce67397ff1e76716819b27a3eaca4579257f05b6f200528fc3dfc51a17", + m: "b1121e4088a66a28f5b6b0f5844943ecd9f610196d7bb83b25214b60452c09ae", + signature: + "b7ba8fd2602bb64c8528f8cca0cb9a8b150d49179d00d16a7fe405b408d62ce2716973111ed42afc0bc4380619af657363d2240d24e0437786b61cc1a1bc7e6e", + recoveryId: 1, + }, + { + d: "55f3c67415fbea4fe054f632f8a98813ecc01aa6bf1474801f54e2e743cdae78", + m: "b66022990f602239c7ca29eaf2605d3c5ce37b736e3b1652a1c041f775fd7eb6", + signature: + "1f63b84e22da6bb5f24ad7d022047ac8b080acb8cfbe7bb831a93b0e62cd0735134c2f020a59dc6d44de45f7dba14b8aed0c45e1cd0c2662e8a62d7040e5fdc5", + recoveryId: 0, + }, + { + d: "f8446653e65042171dbce6718c1a1e6bc67f1a05ee4d949d4b0d158bb4d1b5b0", + m: "26e2175d5ce359f256d4c8187793b535baf7c7db098691a632da0d29ab687e08", + signature: + "31572ced893575ee38065d99fa0a55bea7eb3ad3331f12e4c70d25b3a37dfd910518537796db269cad744d9abf2884cb5750824b4379c77cb2d65da8b597027f", + recoveryId: 1, + }, + { + d: "58000a3f89dbabca17852a8b55eea2c479294eac681c4c007e67c40865617523", + m: "8e10861d326c6aebdd98343ebad52820d6e6158ac6aeddb82e8c6d754a5920cd", + signature: + "3850946625238e9f5c3a2e88722d87b36d0d6c10c94841b0f99f9a2cafa3bfdf0fb64c6278181504dc05cd3dcb57df040e1bafece9d2854ef4a1fc4a558eb05f", + recoveryId: 0, + }, + { + d: "2940c99bc2cf25852a9b9670cc0bc006aed7a5311f865c3340900103663da76d", + m: "63b8b5b457febe89199f7c1810ce58a8e7ec29908ea08c70d36a118d518b843e", + signature: + "9d3afa1a00bf417ea14f367b85a105e6b4f68f219a615e679ee12cd084a81e4e4d674a54e7ce6b73b65f55710ddc1f97d6fe2312fd5a09b865134ba54cc089fa", + recoveryId: 1, + }, + { + d: "7278af7b39329879ac3eec05493b197f4250ec03ec8dbfa0e87238208b03d91c", + m: "cf61f227d2e35c9ad4c0f6816bccd0019f18eea409396e0594c6682d2defc7a2", + signature: + "072adc3ec7d5f35001351efb2ec81d39a9097430f05cacd7cabf30031e88e0f86773b039c4a695e3ceed4262b0ddf323140c2e56f12702c7c21a2204569d1233", + recoveryId: 1, + }, + { + d: "8ea3dea9c97c9905f8da2605d082b28feb4780b04e06792ddb613de391138ac9", + m: "388787dc09c20f795b6f3719b09b2aa719ad5b6918e64d1e0d21705f99dc8ebc", + signature: + "9af09546ed4a439c67e4befd406ada11180889529bb4b20403ca0fcf8b945110620475acebedf2ca66a3463cd9284a23dc5f42810949a55256b5c92101f69732", + recoveryId: 0, + }, + { + d: "7754b830d6fbd373baf7ae1610da1b41ab26ef32fe75bde6a3d26937175ce104", + m: "cb893e6acfe94665e8ec80a8573cacc1565bf0e00b8ee4613a01c155d75d1f7a", + signature: + "b454886232ca7192c3a0cc5f56c805453539ec68510eea1f0335bc1ee0f341755346ca95e16f650a4fa8581169517bcf9ff393cf3bf541620cc596774e4cef6b", + recoveryId: 1, + }, + { + d: "361530e79c11db4b91e940c0ac00b073c7bd4678df90d77799a497ed8b96f721", + m: "0cc1fb53a250aef4b39d42f9701971a1baed319c7dc851780297817ae1fa40cc", + signature: + "6161fa37783194342bc3d9790c63b572da58227c683068127c3d624c84ea6bf94d607edf6351b0dadac9629b7c9ccedbb4faf30744f4534f94c9607eb181e9b7", + recoveryId: 0, + }, + { + d: "49e5787cdf34680732fbd8a1cfa9c158c597694a4778157f053d9f19518213bf", + m: "b6c9a8b724e7a0cf806b60c9f7f9bafd9286ce38850be7062b6373f3dc269332", + signature: + "f5c09975d4188b254931e63d3ef16e012f15772a95b10d9acea281e3f5b60e7a439fc24740ad6a57db84992e49a465d76fa76ff5da6b1e26c84b0fbd6621bfdb", + recoveryId: 0, + }, + { + d: "6628c2977ae4bf720e52bfdb2c5c9df7493efceb726fd94ac0d14be677c29e29", + m: "87c4fd25a376daf9ada50658ab84ba82c7730c46a86c8092bd68b453786dd950", + signature: + "9f7447c9ab74ac5a9fe43613b59fa3e48ea0267d469cf7a7bc7ad5b6b1da2f2f6d75bae04f8f10586721180b943abef70ee7a9ed64bc96f3f26f5f82a881df5c", + recoveryId: 1, + }, + { + d: "0370b9cf71443908300c84e349e1f30aba32eabfbd2e0082da6ef6299f7cf36b", + m: "ab23c1c1e959c0c71abc7a148955f98f3a97585c857dcd311704bafebbaed57d", + signature: + "9dbe378b3f79e321e6710f4804f6eac51414ee127a357e7b91ae6f90e201369d454c4dbdb0e70c88ca38be60c73af8016c2b56bd8a7c8e9cded10d12192583c0", + recoveryId: 1, + }, + { + d: "6e1d53c7a8c5b92b7da0576bdf57b4396a2e566058451d5c3b676feba5465484", + m: "16bf095237e949893ebc3455794a519ad94afbfc9c1f94b72b2edaad41fa6487", + signature: + "a4d80dff8f9fa83945d80783614b18fd5a1aad83f5dacd554d8198dd989ad6457a019dd82ae2ed9877161fb07b15af32c8e553f22591433b7bfedc4acc7012e8", + recoveryId: 0, + }, + { + d: "033f71050a8344ed0dca05e88d3c15357d26025ef6a895d831a4766f6acbbbb9", + m: "65b5f388914b0ef21706956d5f2a639b6db30567ebe037442263bc81091acdf2", + signature: + "9f9970ee1a3827adb72b32fc77a594db4725c2704b71ba3c3469f5f1716595696b69b1c13aa5974b0fa3f550f63e3e51b344fcce574d321550f2e1019178f413", + recoveryId: 1, + }, + { + d: "2fde523a2d6a31b8dcc34aac1a6ed2a182881e89f05148d87df1f19df46944e6", + m: "ab46fbd6a651c04f19f206977664a2abf3d50783a4252fdee3a09ebf440d5973", + signature: + "b1797a1e3ebef27b846955a93cabf4ccba43d66a6cd75c1ec84ef9fa77f07ae872c6104289005159f8b2dc56849109b8792e728b87d91b5215088ffa25c78801", + recoveryId: 1, + }, + { + d: "2f73d1c4c02d4f1ec16dcf338135c8571b9605012d5d8b789dd7fe5e08eaf89a", + m: "b06f3fed8f76a0649a3b55b922489a41c4aa66d7dda2194a29af6ce57fa94643", + signature: + "70dae38d549d48bdff1eb3c09e7ee805ced2a7cbb83f93d3b76a8cbaaf4e76261d6b51fccf18cf026de787efbec10cecc78a392cf4e58452b8211e3e8b93f64d", + recoveryId: 0, + }, + { + d: "4ff5884d5f9d35db39548cfdc4f2351ec4dfc05ddedc4e13bc79971a19e2397d", + m: "509f7f582368c87a55b7f4514e265db5e62fe6f3a701da2920c8b6fb7339b538", + signature: + "89cb02369e466341e00b441085c80e7389ab9114298f8756d065cf4b7d1a1b606ce97ffb85e5b65c4dc93828ab6793a72c428ab6b5262692263bd816956f3608", + recoveryId: 0, + }, + { + d: "3dac48bc959e37b9005025842067fdf9790529a24124a203a359a01f525cc55f", + m: "585e27d1a7d4bb3ae85f161628248ada5d9191574b87186d6fb2812eee2695d9", + signature: + "01103f97bb920ce6f1d77f8e05fbb0a7e5518f04bc5b26e253b04055b9df50e010856be41bc5cd2426018cb837ece4da560418184bfdfde2b775dac846b73c8e", + recoveryId: 0, + }, + { + d: "ee1f6933bb49e877657c7882f1426e7711f329016a242ce3ad634214bd65605a", + m: "7cb851271bcc3ec86254634c975a80ea040ac74be7b4e93316f4b07325e25d50", + signature: + "4d1497350f0665b1b0208dc210dd419d6edb0d3dbd8cabb660c068a34111f4654eada631be8533bf8616ef73dcb0a7dbf127cbf088c3e456a703c33d7a549c40", + recoveryId: 1, + }, + { + d: "a8652b794497d9850b35c91e36be1b9018968cbb771b0849df015d13a146c718", + m: "f4544e978cfa1f299756fad2d97b5034842c03720b781664dbc9ac7be4e5a33b", + signature: + "dd526ba9857adb64f2ede6139043ceb52d0462d66f140e2f2873d70b00889a831b4b0019a50ed99770c7cc4c2f35e524caa0a535841521b05d10d7934bbb2868", + recoveryId: 0, + }, + { + d: "7d7d5ec1db7eb243f087a03c56f9344aebc34fc2fa0c26557160a67771d58ef3", + m: "a687c86536c0c94b69ba242667a8b0ca730d8a76dba820ce6adf8106acd02df2", + signature: + "05c40a3ccdb185c2457fe69036c8f0a017cd0ce18026ac3c8cd87f1dcfb32cf02658629144db56fb061a2dfeb2459a72c45a3d24a547322c6f9f135a9258d2ff", + recoveryId: 0, + }, + { + d: "dcc6bcad87f6b9490530bab23ed4059f662de7fa5bc20e3f38dfc5841ba19a74", + m: "c32a2b796a57ad34df8be9520ee26cab780bf5ec9f29833b89bbf7dd0863c047", + signature: + "ca0b5569825a7b3138db09f9145eb40599704088d2c85e6d997d5a191a803b5d47d91fcace189aef52de7394040867f9dfbb7679a1a77f8f2b83ba5e1463f094", + recoveryId: 1, + }, + { + d: "ab34232d74317bfaaa9b728d7330ca2a94eac9b0eefd03961e6b26824de321ef", + m: "3ba4e8d44a5fe746d147318345be776ae3d5554751cd5d687468c4cc320e32bf", + signature: + "3db4372647f8d669895743b6e83efc43fa190afa73ad27ca0ca02f5ec277ed9142e52269e6c8b78a416d213630bdd03765b6188b39caa2621ca381be4b1404fa", + recoveryId: 1, + }, + { + d: "dc68b8fe38bfba1a5980361dcbb54fdda3e2c84b5544d83fd55631a21a8641cf", + m: "fabad3369a120088d14eb533b22fe5b5ec0588caaf46a1f32f2e7cd550a5235e", + signature: + "a4173240e8a9f19587512f1fc0244e62b590646fbdb740fa2f6950fe413d4cbb2d5672e5abf84fe3609042dd8da24f07c7fb690b277e9a09858f745de872cb22", + recoveryId: 0, + }, + { + d: "770908d59fcb9eeae6a4cfd629b528c4b5f92c280658b4a6434436765cac5f7d", + m: "338309e9961a930103f50945f69c83e16aa3b31554eec7407bfb68597e832f5f", + signature: + "5b716f0e8370ad055e21756eeaf4e167556f41465c6ca281c30f0b1df6f332e82fbe0b807e5ab1113491631c21e28c8a9c0b52837d02dc254d6135d7a1340c9c", + recoveryId: 0, + }, + { + d: "87f76d5bfb7f521685784ff74c4f25088e8b60d21a2a7e5d931dcaf5ba212e6b", + m: "6744a96df80cdaf79b8ed60754ebfbb51a7a0c09bdfb225dfa6beaa67d99c818", + signature: + "196a8d2f3157d6cdd7ab33708cd3b3b5db1a031a61e66a3dc23e695f6f4e59056bd62dcde3fa87fecc0c35a34836dfacb3e3afa1a7308a1593a325f2dfabc5b9", + recoveryId: 1, + }, + { + d: "a246a3d1c2824b8cabd09c0cc2e3d96fb1953515cd20271f6b2b5a4f8a86881d", + m: "f9f9f4b213f7186d6fd034eadfb0ad0f65e7287288a2fd3e2592f81b6ffc431f", + signature: + "8861cce06efd2b9adfff16615addab6cef9b416be5f43e9f48f88f350271978629b6500ca14e0752b164ab378bcc9b569fb96ff1254d73bd18fbcff1ef9b70f7", + recoveryId: 1, + }, + { + d: "39b020ec6c3343a154e14b43ac1c66118482c48869c27f8d415f819b616f6409", + m: "b83899d2e41f17df01931e25bbaf3aad1c582c16042bec46263a0309766ffbc9", + signature: + "8d480e12bafa6712cc09a181e18618e965705e037ff7c63fd10d25c9a13decbe371832c5637c1e640d238693032580d2b2547f26619bae878d38e917c3ff9162", + recoveryId: 1, + }, + { + d: "127aeea914832362749822c004ba8e1a7cb494f232a1679cb9d73ac72846c30c", + m: "7dc6c6e329d9241b8f7aa446a02a16e6fc6cccc638dac8302ea82c36f1ab649f", + signature: + "e7a27e1e11f7c48b4e25c3e9ab4448b9001b4dda8a9594aa9c86bb2780a7837b11f758e3d299f52b547814d780eecbc573f665d3780d16464c962e8c2ada9429", + recoveryId: 0, + }, + { + d: "2827ccd4d56962ea93904608e4b3eb88f07ac05ddb206ff2f23a7fb21e38889a", + m: "bb6f4781e6d84614da5f6f79b757d4cda35df3fb1f35cfd0a1c82aa96ac1aa27", + signature: + "00c2507881877259b8698f8504645ad467696b6d25d6f236b3468ce891efaad653802b94f5e7ee87fe3a9a1aaa740a64d4bb73d906047a599181951453317742", + recoveryId: 0, + }, + { + d: "2eb91a318062cbd2a06df817c92a55eff60720109d8f51a39a7ee3ab1ac62d39", + m: "c890e56a460b3e7c5d40d2e1400359149848401a65227c56eab175369b519120", + signature: + "986564e675a92011a103919f1d64b5ca41cdbbaf0acba60a036bb8706982a3401fa56f89f7c64152a6df6d2fe778ec77f6e6b087aecf5ba19a9395e1ca45ecf6", + recoveryId: 1, + }, + { + d: "e001ba43f78e7bd1ac2bcfe22c323e7dd2fb62d3a918d05216b5da6ac123857d", + m: "4b408ce517c7ef218626bb6f615739e9fbaacbe476a3cedbd0125e20647f5105", + signature: + "779e29e0554ba5b8eb75710d8355aa2727c710a3819bcee930e5e4f0811933b44fd66362f6302cb0761fd4778ad2c955c061f5d3bc9d31feae2bb1d024fe4274", + recoveryId: 0, + }, + { + d: "f1f2d1ee05ddf9c199f0c8580a97f3370d5a2349ec6751eea818dcf54543b428", + m: "a6753471cd6a91be2724c8d1b33b951a5eabbb7662e302b25516fc45ed4f3a58", + signature: + "74a50a42c629f7ece7eff8801949cf6468ccc039e37377dec8fc4ef326a5546b3e8419227f712c3d86840654e37e2842c99e2df5b0e567f25b727d68a8fb0973", + recoveryId: 1, + }, + { + d: "a68f36472c9f14fc2d274202f4d0e7d2d1c95858224f512c6cae823f9a7b66a7", + m: "9ccd47309aa67e219d756f2776154be8bac3143f284d4f7da3f1229d13e8574c", + signature: + "1e6bea1e4e1ff239e9372ef77adac4328e135c6dadb3f9383ea75d12cf3f45ef515054a5245fedf220553d3bd70e57c9f21b8d01feeb3cd1588214e5f3badd20", + recoveryId: 1, + }, + { + d: "809e7b02959112777f6c74adb69bbaed0b9e62d38448d1631533c393da3fc7a6", + m: "cfe7d2e08f9fae3bd4c5b85eac167f141ade2f453193eea9750f2a36ea3e62f2", + signature: + "b8f69ff3612cd9119e083c6c7f393900826fce95cf85e9e3fb957c6aa46ab694630982cb28b95d6b9fd521bf3be7c95570102dafb33883a53476cb6eaa07dca7", + recoveryId: 0, + }, + { + d: "7e481907b6fb42aac8532ee53ed338219ba0f16ec4a18dfa259f9480ed9988a4", + m: "b173678ac919736999553b2f40f7140fe67e3626e3a485bd3c442a75ca9c6fd1", + signature: + "d2814536b4c518f63e36366249dca4dedbebf8a462f78daba8a04f5847d18381771ce93349f486396eaf4107174758c5a16b2506c54b34c9cd3382709a6ad276", + recoveryId: 1, + }, + { + d: "46da25627dcfc06d1ab9a22208ca3f8a5ac4ef76e93fe85c196600511ecc099f", + m: "449457824c6c07624d0454da3e5abad72139bfea01f0380105b01cc3c5de5317", + signature: + "a485e163ebb19593987b56376d6ce757d6e8549e10e2114c071fbc5435ad72920f7a5c377dd18b690d03a389195a39bd53a7406391b0219779196d739209b95b", + recoveryId: 0, + }, + { + d: "0169b031b9de01cdbcc2585d1b92ce73727d02e35f0686abe3e712c0f2feb944", + m: "9b38e880d682113e87da6c439a60ef26e3c66a4ec147b3493029ecb832e67034", + signature: + "f76495d779630e6ab6da8c51430f54c176eda18021b6f05d5942a80dd2cd56223de4f54bcc7249b6921a31f8cf4a1f5ab196395ca805806d78298c2a642b67f4", + recoveryId: 1, + }, + { + d: "6be83973250e6275a2923a16c90137e336a5327d2f794184825ac36d24337c61", + m: "f2ecc3f1388b36b8ec2f6c0e7e5f75d8cff15549d6bfd4f7b4eb6e3ae393f463", + signature: + "36937be4c481c40714d8c8d51d20883ab240019cd1ef9762dbdb83fa77024d9876f09ce553ca85227ed58235557b91f0c9b1925f2a01c941e8514bdffff8cc81", + recoveryId: 0, + }, + { + d: "ab08d336075406307b22d1edc44e0dddafdac76d098333d8f8fdc8bfe2f79817", + m: "fd8736ae725a51a2f80769e2cfa93ab200f662d2b88e11f9e2c8ec0b679c352f", + signature: + "fa51edae70ab4d4de794d16907bbc73ebd63047fa26aefe59a4c3555f6c30d557769afa6865f7be70a62aff3f4d28ae283ad3d3f6a8bfd1e59e5c6e93db30374", + recoveryId: 1, + }, + { + d: "1c31236c852d55c860e3e60b7ff182bc35eacef0302d2b04ee46cc427c21cbd4", + m: "aeddb1c27091f08ece6777cc2bef7a67b7d2d30067f6143c57d9a954a600b195", + signature: + "7b477a4f68940ad35e256d4c29126e58c5e673b7aa4a9b89f2445ed353978d84601e72f3416f6d93243b877ca0ea38cb2290bc6fe7393bfeea1176600c47fc78", + recoveryId: 1, + }, + { + d: "f22166e9c524dcc67d98e7c826b4b892b59695aaeb0762d7e821b687caacc248", + m: "6b693e53ea1cf71d12c6cf2005e6c02343731b71ec447a0c1e02a412a6efb5f7", + signature: + "5495e3f40896871bd8c3c5d39f6a609d0f52e7ef515cb799d4b3ab51f1d28b55080ef0f15f88e8a9f0abf86d149db8961f8ccc210543ec216e8714fd56b788fd", + recoveryId: 0, + }, + { + d: "50c5093125a3f4e04656fe372414c6c7fd74b2d892748e363a6d16c39e8b52c5", + m: "ad94f3c6514ae1184973a15f286d6988f16c83abace2cd40cb4096c88921ab14", + signature: + "192d6b538a7a934831d6443915810e8ea74cce208dfc987da8b0788ab327255f7dbf2dfdbc5323ed621ff069d0d26477ce6e704fdd71fffa10d79a39b172727b", + recoveryId: 0, + }, + { + d: "82e01b9304586a06db124a64f999010ee3f0d732061487926caf33189d5bbfaa", + m: "521ca09152839e1a41f48bb62ba5e4fdc63b7b16396d5ce24b865776c033daa1", + signature: + "48d8755b6626a7295c27d6edcf4c0bba78531a93a947d22a88b7d21483a149bf79509097b68c465e04a8b5354c61f26b23422713a3dec1e608f96be74ede6841", + recoveryId: 0, + }, + { + d: "daf13ab66d6e84b4adf5195baed5860a25c914b66599c900315dcb70a93fb4c8", + m: "94596b0b2bc557e44877a98aa29111c1dfafad63bcbc07ded275c440e156ea56", + signature: + "f93ac6c10286763444688d7b7a63bdc21b4229e02ef857e2a7dc3317e602bcf747b6a6628f32bcad4c4072ab33f44927850f8fecc7df4f6e7d2e03d13d6bc312", + recoveryId: 1, + }, + { + d: "8ede3f0fdb7781604348efbf161b57f2fe2c09a4c6e9c4095909e2c8c8ad1fa2", + m: "1b82c60f01bff676662f67c3a6f0f5138497003b4b56bea6f33550f9be79b81f", + signature: + "cab5022e5b3ace84c2274b64f2e0591df0db93b508f6e697535ae5394b72cc4c5a14fac17d8c4fb021f3d1e14a45552d755c861f84693e07bfb5fc914f0fc3a8", + recoveryId: 1, + }, + { + d: "838ce63773be6430b9541ad020d77913a92d9e6a369c425e8992a2a35a4163b5", + m: "c21c87b3d4ae59e45783d6a1f663b9ed942e24e8b878949dcce3d3a6d75276e8", + signature: + "c90552adf2d9bd7e5f9201f4df85c1dafc9425b8fa9e10ca4b7af004dc8734f506879361d794d5c2ab1c1dbca294755066b881cf70cd2ec18281e5bdc839e2b0", + recoveryId: 0, + }, + { + d: "8681c9bedeee133eeeae79efbccb40a9684598e40ba2858f507b573c0e66bd3b", + m: "30a63bb50b7cbe77bd3cccb8537d69a408b50a306c7827ce9f3b2db125fa4766", + signature: + "3efedd1210aea9aa78d03bb1aa05608c886061c1e55194b210cd891db0474a95341b422c1f3dc8b4b5857f2a4bb0c5d31d79efa26ecbc53627127f24c92b8d48", + recoveryId: 1, + }, + { + d: "f4f668e84f00310cbf9851c68e44efc6df02ac69b2389ee83f09b3a8fb111675", + m: "f7e6249f1908eae19197348ff76e405cf8855e36ba96f682c6d4a850f24fd704", + signature: + "93ac907bb625654af584b28a628aa441c50f024457fbcb7d33ab7f1c436bae205c74d2c207afc0e67123d48cf55b2eb68a38a2681adff4b319755de72f1b3cdc", + recoveryId: 0, + }, + { + d: "b2a9502019fa1c28bd6cb7993f02f991589abc32c1d310116c0a84670ef2df10", + m: "72bba96d8f9a8a83cbb43647817f3e784efeb4ca4e09c8986b52c4fc32896a55", + signature: + "99f972e45d853d29773e6961b7ff3c3e6af54196ad6dc931558f04fc15767a2e3b065837f2782fd216b3798ad06a715cc94e29d55eca89cc0cbda6de9bcae6ee", + recoveryId: 0, + }, + { + d: "c1e443ebd8b67a66173f7befe57fcfb1dc5ace83c63dc288e0ea71a2d4fd44af", + m: "27dd34d12383a77b0a0137f619a7fac534b866cec03f8772ce0f048fe4a87a1a", + signature: + "f2045cde2c63ffd7df4ee6812e7075c126905016836c197404cf4e1c2d76ddd86dcda8d2e6be04be97eaf8ab4191210bc20577eb272ad5633754983024e1fef4", + recoveryId: 0, + }, + { + d: "a3d21d10386b8b4584720e0e4672556565566205ba5f746dc282891aa36ed524", + m: "dce63f8fbf4a500ec98fa38de763e58190efbf5088b223eb64f1fb92f0443646", + signature: + "b9702e8454f57ca1633859bf3cbd8edf89465cbfdd1c232e7c4401fb088cc5251a7fb0a7425641bfd0866d6a52a28be0845267d2b3127d2a66208226b3f25df4", + recoveryId: 1, + }, + { + d: "6716714453801739347f81b394b5272b32d75b76b77797594785adbdb54487a4", + m: "75f5b5792c9b94b52516b11713ab6efe8b47ab19ed919b745aa938585050888b", + signature: + "6e48b415576498100f239d43de0151166ea0e68adbf55710f74ad97ed981f4637ddf00dd52a97c3dc22897bca1839c2fe63f3dcb771b90e1c5a5961cf9b8745d", + recoveryId: 1, + }, + { + d: "128119bdce38cefe5af5c5c2c6a3ad6d2f28b899769fa88b100a39425011f222", + m: "63b563636aa2a71596e957c6124accfdb62d9f1934a4314c76ceddbc02e29359", + signature: + "0b3e5845f6de770ebe372dbed6def499e2eca0f52174bbcb2b9a577429b8571c2d51e53c5842b80c90206f74a690e2c39341095b3347103cba44009ee2ab3f22", + recoveryId: 0, + }, + { + d: "68c15c92e438c9cb3bd78af2a5ecfe2b8aca10a7bf295c9d10c280d35d109569", + m: "2f0e6e7ca3de7db9da68855a7725e61cc11ec6de186817bd24c45c55c5f7100b", + signature: + "eee383ae54af3e6e7da58679a811c3c605b2c7bba872905b131d83800417a00d7440bdc313d4df74f22dd21c04ece22bf61f84f6595733d2053fd4705f3e27b6", + recoveryId: 0, + }, + { + d: "5c111816f90702380d79f9fe4e35d6d200dbed18fa0241484948469a44140793", + m: "0dd236f16a6bd61f359569c42c19308b6f120ceb13f98239465fd908b0264438", + signature: + "65acbfc6cde6f55bf3372a9391056189ebc791d02f201560f7f9543e622a30821565c13ec0e059f9c55bbbd0aa5fefa94ac3653c425e792937fe0e4be229c08b", + recoveryId: 1, + }, + { + d: "03dd36854beab570cc7a5d256bf67a07ac462eb4e60cd6228675a84e0aa93150", + m: "a0ef16ea01a68989c0d3f1df961739676f9b1f6af0678a64ab1936363ebb8c6e", + signature: + "4323988a1265854cf4ca94d1decce44cd079c5b317cb770121fdde9b2ae4e3951d07893c4ae667faeca90de3f7a9c0611927dc7c71b40dbd02bfff79ef3c565f", + recoveryId: 0, + }, + { + d: "47443ce780ece05e91ceb67b544ee75c7471276da70c1415d2ce2da67f069e59", + m: "cd47e56f24f60deb103515311deab851ca40e5b08f1b1a4a044a94cc83886236", + signature: + "1a6145de961808ff6fa3a6118565b8e183ad9fee934b446c0a3b3a132b98f9b42462c4ff3b6c744a6136fe2645afd6dff91e8c61922e70eb39df2c64c727a9fc", + recoveryId: 1, + }, + { + d: "6901b81b43d4d0e8cd047c0624efbab4671db9d72b9ab716b13c045f82d2433d", + m: "9ef8ae423db3040b65cb91b2674bddf8d62d22c3b04f7a17af174780e7933f2a", + signature: + "cbbc0cea6d85fe1dc86926a70b49c47eda1e0c0ce6ce905af91b68ff4e24ad3564281ba359a7afc94e769f82153bc0b1725963580197485bf960fc064cedf818", + recoveryId: 0, + }, + { + d: "280d4c7c8112b568e9437787acbcc26775154030125ff005d3414fef8089e251", + m: "bc89a34fc728b6a429a3636569336d98cb9bd2e76b41320233e6e997771189ee", + signature: + "53c92c65c5dfff6b88d8b8daef0114341d97add96b0a52dac7fd2685228733a32f9354ab4887cbb3c5de110268bd06c4b54ac3c8354af67a5b411b202921a0da", + recoveryId: 1, + }, + { + d: "bc40bafeae38d97d494b40c6f255653d88ce501dddf4e2cfe451098853b35ca8", + m: "994779f170bfab9bd2267dc7600f702cb3229915aea6cfee862fd85b3ba31505", + signature: + "61176362b5cbc80fd2ac1eed9d8507f32da78b787d2051bebc00ce0c6a75f50f101a98ebf9af0822b180e07c7e140264f267a01fe1628bb2e7831618802d8139", + recoveryId: 1, + }, + { + d: "9ae43e9adb56a666f930eaac8deff013168be4fbb3763ebc2682495907e5c103", + m: "a28a8d0add9e3689e5b7d619c206ae07ab911a3597ec9a1d7c955304bac79e4b", + signature: + "6ebd8afb166d441f200a23680ebaec61aff8278216be9a872335b2361802dc053b30de1b63c45857a4d5bf78fe6a6d5aebf9e5eb3703b549556b4fa2795731c6", + recoveryId: 0, + }, + { + d: "77416111a0391a0ddc67ac4f0e7477b4eb6db328515bc229dc1a5e32bffc181f", + m: "553adb1a85211c89df89b19c141ec50b6cfb17b1e9dd13c9685dee4d8d183821", + signature: + "61c57e55a05a1c72d74a68f40ca1fcf1e98f6dce355b20e2745eb7f7382940f1392f6852a71d71f69a626898a7241eacaf736045d3e5ae7c0372bc524d7da664", + recoveryId: 0, + }, + { + d: "b11fce851079bfb751effd7fa83bf472543c2443c18177bec76de2c5c018ebd5", + m: "89997c191008f328c78935508380ad5e5360e2bfdde7d28894cc079ccb45527d", + signature: + "b8fa1c151a87ac48e96a898d2569812f5d97dc7fd0450d7913e819d1c8879a5227428fa3b819b64c8dd84e1ba3770f71ef9ccd5f25d08942004f826e51d2e623", + recoveryId: 1, + }, + { + d: "2f5e0f24a5526aa3586fa4088d1b07192be6632acea7ee95d0ab0c504b0c06dc", + m: "56a263a9c8b6e4ca4519404df54f029dfa6255940d78cdab8f77139cb232a95d", + signature: + "247abd433ce109a020b462b38358d2c3d4e3569a249654cf99cbfdea5607a9fa06dd26676589eef73fdacc51d12cbf76e4c17e1f6914d6aaa92bb4d927c93d0f", + recoveryId: 1, + }, + { + d: "e385cd148f0cb6e37c44a58cf13baadbbd3423155cfa87fa1968e97df3da3d81", + m: "dac33775970e7a32f808dce061a4affc0195e69fe2e7135de336e159314faeac", + signature: + "ffd7afd5934c60f2365c954479bef096215819be74cc0ce5301716a4853aa6095e483586c459c370885c75ec4529bc48d502b16807939a5737e10554cd5cacd5", + recoveryId: 1, + }, + { + d: "6aae97929749d33ae7d07269fd3388f2d9f7a24b60803eaeeb51b74ab8ea5860", + m: "e971cd38a36d39e55d4512a49ff71310d4859c66c9df24ecc6b9be99b233bc00", + signature: + "b063e2c0013c9f235c69bbe7024bc1d7d76dccf30c4056868a540aabadfd2ffe652d955d14735da126bec16d5093e6299bde728b148314fd9d83fd613b75b4d9", + recoveryId: 0, + }, + { + d: "67ab9ca0e88d0620cfdade86cd7f05ca5507b0249cd193b61de4ce0ac5d8c729", + m: "84a29b1609a9b3839bd67d84743d0df7e5425e7fd387609c5fac40fc9371313a", + signature: + "c6844947230e46c86620b7849418bada36b999887818145270869333bd405f7f66e2964b4e7080a54e6d8f3f9f877143ed1c27d5ee31f49e547a08ee28395edf", + recoveryId: 1, + }, + { + d: "ebdc2118ccdc1067c59e9285ac109467338a18cd72b17e5bee66f2d3466b30b8", + m: "90f39de8b92a001e00eded8f884248e5b0869c5e518d5337f7f17578c805fb71", + signature: + "7802e900a9771b24f60cafa2b8f1b2ae4bbe50c6f3e85bda37a0e35bf6b240ac78be342e3d0159638433d987d0547faf43433899bb36a24f8a9d9829152b51d3", + recoveryId: 0, + }, + { + d: "6ace133033fcae9743570cf50a24216e861f0ccccd2100e8a28a700382bab41b", + m: "e0634fa368c0bf7badf18866ef63a5a193c9415ce9645bb4ea9e6e77da39e223", + signature: + "d0004d8b6091e63f01d7513f8cad38d2c8d7dee53c69590e925c89922b29f9ec117fa785580ed4191e0040422bd8d89670e334eb83542407007c64527301c42b", + recoveryId: 1, + }, + { + d: "6af68811043f38ac9db82c622b7999de80863aba04d2300dba8817f5e08ed471", + m: "8f5a7a4f53a65a2e331dd4b24e9545a29491c719250b321093272413c9f0c0a7", + signature: + "76a6bbaacf3ee74f691bae04f03d51883ddc72a175e9f17f1096df8c5b07b4c20a524a14aad4aa2e6aa4a00cfa55fc521c686d5912c9e240f8a549c4d88f2a55", + recoveryId: 1, + }, + { + d: "c04478cfb6daf683bb0cb3af045896080092799826fb553500f2839b84f695f4", + m: "37956321c22836dc090b1a62f061a3847f97369508d3a44ff4c6f3bf52d8fc5c", + signature: + "68afd0f0d709635f004ba789cb670734ed0addbbb76c160e316d612d6f0948dd6a67ef4841b49d45fb71da1aa9159134cd113eadd1e7ca97a2aa5cd9ae94a29b", + recoveryId: 1, + }, + { + d: "c363742aa1f8f53f62a4fe0256ba562b08e16b32c8ec0bb7c498494c875610e5", + m: "f5a9208e2dc5a2b6f2147281f83a117e6ffe4992fd9e3c0021575b3b4f57e9e0", + signature: + "02608f177f937225ecf4d801fb41950e4af6e7ad85e349adf6a0060ec0d3475c5bb6433139629401eb0b75bab674ecdbb5e880be5c067631149e4b90c0fe7afa", + recoveryId: 1, + }, + { + d: "0793fb935e749056e060ec3245a77e26ea5635dcb47bf4f9dab6c31fdfb025b3", + m: "c6ab7d3155a7c566669a22b5bdb853381a9eb1a4119d7528f14b908f0e093938", + signature: + "f20993fe474bf3877eaf268d12bb24535ff1b6c43ad04764466d8f06dc60f520195dd08e2f431f958f3d26f6ee8ce141cc9c57150fdcfb8413b790ef043ea6d8", + recoveryId: 1, + }, + { + d: "67564f91be1135fdbb0ad284f392892f9d0466cdf6fa8e2399b2c07a7a86562c", + m: "ab7b77e54783a0073fea7862b42ee50789fe1d07c02276de3ad56b7ecab0809f", + signature: + "0c3bcdeb5251d6ffb747180339c0fb2725ac0bb947edfec4f0ed2dad17aa04e535fff9152f1ec425c69ea3d6c72cee3068e0b20d44cf14c19224cd2380b72e4e", + recoveryId: 1, + }, + { + d: "d1d9476b04eaf43c13a337128ab69505adb5fc24dad7371e2e6df615d87f8e28", + m: "98944c91138f561f19d2999fb46e3f8c7048d9667452cb3808c1250b791ba44a", + signature: + "30a992c586982606b04e184f20856fa86cc7b04f1d5208e11da08271ecab854c61637a71609425441263b9426e0176392c9eb6699d5e104a4331f6ee3a7001d1", + recoveryId: 1, + }, + { + d: "51c55c548abe39667858f5879cf62e6cb8ef3275ddd2f045d63c07c1b9bc4fdf", + m: "6cbedf0864c30153c839ba3bf10a06459a2c432aa6188800f7bdead946abd207", + signature: + "7a810003a712b7d44fc932343b11ec0ad98032d50187d9aea8fe1d6022fbe9a560f922d5268d23bda6b113240f156a6471cad83f2c2822c0fda339c0ca879314", + recoveryId: 0, + }, + { + d: "9a53a40f9e1970fcce5338bca855f5b9a0946496aed2a4d1c5c6d4bfaab3ef79", + m: "12dfdc3cb07e7dcc428b054311b8a3e5ea4c8c12b0bad6b782dac2007089bfb9", + signature: + "f3cb5ff6ddd4be70d03cc897eeafedea538cad71968e3b76f1297ef5d7e7ca4f0f22848bcd701e301eba65ce485d84a85ff42f7b62fa4ae945f33560b2b38286", + recoveryId: 1, + }, + { + d: "e64384244fcf0dbaea9edd01b8a384f6ca5a296d7c83ce74fc45496f88287cbd", + m: "a67dea4284372fd5323f7416e9bb5b3d69104c6bc160f4c003b2ca75734c4df2", + signature: + "2c05f88b35896b84290a21698a65f222b6efd23274c2c54a5a7539d116dd776751213e89c2cd3e0d90ccfabe5352d1ee898c88562d409e5e2c023f364b350acb", + recoveryId: 0, + }, + { + d: "14b8b41bfd7ae1ebacfb92af85f044f0b7ab2a8f0941e70853d3e51022408970", + m: "bfcbebeecef386f24bbe609ec23d064e4476c95826a5c90818fb2665ad7a2cc3", + signature: + "e987573d5ddb4ee7aa8059b97a3e08319255d24ee7c467cabb7aa0c12d0c8cd412ee4d94af83c7318d8820af6d13f9c99d2a1da2e6061d16c844cd5cc6c89db5", + recoveryId: 1, + }, + { + d: "6c4a8c0c8e75e6cd691d883f6a46d53f839f02d7f397a19d8bac5fb3b0ad8e68", + m: "a8151c83100257d02afa6c2fadfbdfe5432a57f35b6019c2d27ad15521e776af", + signature: + "777a64bf7b536cd3b3557e47182f5bd89a0442723c4e21a128119d1d0e0866580145396b22504a8d7f3d5016611a79a7f6fcba05f5bae6bb637dc32b61708abf", + recoveryId: 1, + }, + { + d: "bac28b8c4da95635316002a8a60b7c49da600cad6c9141e95c0bba575ebd7530", + m: "9ca71e5a40e22c392265b2dcab9be01b79ba5baf38f49867dc3ad1434d28eb60", + signature: + "8f84bfc48d224ee1f4c3f4288f6334876bdce01c31816276014d5b0ebb451eee436897cff04f539697e7696264e736ccd958743223732b90f7cbf36f1bd41d33", + recoveryId: 0, + }, + { + d: "148fcb9ea17103b61c718b95be04b155c59017312bd462da1a9f26ef16d44fe6", + m: "fead68e33e0ba6fe4f6fb2f18f16799b3a5dfc497420a0a5b564d194c928196a", + signature: + "76bf04f39ac991c39e6e44f34006eb50fe22517654dba2cf4dbf5560f4c9838038f27ebe18143cfa7eb700239892bed79e6064facf47384ba54a258723525972", + recoveryId: 1, + }, + { + d: "4fdbbc836a83190360bc0f106e8ba8cb577f86b79a8d2875a8ccd02630e77b81", + m: "4a90eedbbf5ca7497949fd22f28039874c480fd6c595375c7ed7acbf317e19b1", + signature: + "4fafb9afac0f9b6c3a20d478f1e106e1ce1c9b36359d6970c84cc4eb549581fc34cc3b4a075bb6cafe51752374c4c591f281ea9068af273d2299a7e926c0012a", + recoveryId: 0, + }, + { + d: "ecb5d6d5869ec51d2cc4a546bc573bf789375a688b61f667250f95ad07cc7eb3", + m: "76719b4f8d33e31de7107f1090ce72b7119a001462845ce41807e02a8f7d8bae", + signature: + "dd373b2a69dc41eb64530feacb9202d338d8c4cff5d349d8ec194e9ae2ba5b57588f134f7acc4d56649dce32fe48e2adabccaebe15c90db71d12ddca3e9cfa56", + recoveryId: 0, + }, + { + d: "6e0d0128a914e37ea37b0d4401b3fde08f882cb1e12fd5d5b4a29eb13785d51b", + m: "5fb2583c547d67f6319d4dbf89553add85a07ac4bc2c9badf71cdbfd136492c3", + signature: + "269ddf8d9ae7d1d2ee0f8e4459b4b07130debdb10ce7124d1b59f260fd1813ea59d62a55ef1ed3d08e9f20fa288acbcc0e8d1c446faf2ad067cce37e41645fad", + recoveryId: 1, + }, + { + d: "63a8841fba0ff7a0f41608940fd3246c8cf84b89f13843090a0c2cea949fe37b", + m: "173e385e0d7076d0f6a7e8f20a8b20e1818c66398197faab4692418e193ecf00", + signature: + "d0247833c5c21ffadf717215378e69299ae2543eef51b652a2e9a9eb482f520e36ee085b423b33d9159b89625c5ff89d7ed4e91cf28d9b6b51caad2f6908fdd9", + recoveryId: 1, + }, + { + d: "d1111cd50fb4fe42356b9572af2ac284055d558a7fb1637c8e1fe84c62450dcb", + m: "19a6efa01250943a7ecd0411eab6a1448100435f8996c61adfe688a0f1a37531", + signature: + "2774be7efd43d99c52b377094fca376e696849fd2d4b5d9d4dd5919b61b0fa2561a75158877b03ae545fa938c69422acc7abc28ad593de56188856bc5a9b5161", + recoveryId: 1, + }, + { + d: "03364e2337d27c80a59778b963b81c5a5b9026b1a1b45e0d3ee928da410671a2", + m: "89916661d9a2265bcf6f065443ca99263cdb22f23c3d82b95231ecb8b90235fe", + signature: + "55c9330895a35a3ec20583579d712805dec7303ad824e2b33cd1cfbd12c02db920a45ec73f58e42f54e49c04241a76cf5eb68def29d02d35e73dc454812415e8", + recoveryId: 0, + }, + { + d: "f323e39307e961fdb87546e2f232718dd75960f1ab0aae6d89adbd474a613bc6", + m: "735b4ca417f32a28c5a43c10e1b20deabf7a73746a3a322c2b45a301c19d09b8", + signature: + "131bf355d47352a4dd4a17f362362bad305e3979220e98e231a12215a7ea68d7416c5ec99c1bd33e940f3b3152b96d27f190ae7e1fa5339f7127cb67827d4416", + recoveryId: 0, + }, + { + d: "23a4be1e793e205faa037fcbf017b77f0a3337de84f5419b623f6f8d9935db56", + m: "c8d816352488d0f2237320430f4338c8d7f60d1132de83f96875d4b09cac63b9", + signature: + "1591565cbf121512b0d0b0cfbb304a9f38dbceb3d6aa7f713959cec0fc67423722009f5c3c61299e89cee609430577631a79d5da30759a3194703f6aa728a164", + recoveryId: 1, + }, + { + d: "d4dccac3e620bca86f927560d19f53dc00acc16f45cb6d6cb34929d2059d91ef", + m: "bc8bcf26da2542637f3bdc65f14b3b4db1d7ef3ce9e2a0adea6eef4dfdbcdfdb", + signature: + "46be0a5670e213d4885928c6fb426d7647ee1e9193d45d0948cc60c850ebe2771a1b3247708e13afa542c450a1428e12f2fc7afc50c31c19c4dbc5bd235e2c83", + recoveryId: 1, + }, + { + d: "bf5112d53d226796311659b0cab0ed38d874ca8eb856f0c1002a7bc5fd997ad3", + m: "c05ea1de75611579a1a0d4ea66510da621f78805133c54fe92ed710113330bf9", + signature: + "29a14bc7f9290d07930b64935b19a74c04edbd0894867c4c311449c94295f2e432f61028a380a8ab038ecf8974fe6108025070d714472595abdd2ac46fb88377", + recoveryId: 0, + }, + { + d: "7af0e2a08b6c9fcad357ab773146bac4082636c9f3440dae79e549f044e33ac1", + m: "4371f8174fb6f0b1614941ec2d359b04f5dfcbda698a9f5f1d253177944e8195", + signature: + "9ff23fd53680a102075fbb1e34931d15ddd120a3e1e1fdaaca90281c858828095b89dc7110799b42b69d7bea0068251b11939b1f721be3966c6aafcb24a435fd", + recoveryId: 0, + }, + { + d: "bd7b6d562d686f8057131012ac781e271e0f2122394d0ad2bee36816ceef25a6", + m: "ba58dfcf35cb7d056f11b138cd7b383fa3f3a66889b90cd044ef38f45f6fd968", + signature: + "49e0e23b272e8d0fe1001330eba48ba3673c2b04ab1597fe1bc1ebc36ad988612e94b43a0bb4cd094cae6448aa8cc76d871ade91417d7860b65aec0713e608c9", + recoveryId: 0, + }, + { + d: "7e7f79c5a7246b5d6f8eea76bd0fbd73a1b5e7f8f6cac01089675ac62ceaee19", + m: "18bd802040fbd8022cb74131e34c3c726d48ecd6e109527d949d83ec3858eae2", + signature: + "9d8f49a2d00df649f4aa4026a11ad1cd28bbdbfc9da80fdb83425d2a010daad56d6da03bc906724fe8669bcfe88ae7c96b153aff49ea78b994b57557753828f9", + recoveryId: 0, + }, + { + d: "e4613fd57fdf877ca4e3a3fc330ecc44d0b0245912d8efc42f368b4703146351", + m: "d2d2d8aca5d048d2fac02d2450288001b3a54e4b241e9814df9684be890e757f", + signature: + "45cb205c955070ca47287d912f828932d10c27daba3a3af237e0bd678bf48a4d3fdae44dea95fa7251cf4c5ffd5f0f8107562f1104372d969ff8107de58a03f7", + recoveryId: 1, + }, + { + d: "eba8f4c0696cdb766a548f4206d66fd5df6d4e0bf30dcc07893075ed9e2016f8", + m: "91bb85a9dc9ea79b7ed0ccaf6680275f1a7ef52e0d68d75579ec10d41a9514c4", + signature: + "e5e6f2b56b36b313125e885bd2b89479559487ce25130b483ff85c9388b92f742a233d40c6600b3f48da10ffe6f296ad144332cca51ddd6dfe7f6e0ff674926c", + recoveryId: 1, + }, + { + d: "b0bef7c93031ad8a49f37c3d5bc3b4643cd49c8e23befcec28c333ef59e3c6c0", + m: "e06ca8c207df8831540c3ec8261d7a98ecd499912a382ce8bb90a19db056a95a", + signature: + "ae303c2cb623cfabfa3f5df1f138d16b4cc861f456a00cfc45373f0cb87b655d1d8001c64dbe816b0f2e400a17c2e0f08c6d4b778b6b78decf0e3a4e21785e7a", + recoveryId: 1, + }, + { + d: "81691c2e8bcb2f27c8a6ae586b6883d64c82ef7435da2fec49c3e209da136d1b", + m: "f3dbfd94bfb9b8d392f4fdf293ce49b3f2a83550b752709fb223775abe7f2a94", + signature: + "e474946ad30f56594214a306f989431cb07ac503dcbeca303e5aafe2fa62c9da14c17badfeb645627056f82b82c7fb2afe4536e12ebabe120eb7f71515a20f8d", + recoveryId: 1, + }, + { + d: "dc41bea5071c3fd13d6a64bf48ab8fac859fc5297d7519ba126ac4a5f134cd3d", + m: "182b7a5d1ba88890b17c60db2c022ef37fd7b34d98af05a3f1790903564e89d4", + signature: + "7d6077f2c1dc94df879c641f7991ea11f58ae9a7a5c8876ad80d3edf5250459574137a575cc897301089e37d15160d3d8dffb9fa8654ca29f23c00ce9fae5087", + recoveryId: 1, + }, + { + d: "a0e6aec38c0f59669d794d41f12831ea25ac8bb91dd58ef09d673a21ac1f7eb5", + m: "7b007f602c5c57cafa9108acfc164a63fa166fd48b7d05dbc4fbd7caba366699", + signature: + "7fb7926c65cd645272be68ea3f3dd9c1276307aef92597117caf59b307af9e13162f9bb144781fd331704329c2b7f2e6e21d86bb947822a18cbb0b875bac8166", + recoveryId: 1, + }, + { + d: "9ccff4c27aa34abd801f43e18dbffd24f59a7fbc77fab4edc375fd7aac116cc9", + m: "2215877b800aef1a22243e8499e8537172092ade1f41d4bba520ab3394d876f0", + signature: + "ad53e8ef398aebbbeed68cfda91b57344379b4588b88d240e0ee3741292a02681d06b8eae739295084b7bd7530855637f067c58cce380361bf2ab3aee9ea0613", + recoveryId: 1, + }, + { + d: "e8fa419ae461da334a994b81c59e45ac966411487c8e772e713be549fe9a5b14", + m: "71ea29cf9d9febd46c10b2a011c58a485b7b2d17d84c3f3abc9ae440d77119df", + signature: + "883b4c6cccf41464952d9111516aaaa5b7bf027ffd690a78940230f8aa4c944260999dd6a795eab7e8b2ba2a7e3ebc7e8188f3204ffeae90f620ade767fda9ab", + recoveryId: 0, + }, + { + d: "7bb995f3dbfb4ce0824dc02f4bd5c3907f17305c3b3c193c298250dafbecab6e", + m: "86e278fcb575372c46e6374818e1da5c56ced4c5cbc08e22e74b88043dec4da3", + signature: + "d4430720c6463f2dd3bb991269059b8f41945234ee9e7283d19c7e3e7319f050643dc562571396106ad1efb4927d4d8bb43e7979b1b9a0a47c1021c3af5d1e34", + recoveryId: 1, + }, + { + d: "906b81f9565bb4d6957afc8c5651697c2de6b173b247bd014da10d3e95b8de44", + m: "7dda914219d30ebbbdb30460b462ef0d5e0e58f982d24076524eaeb1d63eaa58", + signature: + "317a2fdd8e20d7afd1ca61a1aa360ee7fc8497cd87511d6a008aa58449d942b83a969d5a9cb955677d21f037d10177984efbf301b7620ad6dc6bb2a60939efa4", + recoveryId: 1, + }, + { + d: "da8f26205df48a07cb5bab1c5993a83f82b325d974a5aba4dcb07881194b30e9", + m: "92c61604dff886c76063c468a5c5555cfab0aa4d49101848328c1caa3f11aff4", + signature: + "d0d34479425ef3dcf5f4b515859d4e4019e95918c5f9b7c77f2a1fff1109dfb6041c4c39f8d91ed84dc1b5406a83548ec09abb63274da46cee76200ee53b9209", + recoveryId: 0, + }, + { + d: "fc40358f355e8cc6a430340ee41451e0e2b9cd437f1856a6f20a9cb9a563fdd4", + m: "52bbabfd1b8fd55e208b181860009fc7dbc1bc2e1463888861dd108a854c148e", + signature: + "b74a22fb37f50beae1ffa306b34026098cdc9ce24623210835ad22732a9c0427014762b05eab5adb3fbaa816789ff10c4129db154bd2833262f3d4b3204a62d5", + recoveryId: 1, + }, + { + d: "eb0f2b0f2cd57fd2c81c692a518c22b86c543eaec53890866d82475e2e6977a0", + m: "3c543c9038681df0016e73f0110499ae698170dc89bee73e197bf1c039313acf", + signature: + "4ce71a043bdb197c9989b82b522eb3f11f785811ce63c452e620a5af50231f2b3bf76aa93fc678b1b1ff09ae64dfa024002a25e155580fb5287c13ffea82cde6", + recoveryId: 0, + }, + { + d: "28b9ed15e3411a56bc5e9bfa98e7cfdcc7831f2d7430207bd55ad8ee45df5274", + m: "842069f19306abbf52196815329fb83441ebec7c4f9158588a5adb1b0df2c14a", + signature: + "9e30ffb81d716fa1020ab88199c98517b75c4dd1ba1ccd5999c94f84c4d87dba1fe84e7cfc6ad564224bef14826be07efe6d29dbcab57048b1ed5a2ce1c529f2", + recoveryId: 0, + }, + { + d: "bccfc8858037e0a4bbeac1297cd1620fb39fd6a34a26016aa7258b014f6b1af6", + m: "9f100ab8baf35e0a6e93e60389667542677b126bcac9bd4e0994c49cf9da9746", + signature: + "69eca3a61783cf40f95d511c29242e1a7776b499357df26d1652b10e1cb0f4f851bae48c73b5c0677c8793060be5dfde18018f501a39deb98d7641ee2b970b9f", + recoveryId: 1, + }, + { + d: "3816caf4da240506c74a7441b07e6a50b9f3580be5d57c1ee30f3e5f5b30ad00", + m: "eec48feaafef0650b54ac762f3544eaf60c466e3a9e3bada39f7648feb5a5d38", + signature: + "d2352f91a0174bdd0b60e6b74ebd13201b8db3473c9855195e9d0c93ae5b31c42306f4f113536bb37d31007d5483ca027201dbfe732295e0649900a4796e3bbf", + recoveryId: 0, + }, + { + d: "d901e1db26b35dd4811a118a4b8cbb8fece3799b53148ba453841cd5388accde", + m: "b1151bb83b31464bdc95f1c5d19d7b2f5ec350db10c0d41434be5ae7d1aa9361", + signature: + "97e0563343ffa28f2b251cc1cde95ccb59e510ecbb3b70f5f413bdc4e30ab17774c7b4f9fcb6c8d15a1232641f5cada7dd1a5a455148e5e3298116fcd5cfde67", + recoveryId: 0, + }, + { + d: "25b72f8c81f56fe0854649cb4e3e6c28d44196b53730d4b90e7b484a69f335fa", + m: "7e22418e70a39314b4c046cc77cca5230846e7adfd1da323da127d95d833160e", + signature: + "ffb3d25d3212da493598413f29a9ed04b21ef43b4c8ef1ed282d5362730e96d26b57af095ae4ea0b4addb6276da81ad1a8f86029dab4dfff885e88802c73a510", + recoveryId: 1, + }, + { + d: "4eacd39ee895a9df0e245505dd13adb6d2ae36336305ad7cbb4716ee7b17131b", + m: "d8c9ac3fbfdbf7d39305f19486e66f1c5f4be9343bc0a3363b4421cc23e19ed7", + signature: + "36017decc25df05be9fec31a558d547f98691a542dc2e0f954530432c34baccb2a89f327ccd0840d695ab3b5d28bd37583a0046a87701fa46f5ff9563a15c217", + recoveryId: 1, + }, + { + d: "0f8623fdf8d08a014d2e4a64c624217477ee2e4af58674a39b794f492c04296f", + m: "d8b0423d13e810e9f361ce4845c085f474c690cb5fba5959a679fcebc4df99f8", + signature: + "a5e190f20285c9980499cf3178e8e4d8462bd4d98fee2722c4787cfcf2eb82995bd8162b64f6a64ceae746692eb00414b9a46d9f4ce53857f51dadc74979ac9e", + recoveryId: 1, + }, + { + d: "8d70d167a069056ecfcaeddf45ea03bfbcfa9b6cd3d66bdd8fa9a361a47cca88", + m: "660718c1fdbb5bf4e55d20026ebc3125b6e7c7a1dc1375908b60dfc0140fe652", + signature: + "457e3e83a54b234c7fe531ddd2ff08b3782e8e29818605b7cf1181bc172ade2f03daa77d96e88fecb95fff8d366e3290c649b0fb92cb216687d56d23db6b6128", + recoveryId: 0, + }, + { + d: "370ee1d5c5221fce82b9ae126a5329a595653cad1a9468e39f0dd353f7b1075d", + m: "d5d3be9b74be727d0a37d2ca092aba5e357132445550f4017bc6d51d36661685", + signature: + "c373220ca42bf22376ac5b191d244d702ba15451c3a17aba674abd9aba39c1c618638c83a100ddfad816a7b368b73c15fc046e22d862eefef85119db2fecf8a6", + recoveryId: 1, + }, + { + d: "f8f6010287408586b7ac6070485f3e43d15ff4f024249fc6a3ba39018a0f7b8b", + m: "81717fb08043c313431b31209bdd9cd387e34331d8500853789fd5dbc32e0712", + signature: + "c4e1998cc03efeaab6fbd0811cf985d159614a45b1e642aad34c9ad2a43de0d3730170cf4be8e53863693c22976794f5abc2f197ad3af2e7982843d610eb73c3", + recoveryId: 0, + }, + { + d: "bfdc5042721b93a89e892415cb7daa9f878254508634fba683a4a60c1159fa65", + m: "b3737054f82806ea89d708579b94301373121fa186351d4cfa478e092a6c044d", + signature: + "576b89d6d5724dc65f2cca732506091ab36f8b5d67196ef39ee867097f7d504b05151f1849cbe461ae74219a07eab771d73e5d36f4b01ae06e46b4bb70fb5938", + recoveryId: 0, + }, + { + d: "0437910f8db5ee70a99bb05c0588f842670c68e7cd08e8342c048ca37eb7c3e6", + m: "9dd3583d76c4276f80e35f3538f7a7e57ddd39c64ec1fc14fc097ccdf281e5ee", + signature: + "cbf473e22e38ab97b809046c3a79ef5ddfb84af801701be3f576bff1dcbfb1336cce20b804de6b8a194324ee535cd438d9e098a851cf42130b657bd236b124f2", + recoveryId: 1, + }, + { + d: "7e637388f024188c7734d09d1c39c742dc4bf5011fc8934ccec6b8512a76d645", + m: "6780413b0b18bc7f6a2c9f5b16e358830c1d0875b9c7c1478a27cbad27ae3278", + signature: + "b236b1a6c71cfaf52013c83d9b0ba5c2a82ed9982cd7c516f9ff2922c75852020210ea829fc08dc9d3c24a000a9bf20e80c6148ff707c21442ede949124a715f", + recoveryId: 0, + }, + { + d: "914505507c546d53f9c7e535d726550b4d2f2d319cac3803f645c934fe524d12", + m: "f6bdf995ace2023edf4671131e5ae072c62eb591e429142f511f7faa13e54843", + signature: + "0d65d7fb08f3c0b0de6bad9ad43dd4bad79a9e9254a2d0b48052644f9935a6e72dc0ab17ec49586240e2643fee92d9489e4a6cfb90da68d37a5dc4320f9139d6", + recoveryId: 1, + }, + { + d: "8a9c1adf0d6dc99b3c18155dd95eca45263e19d90677da7b64e83e0aa259712d", + m: "01c7f864437d1e6e81673bd32c5754193deb91a5c23d5d58e3974f558ba7d02f", + signature: + "61694b670b3e500fbd1e0417563171ea978efffcffe5837c1cfbc8cfa407b0bd3e954622968b0410b7372a02242a17578bd1ca393958cea52709724185d7aade", + recoveryId: 0, + }, + { + d: "02e8493f3a3929e2765c9c290dc987540094b8bd2de63ff57ff613f31db23b4b", + m: "982b7ee043f99e18d6ed6cb3e7c8639ee5c9c76453db075f364d2ab8e180952d", + signature: + "8fb4e7341a2c4b5af88deea775df2fa21018fd32188a0ae4553b55f349d1ca807a4042acad4f3886d878589e469e6bd930dfe507249325243dc3a461e55b8bbd", + recoveryId: 1, + }, + { + d: "a3323429df3f84240895955d0861cab2e58bd30156eb7880d7605ed0009525f6", + m: "0b375632823dd877f1a7109baaa8fc36e895df0e8b5884dd0ccc108ec96925a8", + signature: + "6790f03d7f6880874e23c7a5c587b6857aedbc15483be6ab3ce033db5675047c248f0d711e65fb88e0f3c7c0057dc7fdb1bcbe87694a790ff65512f113d934b4", + recoveryId: 1, + }, + { + d: "55a5a8612fccefd2e09ec2b61db6672f6fc3bf93afbad6e0f5bd3b04364e4b8d", + m: "f54cf56625406e5afa267a39f7d8b057c179a88e373209a00f794be641bdf121", + signature: + "69edb8fcc2e286abc996029bfacd252c2253878d4f2a99d5d4861d198e511f766c65e9404175375608029300b6433d087bad34c2b968e4a74c94359e7f0d0b9f", + recoveryId: 1, + }, + { + d: "9aedd22da676a29cacd5eccdcf0423d4d13c7d441cdfb390809a52a954c1df98", + m: "73fdbd7c41c73c60b667ad8fd024ac611f32c0bd0d7cafda16210a29186ae1f5", + signature: + "5d0a2d4226c8cc8e1fda363a4a7341a0b503cf10d4df85e66ec15865a8be7df8047e4e6d0bf7984a5268c8c57f3b9843b8b93c24ef1b6ac2494a9067041ea659", + recoveryId: 1, + }, + { + d: "d7927c242f510bdedebde081b9842e0b3ffac0009974a0829f841cd9399c0f5f", + m: "4de3c8f41752408a0d0afdef88e8bff7bfe462e6afc87a6b53e444d41b9e79d2", + signature: + "aa28f1c1b7802745cd65eab72d8346a4dc9a690671d4115477ef895c291c82aa05e46a77b5ec4be1fa1bcba6013bd1477de63a366505fea52bf461bd120d0536", + recoveryId: 0, + }, + { + d: "b89f83d7d1e7aed03d7d74bc6a01df8bac52a66d6bccf3f89a20ebd0a271ee29", + m: "8c0c1643959ea80a2e8ee408bcb03aa4d98b742873472907aab65ff1a3561696", + signature: + "0f98da74e35d2c7ac2c1f7525b39110c7d4ec8657a0a0e7002e233351b8af9b913737c9a38eecf240b993bfed502692d72f9e6c4edd693796a0f120d339728a1", + recoveryId: 1, + }, + { + d: "d7ebee26ade633ec618c12dc32b290781973193edb61c4c9c7f66c04ec2c09da", + m: "7e0908604227bbfd2d9d277dd25db88de7b17194e81bd1adb77fba303e0caa67", + signature: + "5cda808d23cb03c682de2a6c2df7c1203f2a39822a28dd10f03ca5171904c2357728219f6367109c795db85649b64eaa0fc1f37691aa6408aa787c7cff64b3d4", + recoveryId: 1, + }, + { + d: "0fc721e4a69ff5f075a5519ace0e3291b97cae3f28f388070715cc51f45b14e1", + m: "b8da61e0b4d5cf582a21acf8756e925ba432a5fcc93c85481d4d527e24ece357", + signature: + "e1b25cae723883bbb2e7e4a0316aaeaf5828c66e6871f313cac3964d3fae990e7f0c0d7b52230dd3aa02351ca154b7ec8660ea5d69a16e4c309c03eb0585b1a0", + recoveryId: 0, + }, + { + d: "e7b7c77fd3708c5248ad91bd8f83f741f3ab5eb8b074bb8dc8f1e486034bdeba", + m: "4cd62499b9f792224dcc01dacb917ef1e361ca6db067bffaaefa4cc0789c19ea", + signature: + "126e6ef8c9855246b3c5af4854a52b7c5069052f8dff7542ef3bab5f1af6a73807a6d065602449de76326cd04bef55d99dd446f4c6f2c692e23510e6a25bd439", + recoveryId: 0, + }, + { + d: "497e3a789d084dec92f91441a45606dd06a3810556c66840987b4424eba0cf47", + m: "75cb0b9abd727daaed13c610d712f1092627f4edb166c4595ab7ced691f560d3", + signature: + "4261edc834347dfd8b6737329c373108ba45bad68386c31785a943789270c0f2195e10ec3636a1e2e88b1cea2aeceda0449aaa217732377b772c6dbf3c9f2147", + recoveryId: 0, + }, + { + d: "a24367be30c66ee5c7135415aeb9e7d042446adbd2c25b13d008f74802005f05", + m: "4395452950b4eb034d84b31a852eb4c7f7df7ce462c1b52172f7bbeaf52384fa", + signature: + "4bccb8b48bd2549451e79aaf80233ec4748ceb4f35c72bfece2cd88af1a007a00497d4008886ff29e28590073c50f881025e690330783598becd50168325803b", + recoveryId: 0, + }, + { + d: "fc946a8f210710264360d9d51e8542cf5fab596b512ac5d5e0ba7bbd65bfd79f", + m: "b2341fdbc70d21b00756af6aed020d984598581305d44dfbaf1802e58d66740e", + signature: + "99dfb7691613481202c33ce3fe21b26d923e1449504d88f6018efc451c9d08d001473c6b89fa0d8c07309548e125a91bd849611c1d14f13f32e7d01deceae30a", + recoveryId: 0, + }, + { + d: "379739b9939c40895d5a007272ca53a3ebb63ddeab0a6c5958a76ce3854902f2", + m: "a1018a20cc60234e31588e5ce1bcfe63d7da29082f0df3b76505e58600b3c5e9", + signature: + "c030ecbb67b0d924655599aa62c51d362776f78acb8b121a508e45ce58500149763261a4ce9409174eba51652e85ffcbb53145bc1b6b498b4bf9b063e7262ff9", + recoveryId: 0, + }, + { + d: "5bb3e63d01c264417d30d0ca51920bbc251e3a9cda1e67bb3b43fb391eb7b50a", + m: "a21f3baf3831b9cc8f97c318f493992b69e6fa0e044d92ec8a0dada39359839d", + signature: + "99f226655c254155d80aaf0d37b685c8c4a0d66e87f933db775f475fd35343440ad6fb9333daf59f082199b8a1a75fd7096211fdd9438402f56b17a5758adbf7", + recoveryId: 0, + }, + { + d: "a807d8b437bf4c181945c4fef5c53b5737ded76b215d3e524a4c8c3cb1afa326", + m: "c0bda421d380b0e5ab0fb5f70fc7a85672aa75f7f56cd8721083fa73933d0d7f", + signature: + "3e791b4bf29567e06213daa964efaebd54fba34807ccb795ffd64baaef9c9bfc2af2bc6ef0a01be72f15414c591194d021a07bad01290be8f58b90fa1751dac1", + recoveryId: 0, + }, + { + d: "99f821ef58e69f6c335828ab23068dad29f049bd4b77b071f709c764569eda73", + m: "6557e526dda95136907ab74df689fabcd0324caded433d21874c9571ad539d1e", + signature: + "351eaf3699d736d9d8108fa3f5c892ed9186649081a04717ba268b2f0c710d154211fb29a3dc5e91b3d5fb3a0b8e8dee95e70c82ab17abec4ea92409175517a1", + recoveryId: 0, + }, + { + d: "588de297891f53720fcaa66656c16f94e197b73f1e3443b5eb53f6019e4c0bba", + m: "18f432a01a2fd2d4f72e6259def298139d071d1fbe517b57409daa37d952feb3", + signature: + "59ff9f08be9301d2a3486477eedfbb74d61f8caa2dc02e7a20a9d6adf3e2d2484692a1432e529551a9abae50beece11cbc396b884b0d2b2e82fb2af584d1f8d8", + recoveryId: 1, + }, + { + d: "89d9a5e0f8be27aea40eea53d00bcc507b85adfbb3aa3e6d4595e03addbb3710", + m: "5080b3448936a9242623397abb61249176f820b5b1876bfa0f4ca3a9a166ca26", + signature: + "7862d1af3f5e07db1ce159d20e975acf16c60032e8f37f0bdab5be5eb9d3d01a39a61b9d388bb0e090b4ad5d9d5e6bc38f684df8564acd37cc9398d92b5dccc7", + recoveryId: 0, + }, + { + d: "bb943a5390142ea074fc4957aad7e3956e14abd65e35334f0c323e2bb16440b1", + m: "caba860236f4907920aff4d3bc60ecc26ea6f29656bb62a0b960e33adcae9de7", + signature: + "6548945d14a38542981169faf79dc61851f5e955445541ea7dfd4d9373e74a833aa5478f8d78e1301077a8afda99b3da40a332624f041e994da4a7515f205fd8", + recoveryId: 0, + }, + { + d: "25f6d6b62b034d9c397a782f46ab351021c8ec971b24d2fabbdc62477e52ed27", + m: "310a182270abf6cd22dc77b121f3377b1a2cc74758852a88f28684b36229493c", + signature: + "599f4c51050296a8fcd1250e07b6fa3d483f000fd7c572e5bcc47f703674a92242c5a01a8e02fe18170cac9a02811525e01e9ebf758b62bf583ed38dea41b1c2", + recoveryId: 1, + }, + { + d: "5bbe1ab5e9ecce70f761c065106393369fd278d4523f2dccbabb334f4b51524b", + m: "8226d1b1fb85b72451c206143827f02abde9562664546f5dfac8598f407bb50d", + signature: + "d502944c9f478037924e46240f7ee3b3d88ef730d27f15dc7e501b02d4a41c755002194a0dabb9a2b78b4e5cf544a2b4764a244f0d958c7c84e0ff01d03d5556", + recoveryId: 0, + }, + { + d: "3f47481451624f39e58c85f5485ec022939e0ba16595fe20b12b16d6183498b5", + m: "41ef044b27597c53ec714ca7fac289379eed2a18012cb55a819d49d8d73a3630", + signature: + "f35e5ef61359eac40b9b370eddccbefc61c7fb3428666bc23956c0509f63d1ff561fbc88ffc2723422d9b3c744bef1cb7d3435b013717004dfdaf4157a39c7fd", + recoveryId: 0, + }, + { + d: "144b2cdd3371b22658533e08b99f31198e2b6c585941dab3ce07f3835545bb7a", + m: "fc137d03c90e6c6f11391b1387d3e363338e3f69b61e8a04f70d3cd383421dcf", + signature: + "b6f47c8752682c18a7dddefdef0c2c2da9bbe31ea422c82139f386f5aaa7f4d54b6ef813e866da334762037c3e2795613cace374afa04ec588bcedbe48619348", + recoveryId: 0, + }, + { + d: "170f722a17345ca6b449294cbd58dca11df4c538dbbbdc408424ca15a8e3c17d", + m: "20e306e3ab9fb9938cc06133b598a67b0f66a1f5eeeec82b556f22d36c2ff0c0", + signature: + "36951ea369e2d0e8308c0851c83b624ced5b48085698e15fec6250fab98180c373e77b05a3b23d8e17c7b58fa1943825e1d486fb8a108b055c27d0089b421a74", + recoveryId: 1, + }, + { + d: "50013657781b154f4fa9fb699d7d2c0e3b50b1f356465e7b5f0ef11ccfca456b", + m: "9bd401733e7efb42d6663d5fc9086cf19e413f91d3008a7cd31adeba9e151595", + signature: + "d1ba3005deae2d8cd7576ce6e1afbba807211db84850695c0370a08c58410a9548566f075ed89bc68dffaa8f79267331c863ceb0743e76d42d1d0d8308e266a5", + recoveryId: 1, + }, + { + d: "c4af524e8d21a5987f3268819c46057b28f1e7774f6fd72a18c0a42ccc0c6ebe", + m: "3bf081f32d660179026a7432631c1ad8134c1f1b7e5615736a26012419434786", + signature: + "8d91aa8675224efd69f40291fde4ec60190d01dd9a5a8a07bd62f7249d76bc940d5a6be05255ba8c329d8544b13adeb2dc7bb0d0cfb56cd4534150e6bc19df05", + recoveryId: 1, + }, + { + d: "f1b5b05324625be030ca312637e395a3ad63c0237648c7e4697fd6c8230437ea", + m: "1c1a65fc741a54a1ea11738fb730684964557e369c20d55b7d31ed135adfa5bc", + signature: + "95bb6447c478dd04b2e649833604ca96c5915af60b44924cd6580420ce1e70087844816a17994eda01c0e762247737fe5ed96f39018708da19573c5eddca5d75", + recoveryId: 1, + }, + { + d: "ac88d2d403ab5c9ed8718ebdc4c54d8e2a19acf65a1c320db2ac8caf421237d0", + m: "b557d9cc79f1af9b4555527c43be9c1d1048b2de9abb37bad97353f4e593b39f", + signature: + "c08b246468ef9367755b5f97e9b10924a2db4f2932b4bf5097b4111f086601c3101c12d658fa2faf2a3ad32c61f8b4ef62492c724ce40b51b192c09c322a919b", + recoveryId: 0, + }, + { + d: "7ac99236e12e0528a965976ac24a9372fb0789cf21e6fad564b24ae1d3fbf13b", + m: "57c4942ffabaa1510d8cc9d16a2e477f7f8f9d88a56abb50133f054b009b3604", + signature: + "d96b5a0bcb21101179feb4176cb4d0912e76749b804d6a3c4c0524112599f2780f8166ada46b3f9f059f976b9488fd383d2ef66c15a04b70195d92c374eb93d0", + recoveryId: 0, + }, + { + d: "bb150eaf342672d984ed012a0623cdc1d8022fa10243194a15197dab11123b31", + m: "619742b62e8e9eb1e874ebe60c21d1ead846d40787c98e8d0048f68ce724e9e7", + signature: + "379027148e8868972348bee4e94bc30a4d71e60884209f0d002b78e67258a64a6beab3c6d50e0faac2ac6dfd7d314e698f5bf1618162b6727a95e71b8d8b6e33", + recoveryId: 0, + }, + { + d: "dc3e9a508ed0a1380e70cb1f6f043b0a18fed12dacd66399dc0b2065776c4b45", + m: "5b2fb0966f839c967fad661416689b5a81939539bbfbcd23865f5f85632131ac", + signature: + "ec536299f160ce38a82cfc180ded0a7b17238bfea379ded085589761a83fd9d864e0b928ba191e8cb55fd2aa4ac67fe17a37ac62196c682617cfcc8d2662531d", + recoveryId: 1, + }, + { + d: "d86dd99392fcb50eded095b83f99f033968c9069674848b7367e694c852e0f63", + m: "afb70191856905953ec1bc4128379d2252b2f1ac1746149facbb8fd13780c156", + signature: + "5002bcd9a53260b676ea395b18dae20e549f09a5f97d796f6b68f78a93c338ee0828b7421ab0894485735349e15dd3468afaefdc7244a882a556a90f32e7c45a", + recoveryId: 1, + }, + { + d: "04da8678a7baa3692f55454280d89add05a8a483bcb6b87a984332e05529f967", + m: "365c7dd53be38030237fd1487cd472c8be4744c393378954df54c360c17a5c46", + signature: + "a660239e56048fed110b57c6bc080bc316f7ebfe739ed94e9d07ff5b7aaef4cf54d07da583571ee0707093deee902c4641153b3de3b5e594ced900a7e838261e", + recoveryId: 1, + }, + { + d: "0263cfd582b1b3bd5d23975a46421d8da7855261aac9a64a4f6d6a2e1c06506b", + m: "86f6486db3be3056187b52a88b35243d4b45a88c66255f717c096faeca059643", + signature: + "4989c3c0c42f5cd6d0683c0fde804de794138b3a00b36b4918b506426a318e261902ed8d0c21d01e3033ff3bf060118d0219b0494c9a125478754d81d04c1547", + recoveryId: 0, + }, + { + d: "fe02d4300ecd97e55e296f3188b1691a384006ade91e33aa3c9d0e2414cb6096", + m: "8e467fec898040344570e90f8e26df1fb4a5ada1a707ef36ae885d1ff21e9aa9", + signature: + "6aa5a3b8a909b748a20b4021dcaaa9e35642d03aac9c5dfd6e2516374ddceb8c70684ce82f037da7c54ecc7560692207dc218da0f15ee4650d5b9297860e8079", + recoveryId: 0, + }, + { + d: "0e8b8a760cf17aec11e4e77dd7066930017f5a46eff751a4c3ba00684542c8c9", + m: "d12650f719aabf20c1d0478ffc2686453c7fac74cc706e5f12b49ea3281cd609", + signature: + "3d6f84459c8a88b8f5b4b3e237c5201c604521d71c25badf34fb9be4c1b21acc6e57170e3778f41ed799469e3fa74d23dc418ecc580989b21d09b3d2ee6200bb", + recoveryId: 0, + }, + { + d: "04fe7a70aa1c8cf5a71e1c29b25e181b7ef2ad710ddd9f9ecfc4452a3d981d7d", + m: "83e2a466aae4ec521a9d81eae90a15c16c9def0b9124c06afd851186111d9dee", + signature: + "16b2b86bd8959415940b2b3b83f4bde0a46ddb95dea4b95aa0be3b00f461defb6f82d8d1e642fff9c9d1ae1549763540804e197601c42fe3c888bf2102022718", + recoveryId: 1, + }, + { + d: "bd7295a3a88f81b06b2300a2f2c4ef7899628e55cf1619e92b9ede262f57d62a", + m: "d75166b0f616fc69cedbfda164607e06f4f2471a6f7a329a356d6a3d6eb3f3dc", + signature: + "3153c8a84f4e566048d450e6ce4fd0809e0933d4e9ef2068d5788cbf0cb28e443afc57f7c175baae1e1aa146f9b0804a833cd80267c081bbf7779d90f62d1cb7", + recoveryId: 0, + }, + { + d: "d9c21eb8d9dce4d90ce46567bb107a8e07affa486ab5f5052134ac2f5c4fcd52", + m: "1a4773b1691174d4d291667dd9ba5eb2fd72da9e67719d18a942431bcdaecda8", + signature: + "a11c52be3d7eb44a19ce141fa5417189a27ef0f4a626d8bb9d5e28c4d0b5948248cc3b5942726b46d685b6a60b8d2dc89ff36abd8921b6476242f6a27103b74e", + recoveryId: 0, + }, + { + d: "5f1f01c8dc216bd8620cbf4831344cf8cd118fa3ca5e634d3c8663926de156b1", + m: "82a0a4291f00588a0fbda35c454c432a037e787c7a13f7619b4c181fd1b636a2", + signature: + "31a94b0ce3b36ff9c2523ef416ffca02d1a7625969418948dbadca053eae40607da275a299399d3f9854613d378e45b3ed39137917c4d5970e5ed90071f84d1d", + recoveryId: 0, + }, + { + d: "e13fb45c7ce6472694a97ce677b2de5455f7b859e2481c33ca17beae6f1f2929", + m: "2b5bab1e923474f8b08b51973b5dda4b7ed89a1d3b065aa39cc587efa1a998e8", + signature: + "f85b849e154aaa0f537c7a33e5efce3221afc0fd6c8e71a0d9513927d8d4168b031a710cfcddea25d4ff091a70057cacc5a9bef75bfb45a683924d1608044065", + recoveryId: 1, + }, + { + d: "84794141826b81109a779aa8307fc1e8cdf2426c284c6a2d724ff3a1bce67c3e", + m: "d1cf5af81412b6d27a98e75389531807f7ae4bac2eacb9f6818bd6d2391e4cfd", + signature: + "04a4416ab0a9c892ab20914bd99f41571ef4e512742b65106f9705d2814e597c696db0a970b83a910136bc58fc5ef8da5dcb1c0f901101ac3dc7257c746212c4", + recoveryId: 0, + }, + { + d: "2f5e798e555a3b4cc5fd4b67626148cf17b2a5a05059229a097ac0b5962a917b", + m: "1f890d26845a76ed445d3a7c36d374552516c16f1b8c3a1553972dec09d0edc0", + signature: + "90a0cdc3ea7cc2e1b39457286c67aa0517cc94f1290edd0af0ff700e9be99f1372fc606d8b67157b8a136775a35fedafd95e46f69b3c3d1f1c78c1c5b75c7b5e", + recoveryId: 1, + }, + { + d: "938f3a2fd853390ae56a0999c3ddb01c4ac778b3bc3f22df3c5b192f402bf0fc", + m: "ba61c59ae3981db7f37665dc263693f6c4a632f5ce97f3aab0720c923acbe9ec", + signature: + "d9a2d1803a27a6e9814f3ff3d7fd713366866b972ebb51b2c6fef51592b7f34f0b7bdd79cbc70513df6b94b06685a368980c88b07a128dddab2181ad3c62687b", + recoveryId: 1, + }, + { + d: "309423c18f207f08be7c1a0a91a86e1ace2db0f63d10ca6d63dd0b6a3d0ecec5", + m: "67e77620d62e9a2a2f93faef9395ec91d4841daacdf686333f2e18ccc10ee541", + signature: + "90a659ec73289d8c924341e57a26db3b0ed4a0976e173b5c30146621cb4991ae09a5624aaf5bebf65cb76c6cfc53c16b389b7882126bb0806dd683db544ae79e", + recoveryId: 1, + }, + { + d: "e500e18f41cbe866a932ba2ed6a5f55e68a17bad5e7d24fdf89401268cc21553", + m: "3c2feb7c225650667a9db13f21940abb98fe6e78cc382948e5ca6791fa5b8f56", + signature: + "a646d423e521944d7f450e89ae7d254a9cf73ecfba652ce71bffb3a2dee813df1dd75078a021857681a0cbd8c623d9a34cb05810f81d11d311ec128028dfa498", + recoveryId: 0, + }, + { + d: "968a10cbb8d469b8fb05c28698535e0e56359c83ba5cb9d5ee9dec1f23aa62c6", + m: "a5f6637ce1d49351feca095a53a5912cbf21e507aabf55e328033b02689b8994", + signature: + "0cc8e64fefffeccb580d7d2b7299bb96f0dcdac0cf8d3c64eebda12172a77260480f107a402f3ff8a7bbcf9aab96a82449111e84c8d4305f3048406c0a1431e4", + recoveryId: 1, + }, + { + d: "9c8e18d262cc2be8484fc4274c9c1dbc1be21c76d60b2346a2c02152a15a5892", + m: "cf3de5d487015bf29d98d522b6a981d45362d4fbf6f4405a24121fccd13794df", + signature: + "9b23f9ab4bce422ee290838e6cdb8508abba48adf49a02a23a06b6f2b113b1f419bc567429cdd2fa7f8f7a4675ee9afa19af36c02a0f84cf04af695cea3175af", + recoveryId: 0, + }, + { + d: "b39cfa0b8e1439a5167dca12f9c79531ee576194f3afddf975c13ddc8777dfba", + m: "40bc9ceffd70601a07e6d2becf5df80337ce5bc587ea309f7f5687aad55c9669", + signature: + "a029c4f4d15403edaab528f17e7f4b62734d9a1f39405dae1455fa5671d948342679fd3c869fb4a22c22e7c6c9f1dc196e5ef41138e008b722eeedb0a5fad90d", + recoveryId: 1, + }, + { + d: "2ddff895865329d15cbc6e19504c30c76ac93d2990dff63335dfba2430300146", + m: "a697eb1216f05e888d866803b9856fefd9a51f339df303bf969b1ee3e185fc2a", + signature: + "d69daf7c1ab0f782e3264f6517a1949cade3f891a15a8a9e1af119730f92ef886973fa998b671d76eaf929ba67c420f961ed1e67227904365de98d004ec4ff74", + recoveryId: 1, + }, + { + d: "2c1ed3f7fa254e60066439371b9278c84f642184b4f327828cc1d68546c548e3", + m: "10979dc11fe3c10e0fabb85a8c7c75cd3f6926a9492e07369ee3a0dbbd1af870", + signature: + "0612555ce58e6f1fad0a69f5f6fc41efeb1730cb0aaf3e025270fa6a595c78d6664b31127a21488a4cac837dd795a6f6df1dadd80eced2ad9f5ba541520e4fc7", + recoveryId: 1, + }, + { + d: "c3f2a0a70b81e8a95c0dc070e4bcdc9c54dc8c54a990e4ba4ec0e32751af5b6c", + m: "4da2e1409c7cb465e17e405e65bd2d75cb555d408f5769faaed233afb73e9e47", + signature: + "70a2439fc45fc79dcb9164e65f0b9d773de877f55dc26e3fb163cfe05edbd7657d761b097a1d81167f7a569bde9028245e5e97d7cc49a6c29ac5d91f8fbc2512", + recoveryId: 0, + }, + { + d: "99b2c1d05d37b0af97abfceaab3f6904000c923e4624bb22ecf90f1c62306e1a", + m: "7a8d92f1bc11634e3b2ceebf77944fae55b9d1385a0e8b354374fb40fc6b6b6e", + signature: + "35e1729419de495b808819205e8b8026815c7c2568fce2110c683a62b28d32f74c44e2efe7557496698b80a27b2faa03299a4ade9f283d1494da7cad8f5969c8", + recoveryId: 1, + }, + { + d: "43e692717b408009bdf96a9b61411c38ede5b427be2a3ee87804bf34af8e82aa", + m: "cfdd9dbf0061bad171ad22f89ba0c86d36745df4eec329c870897a408bb641ee", + signature: + "fc54e090ff4ec42b7a79d51c4de58178decd05ab098bc5c698704d50b76d6674540226d3a3353490816d6e524a08bce2f54b74b8cd0d926522d1c53d8f53f8fb", + recoveryId: 1, + }, + { + d: "94407811ea5ced3b82624efcd4de1bbf7162fe14425976c977ebea28fdf4b382", + m: "5739248162168fa88b7df5e8b15821258559494ec2311a6a929bd883e920246c", + signature: + "fcba0e7f8ba989d4394db9432dcf34ed574d46b00b53f4e79c2abc7f57c3e34d35247f223b2b6d3cbc4ad7f77a1ed09b005433efcd641bf4acf610dd71f964b4", + recoveryId: 0, + }, + { + d: "70a95dcaa6a9cee5c34890cd3f37a90dd1ecab390e6fe042bbbe5d48b18ad321", + m: "89d0e29abb02b5e493facb58746bbcd5cc1316f3567e7a4c8bd13b31f270801b", + signature: + "14d487a682ad83e3358672b7006c374852564ac4bbdc6c2beddf9f7a221499b04b106e5096b167e7b691dd3a1d9783a167911132cfb35693ed8fa4328c6fd33b", + recoveryId: 1, + }, + { + d: "74e936f9c7e3147faec0cfbf8b24580e5641db69568964835611960c13783029", + m: "bd0babe70c32a2ed2d4c173bd86b1cfce9cf7966e261fed7cb2ed2a36b2ab361", + signature: + "c12664c3d653fd2c7d9d1ceef5889404e7273d1b2fe74cce90667284f6dedca154fd3a34f9673c61af0ac5107ffe5137f92836f2162021d37f26074d80525964", + recoveryId: 0, + }, + { + d: "ba2c7f1b10656225f1cf0f25b939e2342f701f7a3b8670e57f4989010a11b578", + m: "bd4605e1c3d2a0bca1a4f15cf8416227265bb449984c85419129f2f88d8cb7d6", + signature: + "878dc2d9f8ad114c7d2d2bf8f543b3a6b0a2b52b04542014543038396c2b3f285c630bf9fcca07341ca0ec4d277245714d489bec495ea8679731a742169aafac", + recoveryId: 0, + }, + { + d: "c0f24b0d44cda7743834b0b1429d02d345d0a298ee765afc53e62353a168e8a4", + m: "4de8024aaf78b09d1f4645ecab7e54569b26a8e8bc5323f0d60cdd7f020e8694", + signature: + "97172400a3b943b568603480ec448b6f391d61a00141585a2f19bee162a25c4a62f3d0c9e84db9c09f8bc1ad46cc2268412a11a9ffc5bc0816189bef603da07e", + recoveryId: 1, + }, + { + d: "43016a37c681f67d058169222a5871139d683c52440f027986344502d5a4ca26", + m: "3e0fe39e1e8743bfbb5ee8680103e25f09e30874927ea758c9cfa6e39d478e66", + signature: + "14605cb59e786d101cf847b942d6594ba3d00cc21a36fe8bfc5b376c159450da0e4d1a5db87dc0d787ded5fb7b84800e6b3a9d460774e91f0dc817cf64ac8f8c", + recoveryId: 0, + }, + { + d: "02cc802e91b9a216328c8b0b65c9de7f901f49e3fe69413d154954926b7710af", + m: "e798885307088a55f8e296f565c8621522fba055fd9b4527b92fe04d3140ae58", + signature: + "801c39a5ea480fea4d0120bfcd3b223be5d4b3ba4abeb2366d34257a37d056325e2560a25f74bfd59b15dda89b6ad5fe32b99f030dd13f65fbfd5444e4256094", + recoveryId: 1, + }, + { + d: "555bfe175db07fb5ee7f4c8c7f544caa3b3d3a43e68a54e390e6894ab0444638", + m: "b6e1d4800e4260a9861c27aa24a398175da32abcb97d1c2504e51d2704ae0693", + signature: + "d53baeb94cef3d6025ca5190984bbbdd46ab6979b1a30daa77c148403598b0a848346a9f56ed06940a14c1a72f0d6eb3a6e788fd8ecbc881faa5389c8247397b", + recoveryId: 1, + }, + { + d: "3f8b3bf22e583f0ccffc251128abebdd30534aa40ef05e28c9ccf7866b6b22c8", + m: "ce813627d54ab7c1bb3e4d5b24a892fcb9202df0112fd60e9cdfea0fe688ef15", + signature: + "490d7014be1f033b0605b9e349ce11c6aaff0f830b03e71368c1554eb4aa8793549dce552621b9618ac2bada73bd44a8f0cf2b437c448eab36be17228aaa5db7", + recoveryId: 0, + }, + { + d: "86e74c9565d38c0ec3458ef3c2ac783bc167f02c5691a624a9963ee900f87525", + m: "8923a87651939550fdf65ae47351e2b3c121b8edea2f228ac399374fc1f7a6f3", + signature: + "e8594d6ddb09e90b88849cbc9729fd928b27ab7d5dc7af23dbf2dd2766fd930e2f236e242176fea12e106cfc2922fbc96e1620d3dcc2e77cc3eed4f88f87f0ff", + recoveryId: 1, + }, + { + d: "ae7864b50298760c9c4d4d9c55ab56a43938aecc2374656acdc3ec512576bc23", + m: "94f4c49d98257cb2484e4d99007f6761d80635aaee2928fb17a6b3c44f2a26e4", + signature: + "874c96cdac0a48ec1346c5ff3d74be439b90dbd8cd416e3655b88c38b520e20d3edbff71f28cf74ebaee570bbcf436b8560b71b9f9cd837f669dac69d9a9e598", + recoveryId: 0, + }, + { + d: "b5163e0562dd9cb16b55a8a6253012c3315edcdf021fbf2dc7a34ad367ee88fd", + m: "1773513cdf30827cd67d5050d69400b06600ab185edbefd40d857732055ed749", + signature: + "b2b28a67cf32e725362846e5ce4a74b9795e30b1663e61ffe7e002649766bf4d3dabb2910718efcd68692c2a57ba7dd887061ccbb20e80fb175014425c1ee563", + recoveryId: 0, + }, + { + d: "8b2aa05fae41932d9053a0cb6fb40c41741194bd67b76f9d6a58e34acbc9a4cd", + m: "e96ac7fc5dc590bad68ed5aa35f12a2b09536a7c76dea0d33fdf627e122f5dad", + signature: + "fe4a146d5ce4e26061dd9ad5ea1827ee3104a79cd4a6021eeeb49d558d700df204b14b3f8fa01b619dce0ab093f8ee1c4be71e2b5e4f5046b6c4c040a7037308", + recoveryId: 0, + }, + { + d: "0666de1a936a8ffd0562ecabf4b8b94a2e0815392ae27a14232b7938c8c75e1f", + m: "74023e20e26378c78b0511f7fbd26d9776d6af77668d1ae39d42f5cbbac5eac3", + signature: + "0906a34a995bfe04d31546bc49d5d597dda4b74ed57572c7cb164acba287eee7453b81151be2aeae001aea21f9db1c68a609553e2f4ac5f522c5e8284c851978", + recoveryId: 0, + }, + { + d: "92f73a26f5c1b0b26a6a0f061709f3e96a8a6e383ac1542d0cde566434330e05", + m: "c4ebb36adda07803de4625e6ea426086bab8670edfeeb7ab00d10e8b88ec6abb", + signature: + "fecbae7aa81bbcc5545a40900346450888b2d25b6ed24432b851e58b862443f344a50281bb7132de6f13e8eb2e5c99f96c241d5754bd49e9d71e0d05f8936289", + recoveryId: 1, + }, + { + d: "6ea45a308218b62321e41d70eaa52cb8fe5158d6665262ce205ce4ebc1ef018d", + m: "67ed2e9f0ef5cbc0a0616170e47bdc4edc827de70503c2b728465f34c25d783c", + signature: + "a0c23ca4891cef22172a0834780a51bdf0f3fcdc09503c9145da3ecddfa278e6588585687384ea2e8bb04aa61c998d0db89f654fffade99774c5d5bf24e61e61", + recoveryId: 0, + }, + { + d: "ac2196e8cc9cb1c06588cb293014d0e5f74a8deafdf590268eb03de774b4e659", + m: "98fc1b2edaca0573bc8b0af18040a6dd888c1b0cc4717c565736fe9a0cd187e8", + signature: + "a33491dea8990cd40d1765acffddc8acef906b380913d7a3788bedec1849a9aa1ac656b5bbb4eeb10734577d473cf6b4779e29ad5ee4e92775ef25f2fcf0b716", + recoveryId: 0, + }, + { + d: "dbaf5da682b4e915decb9b58b2fc57e33a9b4382aec4f614d3edb55b04f82be1", + m: "ba3d9f47eb0703347e41e61f34267d44e9de9847a458e31243c4a91620d169a8", + signature: + "f9ececbcd9f3312f35527c38518a59f7a1b00191b73dc91aff7b765323d618cd5b75d080bf0c2b974928592dacea8fd7634e996d5b68a6e56561a7f0174901f5", + recoveryId: 1, + }, + { + d: "522b560efd550fa312711c1bd6335c82a870944b9d0f9ca764f7b8690b61316c", + m: "9653408688754cc07f1059d3fd2eb103e86a34724dd5642d21ee073e668829ad", + signature: + "1738b146cdbdf5024940c91d8258c037783ed085781829d1658a0d753d9d64e43067eefac4ec8c9ef98bcc3a60cf0fd6aa91853b4e4ed11fc644643c3cf27176", + recoveryId: 1, + }, + { + d: "60e95855a6986162d127e6b617afb04edaedd0f2bf3cf5dd9a380e2e13d20c04", + m: "2eed9556a2905e201831f831dd2dcbfd02e8c72f9799f61a71146c55248e738d", + signature: + "54026d735334ab76a3c86e296e914cbdc7cfcc8f5c34ef902cf545f25a71c39239e6789b3b015264f4389c8f4731ccefb353e0f1b91bdcc5710359dfaa7d2ba4", + recoveryId: 1, + }, + { + d: "3e68002fedda2f700e939ad1b407905fe12550519fd04534105577fdadebeeef", + m: "dc21b96aee829e48f87e8a038e290b1e17af182dcccc39f8122504f10f86532c", + signature: + "426a93db9bea9bc659af1b27120c672bc8483435cbe94b1a13936ac9cda127f836bcde88ad601d828d22bf7695a6c89699df3399b7897c2b28cd51b9ab93fb23", + recoveryId: 0, + }, + { + d: "d51c620f2fc71d62f96d9874e0588f4331a71f86b0ba4a371dd9c04eab2f4332", + m: "8721689ba3bf5e6dacc80cd6f470e339d631607162c49f35ecaf1fe828ea9a9c", + signature: + "32b54d13170409b661c400c23faa641951917c79bd51792e0d2a4ddcff65097701c349a5362977eff6764af84fe7bbbde5f684eb8258f1acebb79d862782f707", + recoveryId: 0, + }, + { + d: "80e93bd07a5c1ca879064c515848ef0e5b3c02c540f38c5e358f565e7dd81fc6", + m: "faa997f9dd9e8e45d1220be1c00f26ae3f4ec270185cdc8dba64d5e7a801f1f1", + signature: + "c3ec95d313cd077b848751da7fe85bf4af569eef41fc7fa28059ab5800905198776bd4d35a12fb272dd64753d13e5d58d5f7a1d9391c361365a8aa318067f397", + recoveryId: 0, + }, + { + d: "2a250426b36be0388257094ef4c7e339a8a350b7a8364dc650b98766c85cfe3a", + m: "a2ca55a7f31cb7f081161212dd239aa94c90ecf09ebab83649aba9ab7df7d711", + signature: + "3a077559f111d1c688642943c7bb5a6ed735fa8396100b99f0cfe9a993b59f10364edb6910e9539afcc3d963746f7052703a1a00d7c5a4a0f828a890ffd94c5d", + recoveryId: 1, + }, + { + d: "c3aff97c628b2185ed5f57835a16d5528e2c9a2bad1a41d10f75c71a813590cd", + m: "927f6aaef182f170affededf349b8df3d78229662cce8f691ff93ea8fcc2c4ad", + signature: + "d9738f49d9586d0b48930bfb3439fb6c12eb2ad8fa4ced076c98a88cb91e37f64ffa8e9bb5e45b7fc6d18be0902bacedf4076ea97ef4da467de1be1441d21b2d", + recoveryId: 1, + }, + { + d: "9c3f95cfc2bbaf3de5e40ff1eef34adaf96017388d3b04c3fefa554756a3973e", + m: "2f16418e347d89cff8bcd916d5d636a6b9da92048d6315845d3f3eaf9d50a7ce", + signature: + "89d99cc1f5c2e8998c2654e7a12b66c36bcb5a42f8e6877c3b56631676a09c2d74c2327c823db528e9db7c96ce47ff3d9ef48769c1513f1546d143a9675131f7", + recoveryId: 0, + }, + { + d: "0f9211dc20f42caee78dea84a71ffa5ec75e2ad2b410b02f531824d6f7e21abf", + m: "ab598c53007f354aa08114102675a657432b2a933d9cae0b2a2cebb05a3063e1", + signature: + "9173f624181b1f07e6a7e6f96e28262d19f5cbcd044128922716871b41c984d66407142c71acb259c61ceb959e3fa82ddc795eab92bbecf1c360801619772aa1", + recoveryId: 0, + }, + { + d: "178d12ce9944b2fc023130b023c0afa982aa3a36bfc22135b2f2d0a509fe2d93", + m: "cd78036cdc10648cc586a973b168fdf4c44f276280774d3f566f6921de8ff667", + signature: + "136b50f9915581f955dc1bd986fb92d8925cc893bafb49c0934f552e489ed3464c1a76ed1a12517556fed344821accbdbf2368b8b9fa2d6098ad11ea1607d3b4", + recoveryId: 0, + }, + { + d: "20583227cb08391c0689c34e4d45d5d9a05d599d953a3f8bedd72dd8279b3c41", + m: "4834751172eea25dfae131ebe5f4db69158b2ef624134c1d3d017fc80df0ef0a", + signature: + "c25a6e8c7b38983ab642e00d0c4ceacb47edc4aceebe76734a2498aa634534ae14ad29afec086032725bd99203f827b54e219000440631c028352ecd68314c3e", + recoveryId: 1, + }, + { + d: "98d94db563c6ab5eeb7fbf0a388a8d0a2436b0e894c212cac683cccdd6e63ed8", + m: "8a8cd13628cf769dcc3c25089598a3067d94e237a615d25704ce5d158411aee5", + signature: + "7df691ded2f29251c1eb4e4f5f7a5cbf7334bc00276711072fb7ecbe8366968b0a38183e4e8636e7ba65bde7a2216cb6988d1a8cd45081474efae479606e1cf4", + recoveryId: 1, + }, + { + d: "dcbe0ca5648a96cd268e3d395dd0bee17dd7212433d97dbae0d99d0f86496b56", + m: "d99e2c75f73657b74bbb3688135fd8e9e05ffb71048c9e26b3e417674f8615db", + signature: + "d154a5de982e7bdcebd24325a87c76e8a5701f14cae9d4e9ef0f95d3f2a592a52cfdfe8cd7ce6ccb1f695c11a71d53c6d1b8dd8ff2849ad18318217e4e766028", + recoveryId: 0, + }, + { + d: "898990f27c59a0de6dc83be1e9b3df428d8e011b22b22ca187b20c2c0af6c8ae", + m: "e3cc77b1ae401934054e52a64db9def8b171c98983d564dabc2d1e6555a4acbc", + signature: + "f985ab32a7a05371816c683d5569649f2506e32871688400c858ff95acf9f3ae212ce5c2f836dc4293cca81e822f230827c1b661753ff19bc0a6a9ed5306e4d6", + recoveryId: 0, + }, + { + d: "8298f3064eac1071f2d932cebf4b42f4783f063c8db10c65562c77015fe966d3", + m: "3f2322176e0ecd5556fb6d23e35cb66643b24dac70c994638ae436aac72f5a8e", + signature: + "cda564ae87cc01f09af51f1cfda221ebd5ce46ed5ac6d4e2a69d1fa1c161d2fd2c2f3473b04ce9c53e3590209a8d416bb3616c540e0467c2049182876d832a8d", + recoveryId: 1, + }, + { + d: "815f3e38219ea60ceba3908254c56d89641dd209bb80f6dc705d1cf7aeb5fa71", + m: "467dd58c316b857eabd53d373864435e042434cfc89c26e2bac793cbed184f35", + signature: + "4bb1b5146fa7e4f184e2cc4a07ac533728c9dd230a305635829fa0ea7e8b31c31bb5866a6626abf084882c9e2bf6b9065b7ba8f7e46354461d047e1a130233bb", + recoveryId: 1, + }, + { + d: "49bc4ef27903e8c5be5f4ca9c16eda627107a9ede2dfbeb33be0794e5fbce901", + m: "5bbd24c76313b9185b7178a5988755474088aa0edddcb32688ef8bd1cfcd2a3c", + signature: + "178f15b1aa0afdb53dfb303e8fba64c6634fb13b44b89edd1425d3633e01591854e8020a57c6e2b8e87ab1bda9cd43cff058f65f19465997456225253ee80b25", + recoveryId: 1, + }, + { + d: "3c6f52573e9511c11cfdcef45ae530830063c15cd601aa3a95ba3cb5b61cbb1a", + m: "8e5e9824744a574ccd34f598e8b850032155b6cbe443527245fb007c550d841d", + signature: + "9ed15f17ee06103fefe75ef0ab8568a3e1e3bfe6875da2bea27d2ce76666df69421710e0abcfa8d01996f25a2ba56c22400204283a07056fa1fb47287dba9f6e", + recoveryId: 1, + }, + { + d: "744e950f313322756c229f91e8f69c5b29c8d1c2ac158df1ec49f8d8570d1b94", + m: "fd9108818b58784e6631499597a8a2d656f3c390d9847a99146a268f9a4bc286", + signature: + "63444c2b2c5a1ca6c8e9f62698fa17850693abe3f6524422f50fd00140e7c39b4e27c16dff5049bd0ffe10aff02e29d582e41ee44e36ed925533735aba8dbcde", + recoveryId: 0, + }, + { + d: "fe9910e937aa578671324de5895ace56b1620839af7545383200e4ae23286b88", + m: "32c4fab87eb636a139445c55c90a1d9836a9475180d1c9b52e91861080b0742a", + signature: + "cc0f704adcd42061df55e8084caea482e34da5c54e7b7bcf1039a32a529e607c5310d4466b6af419ac209060ff5f8fc501a3b20c8adf8789e7d2fee560d05ef9", + recoveryId: 1, + }, + { + d: "9d9b77111e33a57514010d8b2fb3f436e7bcb48a7ddd6be8e5c34778ed2c2103", + m: "40760ca06bcb770e704f2ba45e53d20d998b592bcdb4635dd463dc264431ca97", + signature: + "f2a31d39b16cf2dc0834a71c18906800a65c3c1720a74342e7a7c11464ee31da6ce248f73bd43c4edbddca9d97c07feec9ca44262678891c1ea9348fa8bafdca", + recoveryId: 0, + }, + { + d: "373189adb6fd5ae8c6877cf4a001b248dea87e9541d1ed2c2a9b4f58d29d3616", + m: "418fc3e9c9e4012a233ca672c89e9768d849b3fbc93f8333214677a5a0515499", + signature: + "3e3cae4f4e92c30e61859478c21d1283e1b461c4af44b34e6d15da63ce0d93743bc9d498054960005380c3fde771ce7637b91d3412d9c27c4c33d847ddb77606", + recoveryId: 1, + }, + { + d: "07fbfb696f8b3590035b5992a51a86bf9b06fc74802372356806b670821e099f", + m: "027e228f5f0499b0e5b494546f4236998d9eb009c6ba9fe2a60293177f0e3650", + signature: + "4b73e8de26ba311fb23770aaff391bd5d33fec93a09f7367c20fb52d4675de066e7d16df68f04c05a46cfe866b158364202ff46e0718aa1999d9a4b1fe99628c", + recoveryId: 1, + }, + { + d: "7ce2b3ead0d861688fc9dba03bbbb688e0d9737863fe19f8fa3751ed4254d7a7", + m: "78f3cf220152734974ed1685c3a719a1350884261f2e0059f03da7c856fc65d6", + signature: + "71f596f14d25fa998a9943f5f15baf4feb155411fadc961317c214ec5a7f1ab7161e29a762d53e7487284252b9ceff407d7c1cdb38c3353f73630643010b9e96", + recoveryId: 0, + }, + { + d: "c616ce1fa89e44871b1d5643a07cf0105a263c9f94cb708a42f6fabf26608780", + m: "b83cb393f85247dbe2ccc4ef514f7c29cfd555295884e79b52899a931a77991b", + signature: + "b546013f264f49a4afb75bbf4f2160730acb6fa9bf523553107e4c887ff32bf415370aae3e8b2fb962afd7dd6339503294bacacdf79a3cb8d3bdee06a7a56ba9", + recoveryId: 0, + }, + { + d: "48fbb6a47f2d7750a23fd135893d387a1b7d6aa8b04b218cbac9906edb8ed96b", + m: "56bd7adcf2294985e9e67602352de1c61d5911842424110ea51a5770a3bc5888", + signature: + "8443d2cddfb3ae8040b641f9d6024371e508e2120c161910d7aacddfbbe05b980476fa8354d08e1f5de9374ae4470c1176a6cbea37c78b77d97fc1df0489fd75", + recoveryId: 0, + }, + { + d: "ed58e1a94b30b00929c045f3e7ce171281da9c9861353853b7ec4edc1e7e2c1b", + m: "fda0f9c8ee7331f8b35b201a05852258dcdc3550fc056599a70a03f07b648485", + signature: + "a49e5eabcaadbf227aea21b55a1be7755dedd912b0f0583f03ee34d4ea94f9f675901f92ea172028ad1287b044da65180fe54121f48144d5172e0cb9dc760ba3", + recoveryId: 0, + }, + { + d: "889d9a4bc0d0ca21b9e5508b57296aaecf7962c4b3607ad6e99300b300dc7653", + m: "853fd335be8c69163eb8ce940fb7b649c81d72b3e11f7e63b8186c849cdffe96", + signature: + "b7cd36996ebd99db5a7798e8aeeb91a4c4e349a2da07ce108389568af3446cc50bf71beab44d71d5bdb741c2e2ab38e6192aca4b753a2afc7ec4e5d5c847a31d", + recoveryId: 0, + }, + { + d: "c4875cb024184f034c1d62793afd1cb816e39b5c4962798681735ff989f7c080", + m: "e1b6e6e839e880257034dd961a40190bbc68dd457466a7fd1e2410860fe9aa84", + signature: + "8bcfe9a1a7a327ce72854026606f48d88ab5b66a1bfba58c05a9d1d57cc4c9ff5735f0cc68a79c542077f0bc70ca0f885cce01a3aad7f8ad1e845a5c344fee8e", + recoveryId: 1, + }, + { + d: "d168bf68fc1b760ef67d23553e54546afbba66369f66e840f72e76b1f844f82f", + m: "c18af6b30304e42bd213a61048c23b83b484bafcaf14d14255ac785af7fe3675", + signature: + "51a5a7858f3031362bee0fc6c09614ef56e12c721a10ec4447ea17dd20a8f8504c7f7f9c512e83a50f20201920d427896976c4a6bf20526e9fe649d298ad810f", + recoveryId: 1, + }, + { + d: "ddfd0d51c93db5b9a4c996b09328ab81d74ef0f03f738c5faa1e2c5d6db24778", + m: "3b310f893d377120d9cc6417202b1634fa0c898f92ec4612b592a3fcc15bb242", + signature: + "887066b3c3c498bdaffea72dcc44416a9183c22dd22b5e36846cf5bcea26c66137792a421195a685d1f04128e0bc470f77c2964c862dc33f8054c6a5e19a8b8f", + recoveryId: 1, + }, + { + d: "e6ce95fced98182aa89772372b95165b07c53135d070f87585a92f03eb9882c5", + m: "97a091eded6d4861a0ba57e221cb9179bc8367de71a2bfb580403af3900ecbd0", + signature: + "ef1afdc91f01118349d86ac1f2b7114a284e674ba9f302c2ff3edf365db5ef1733b2365204248419fac1f429be21127895c6b59723d98297747648eaf141bec5", + recoveryId: 0, + }, + { + d: "ead30f08160af321bd3c6bc04ea0fb30fbe78f2787e85aabe49da4bd163c778b", + m: "d7dd73fe1304fb415cc8ce90ceb5d9188b84a55eda9ad2619c4aaa3520cb1a9d", + signature: + "bf6ad9fe7cd00d0f6ae6052db4edf980a9ee2ffc31ef2e66a053c3b8eda72dfd2df70444928280012993a48deb761cde0de1d3a61d4a90315b34484106722834", + recoveryId: 0, + }, + { + d: "89adda40b53e70bd92ebbecf8a6ca89bbc27716f784456bcf277b3cf81678383", + m: "b562e894d58c1c46dfddd00c99e48abe4eb9aeb63b8b67b44e46462e932dece6", + signature: + "863eb6c9075366a0397deb3767eadc01e55b7a0d4a18a8c8e3dcb0ca0fdc8cda0ecfa7547288e136d73e852a3823605e35cc613974356c8ee9682828ed2df0fd", + recoveryId: 0, + }, + { + d: "7ca4ced4800d9be6392edbca3aa6c3fe77eb2ba66e77e732fc1e3d182fa03939", + m: "5b5e38c40161473d9fd9eab4f68b2257d4655869697e02ed09a2ef148430f606", + signature: + "182caa9814fdb5f98b9d1d733d048c4297d0c01aaa0b6eeb9fc45a31118e78221df202ef6fc53a77272d7dbbdcf02e2499e1fec593324a6737bfd0981b8de54e", + recoveryId: 0, + }, + { + d: "a6c5988edffadb4c1cefea5be4a0b4f6244ade43a55de7d00d4386095036e15a", + m: "5f6388c974180b025a721e63c5a5815067172dc3a2982391fa07cb1248f1d751", + signature: + "06570975f4fa45cbf8dd2ab50e1a1f0034980f184142ccdfd0506cbbdac560ed1ae591ddd8ac7970ecfedea40279ee49098cec39d14fd1b7e8df90168e2ac781", + recoveryId: 0, + }, + { + d: "756aec87f56dedc1d76906e4710924db1b0bf5ec949d9cadf05e19f4ab590098", + m: "96c24610964984ac0a8dc3a1a4e2c79081985608663cea5781b66828bcb5a1b7", + signature: + "aab655e7f34acf45df965f59b03f98a98b41b42d2905976fad2d3aeba26b7517591c4b27a969742118e775cd3cd3631f516b309d8550923a2844cc4e4297624f", + recoveryId: 0, + }, + { + d: "275672c97f90d58182bb8db7316ab57d0740012a402a696272b9edf2bd09ad50", + m: "daef8c2bde440160624b1be98554539659d7d6850cb06970925b5732af50126f", + signature: + "c612809c32b6e2a69ed9209f0d510465114d0905c540f8fca7493a218134c41b61d20158cb561df928323a95c90b13cd14939b56e217df3b37cb38a8047fc89b", + recoveryId: 0, + }, + { + d: "091b325a9fe8368dc90a7920a228fec4355551b5ef7c440ca2a24a861c3870b1", + m: "6f7fd85096562fe201b40031990e6d7540b82a9c8ddcc2f21a7bb9907d7de7db", + signature: + "354e8cd96e4b9dd27f3bedd49c3e8cc392575db8acce5efc035c3193aa8ed0dc7dabed63ef2d1c12c13ad4386df6b2092f60f47f672c653d1faa7f7f1727b5db", + recoveryId: 1, + }, + { + d: "2326e5551e36be63cb816b64073d9bfa1a290ebb38641a7010d57e8e25373108", + m: "9b427a9e9b4e156b5b45fcfc741d1ffaf9fb92a97b778d84027e70a15de2174e", + signature: + "ceef3385e162e3b6030f660f7281c36361d8f893b8a7f756ab62e0768d21c44f39f67daee18792a00571d457c7e453bed988742db9e7a2a4eb8377efe0416dea", + recoveryId: 0, + }, + { + d: "ca356bb6b78dc16f9c125bd831149e32b1f52636649616b1d39ffae60f5f4d15", + m: "766230c04c3ae6caf59dab595f7097ec32f62921f2cdb672b84e6612e8af7994", + signature: + "20a5894e382b7e021652a2f67321f79147859a49ca3a51af920c73542b60e15673a648dfcf8508dc576bd963fdc35870be935c999ed085abb46a08fdef1aef05", + recoveryId: 1, + }, + { + d: "6b611943bb66379c0eba557ce6bf44b8668a8c3ac1fcac383ad4f6dae8753f13", + m: "b01c18afcde55c36305ca3bbb86600e16bc3361eea366ff4f0be585c025c4e18", + signature: + "2dd72975f817555fc45bdb64a2e243867732f2b22c0910b403082079fbf7d3a60392aeaad2d3c6fe5173cd9199d4849aa62b29e7bd6cb3e65475b3a5a7f9054b", + recoveryId: 0, + }, + { + d: "7e88c160be897707439894bf53c8b21b2635db139a90e8f808286a964b3022f7", + m: "52b59d365704073422c3146ad0c97acf98b09464db8699199966860f40150a9e", + signature: + "2649ff67473ac2a16f489232afbbf3231b17bd4d10e8b4411077a7c1c7a4347338cbb48c2b16c5b06d498c6c42898160b1913966495cfc376a14949f63608baa", + recoveryId: 0, + }, + { + d: "934797705df4a7cfa442eaafebcd59d53c156ee4389e9829de79caa5833850f1", + m: "97e26ea3298aaf71d1bd374cf6fda51dc91b71a1a7e181450c9322a9903c5524", + signature: + "89c1e6a99e0b337f21fefd42bd5dff2fd9bbedc7e0decdc9ef48e8bb920cd3b46a71b4995e411a764c9a950d2ecb94f893937120111ed2bc23bb797674ec684f", + recoveryId: 1, + }, + { + d: "0c245833ca0272392184cd7fde291acb29f4c6a0cd80f0fd3b531d645894f1c9", + m: "36564593107f2ed2115c93b5461b1c066ee6ebd21dc3fe86400ca8b5c5adb9d1", + signature: + "afe2b9a66b847cbb6a2b8f5c1833b6154474ad149fcbccd5f98218c54a95c3b418058417f67b274a67e683fea905dcfa22dcd166962fcb95dfc9bcec2237b0cf", + recoveryId: 1, + }, + { + d: "8b58d572b916556d664c6c56407d4371fd7380f8f3d8d4e2504da3636d341b03", + m: "5f9c1a7eb5d9959d7a16451df87ef5c1dbe17f63514c7f0d1d3d61ed0da8ed6f", + signature: + "13474865b5ec56ff68c0ca637c0ea3a2a312ee0244b0dd2b2499916c2d8ee3a4326fa4db61cdcd144c35dce1adf2b04cb7c98eb320b55a4ee0e6d275309da3c7", + recoveryId: 1, + }, + { + d: "3c29a0d81d15b9cf744df9532109007af417d8648035a9c14f6a54821c74a421", + m: "8e2eb1d797c60d15c9f906968943b28326cd444b740b5c0fa92970834656c044", + signature: + "805efd828d1a6b0dd2d880f139f24c812d6e490b98089e423af4d33ab59452960aedcf3b83163ce308a3acb20151b945819962c68ca4ebdab0960f4bc58d15a2", + recoveryId: 0, + }, + { + d: "8aa5f47aeb18b3345649087f24eb2c6c7befab36b9345ce2085f33ab7386fdf2", + m: "88117ae52a41fe2c32989ee2f7a1f5549d549218bf3c73135531bd87744bbcb4", + signature: + "626349d55a5e07b041481b30a8a16d49fb7d24da23632fa000caaee0c06fd8a56de7840489d8080a3cdc884d5db001e29cf457690fa7aac6ce01e5f2627cc01b", + recoveryId: 1, + }, + { + d: "af1487a4dbd62e03175774368aaf5465bb7457232be36d3a7c1be676aae102de", + m: "51b0b7b7df5d47092ab68820181eb705aa7e242a262025b95aec4de303c2485b", + signature: + "a59e917c720b7a4c8e5bf8d97543fd7483f0b27925139b6a2f2d5a797a8d04214ae09e76cf0a42e96eda827178b6bc7ad65ebef250985d43056e47b266fece9a", + recoveryId: 0, + }, + { + d: "cd650bb18eb89d1c5f5b176b21cf6eaf42f68b77ade8a52a269213b6b19c0491", + m: "2d7b16870f2f390cfecf1f90ce30a5fc441ab211f32fe16ea0d8e0384beb1b13", + signature: + "1316e0e39ef2e406f5c48f6debf81703c5017d8d6886fa2453f039c05e1f32b00c7f26befce494c23a16b62274f7ba1c1accc36e6a0090b400842d5aeb49ed15", + recoveryId: 0, + }, + { + d: "f5c69cdf9715655347565426644733e75ba0776e323afa9f24f4b1c6c3ce97d6", + m: "4fc3f48cc9f0be793aaf97bea065caf10a64530dd79206bd052548e574eaa649", + signature: + "ff63961d9b0895c0563082039c0d6bcb33312b88ea0eeba3c08a95d4701c93896de6f4d0c505d2879000b4287253eea7aa4f83ad6879ae77c61b4124182c31aa", + recoveryId: 0, + }, + { + d: "078223d871292310668dfb19f9ae824d828ae2f6fd70ebf01b1b7ccfd8deb122", + m: "4391dd6c58554c8bd78eddf20295d66c9e2dc9352651cb2ac080d4c212811ac8", + signature: + "3ecbc00aabbcfe89b0305cff203f0ab6f59f08e43f527a536fcba4d2d3c1e3542722d735eef59599fdd9bf03a90a91525600d016457ce16cb1c3bbd3a36428a4", + recoveryId: 0, + }, + { + d: "dfe4cd15bdcade79d418ab3561d91dd634b0c037ec199eca77c8e8e18d4a8186", + m: "9ef3877bee7533147d9306fac680efc17518047303b66fca6658c9ab4d7f01e9", + signature: + "0877dfdc013b41b6f15994e38362a5a2959f1f59a6dfefbfc1a1b1813f437d965a064018d59e0652391a618c4ed32284a1eb598f4d7787aafc8a91d60daf2b0f", + recoveryId: 1, + }, + { + d: "6a19549eb396d787ed54f53a5b11c022feda05d610e5f947e4c3b83910f070a5", + m: "f81dd03b0ff628bb2bb3d885b0958dd7a65f5b4b7c7ac9b81e7c22351317f197", + signature: + "d3653d17321a31172c8dc6b1407cbac74c2887a2610a0f67062c6567f5d4ed1b0a5b5c3de763fec38679b2c6828342748676cd059d37c30148839cde03b55406", + recoveryId: 1, + }, + { + d: "1edb4a0b75cc1dda45043e351659861fc24e756062b60c1ff479c83e116e59bd", + m: "4b40d8cc63478bc7f648b8226255e3daac7c161c6ebf49d6a97367e00a3bbdde", + signature: + "7eb1f964daacc9c12f9df400d5acd9534d384aee9f64144d2a7574fd7b7e18ba0715c283672c590d391e1c5d0a3a5ed053632995784137d42654f84d8c00e58a", + recoveryId: 1, + }, + { + d: "cb679b55676d67f81419a99945366a942d35263820209e696d3bee19245b389f", + m: "8cc5531ed997f9a9dd5690031c4567aa37347e93c0b3389a61e532b38a157b6f", + signature: + "b9139ab2fffc6ef787b2fd137fe2ff10ffdef769a0227b545d6604de00c7ff0e2c75e57675e99327161159bdfe7c48840db94e6af8f95d924a834dd7e549cec2", + recoveryId: 0, + }, + { + d: "b4a98855acf8a762bfa24864477fd6615530d9eafee3a238afc73101b0f4b967", + m: "e54b27ab14c5eec5c38839b0234c3f03219731d41cf441edede6bb4459fada2f", + signature: + "7e26f93ba159a8cf5f44b207cae1ddbf5d1757138351d960cce14706dcb01dc17ae5561127020bf0a2477f32b7c7f8e29a13ad8b9795f6cf0dce9793eb8965d8", + recoveryId: 0, + }, + { + d: "c02fe0c95133211f027a89d51bdac7984e46b512165d78cd3635b9f2db62f39d", + m: "40bc67f082bb98180cdad5085a6e0e1884253191f1d4951be8ece264b0d6ea10", + signature: + "747e052ba55f7f45cd9f4d3eaa81969d066923ce501bbdc307d53927d604d1de2d2fb1ff227aa84bd4035f021df3e0916aa41aa65a68dec6c340011bb0233798", + recoveryId: 1, + }, + { + d: "83134bda715be96e7c8d108c63e9687b80a5ada6dbb63b1064b72758a11781c8", + m: "ee864d65ea602e17d17be8ccb6388a294d8bb1bc87e82b75504b1b0ccb672ace", + signature: + "e5bc1cf2fbad40a823d568e94e8006863c510587429e4bba380928929acf7fd6649da1194d9f89a354e96e601a336972431d1fbae1c2e2fef2600cdce8aba917", + recoveryId: 1, + }, + { + d: "d68bf0d30cd7a331bdc04fd49b3e2d996a4bf31518c3767ff863acc176eacb62", + m: "d534c1040c23558f2397a5e51fa33bde503d1091273487f142686b740e8659ae", + signature: + "d904e51ce5c0d0300f2761884f4de64c787f7a8bda91521e05f1157b48d838bd2e507ddf6027e2d17f36b084cfc14db13e865d381f368c08dbafcbb7c90091de", + recoveryId: 1, + }, + { + d: "0bf45bc2900ce19d8a1e833dcd275774761d6ee87a1607f8f0db375c371e1adb", + m: "35c84f8c6c502447d287904150f6b8ea71d970b0654015a4483458afbfa0eb1e", + signature: + "8fdb7658ba9808360e3c5f8ed07a720c75db90831f8fc286a585bd8f386e226679829f470ff0b9fe95aad5a893e5c78a1a2f1fcfa6c24e6c2233ce2da0f6c915", + recoveryId: 0, + }, + { + d: "da6cf5b4256554739a9cb9858b5a44f185d3b2901c198f4a4b4b5e6041b65cbb", + m: "891db123d67a268a030520a7fe21fd025fb49367739a4809fc05addde45a2cbc", + signature: + "62be9714a23ec1852f7413712326cdd21ea292b8f110d6b27fdb2efb7ee05ce375902c7bddc4b97c5bbb420541c4aa1a7054b0b2d595c800447eda5ef7be9961", + recoveryId: 0, + }, + { + d: "f479c61997fde6abea2d03519ad43e02ea59cfd27d5bb8ba097b6b85734754cd", + m: "faae77b5648540fd35a2f1a0ceed83d9534a8ec76a3901faf7443309c6a910a7", + signature: + "5c23266c74adfab0cf51dbb541d2e25dbd41d8055becd75dc2456e7e64672350190adec086f041c85ebd4a01dea798abe549ecff261e2a399eff151d4fb6ed93", + recoveryId: 0, + }, + { + d: "d26012c67e767cfb32f87c6ed430eedd4ee0d18ae992bbafc00d938530185f5e", + m: "f0c6f5bbb907229d2ee7dd97dafead99cb6c08500a54e7cd053c232d742e26a4", + signature: + "e38dcebfe54860d9c029ba1af193726fbd35735176c206858564fc40d782150663b91afcc1db1515e1f39fdeb7ad97085406fe942d4814473119c16604247571", + recoveryId: 0, + }, + { + d: "1a5f3856a9d799bd3f0c1eba75542606bd6203de2e287350439fe49e6371be62", + m: "2beb56e7bf20e32ce0d6ce373d4038b16cf2da086df404ee515feb17f5136d5e", + signature: + "85acd633778724cec7d07f82da4fd9aab941c9047fe648c52c089794d065b1c067bd9d369c5f70827218e5e7d3bff9dce46986fa949b9f149d8e58216baaaae6", + recoveryId: 1, + }, + { + d: "e109aaa4e68d307de2cf3ebed1fdb09f432aa9543f1483cc0f103953593ae7c3", + m: "3dfb8c3be0490e0a728a22c86f3abdbb1fabb9b93efdbd67e48eb78c120c874c", + signature: + "7995e95cfee728584a94ed59c97c33ff9855d735a9aeb4099c67069148b629243ccd878d7d0685fc44ca403778f4231ac6376d4bb19312f4feb8f3ad9437a734", + recoveryId: 1, + }, + { + d: "0e43661e0a3fe6399ac92c41387a51632b64a743edca8426589ad82b0765f21f", + m: "9ceb40d3801e1ea018901c98e1aa7c72f77792c56a971b495bd8c36b381cd6e0", + signature: + "ccd86b837d386a9a0d4b78fbfcc50ae973a07bbb8822e9917283e8ad5aa958cb4919b61a811275f33ddb4478e87a73dc798ec559469c96ba4d55b1d203bee581", + recoveryId: 0, + }, + { + d: "2843b768c5893b6497aac3bd931001aeae2c6edcc82ab543cc3dc1a0d8f80367", + m: "9b08d78ed028bde0c85342b6c2ee05c1bdd505eaad930220b294f5d3aa57736c", + signature: + "19662d47df18723a3e0503d09745dd9d249fe874a8f4e4a8524c43696c5506e91d6ec9ec2900b82ca20bf474f7ce91928ad6983b300fb9c3445669451ac7f2b6", + recoveryId: 1, + }, + { + d: "a056f5f959985efe8c5386d2782a5f8ccf36b0e5100874e7f147a2f20dab7f53", + m: "f02cda0f532abb09c1624efbd038ceee2a609acb090a9ebc16865a80c768a8bb", + signature: + "c44c619d81fc687dc8eacbf1439577c313479c0567911136b03ab113d582da262de9503677155c3c06f83538e23b54f7323130b063d25b65825350f3c8223941", + recoveryId: 1, + }, + { + d: "c10d4e3147bf27f400152e28c63888b17c6b69c5335c69a79b71e0a3972184ce", + m: "bbb827910df2a35c4d34cebef833f595ca99ccfbecfddf60a2367bf9e9a26a1f", + signature: + "36d4ce3159dcd43b30b609586e1666f999164dc5d252c903a00c0dc5c2fe618342792924f97d07e311b8484326532555ca40ef47afe44f3d8420df1f3f008abf", + recoveryId: 0, + }, + { + d: "702d6867e49299b8b120ec46876890aaed0555f9706ff7e52f2c5f342d08675a", + m: "3e21998a870eeec1bdb3cbaf948d74696b2e20a004c553ad82da8e76fce324c9", + signature: + "f8920f175cf56efe09cdaa0cfbb11fffa84875fcc88756a985314cb4342ec63b088a3c9c5d16395efbb8195d5d00415dee432d8ed21b20c1f6c1b68db1c3c40d", + recoveryId: 1, + }, + { + d: "6d6fbf1213a7dc537e3c122ff42ed33bc269ab9ec7866aa45acc57953a836203", + m: "ba4bb51f10e260cd916a5b76b1e8bf98c87fc294e2dbe4f13a16b9c73fd8c2c3", + signature: + "17c3c1b25d0efdf1032982c0af266328dce7c52f57dee5386f3d557529c9cd7e0a39a8cfa100269fa523dcec875f2be37270fe0d40ec303e5014d011c5ef2504", + recoveryId: 0, + }, + { + d: "95db96282bc90dd6df021eb385558e377429b347788414e0f162ce3e9c260e1a", + m: "717f8ccd9ef072951ee1aae2c0ab1947de5caad69a2ae6bdf1f09e6c5b1f114c", + signature: + "97bf08906dc434a4de7174a2d83192774e11815325e96ef10481cef6278b65ef2bd6d69d1ca3db81169bc33223bf95a99e402d2d9ec0dc9c7df377ec48f459a6", + recoveryId: 0, + }, + { + d: "ab1d0b88652a7d411d1397400dc3afa10c8dc5b1354d24f5e0960c4e623127bc", + m: "7db122de4166789ffd29075ab3c981207777d5cf64d0e2646099c75031ba441a", + signature: + "2b2795239cde29ea06477b816d989d4d39a5ace7f2f3df2cab4ea5ec611e58b53ded2184f45b4ba3c5ba7627f8ee02edfdc270ccdb2f7f5235193eee5be46752", + recoveryId: 1, + }, + { + d: "5d2d4c983138e28b9030ef47e2fefad35f0c79ac579d7d97e35c830aba668626", + m: "7b5a816f5b93d065e49819725e30866e9f2f89440429d42223dc6c8cd63f448d", + signature: + "605fb3eb2a83d5c5b1845050b3adde20feed4b7944267c39937f7e70f2d077383c3f35930c77170fb7175a2194e3ee3ca287ac9c73a43679f75f00b5e7f4336d", + recoveryId: 0, + }, + { + d: "2e91146add30e2fb7b6072502382fb86b23fc371474f8d91795979a08d68eb94", + m: "96ec493751f732d839bb7eaeb10f5867299bb8894a04237567744d58a077a455", + signature: + "b28598f440f4cd385d3f338518da49e9542a75b332cefc84082f1545b8f900cc442e07123e22a8f9025528af855241af48bbb2a4d9b69ba9b24e5c52c1709077", + recoveryId: 0, + }, + { + d: "93153ccc46c792289e315cbf5732545b602a5db596741a7fad8e5c6829aee7ec", + m: "28952bc546c8eaf7d6a0de452ddf4f93de22c7b4a05dc4142b03b3232f2b539e", + signature: + "3ba516a5e7de9e1d5cc80fa64598d6a4be31b991af44df0750b2f20bcc64a4506ccf106a7c16f328f5c60754bfad98adea81c0093a01e21fda3a7e7002613434", + recoveryId: 1, + }, + { + d: "5ff3b8e96385bfbd419ebf6b4e57e46f043c76e5c1eafe907829dced09dc223f", + m: "853e32334b102fc527a9b6c599054e3602ef8e49d88727c78118a51b518acaa7", + signature: + "a0e9b5655892cf15c515f4452ade7a71bea6e5bd81b409c6a18352365cd3f0f904a709f5f13d8b11bdfecd0656c4680b34019daa380da0ea17442ae156970d81", + recoveryId: 1, + }, + { + d: "7e8c4c0374929d19331969482b504a1665f655e1a803fb3248b2d22de095a097", + m: "72129b15cf752574cd8e697e2eda391f21c7e358a263fbb7b5b030ea4d18da49", + signature: + "6a7d285fd910d192803cfad23dea24e2fbf8794dd7d78f62ca8ddc495449bba416aeb7ec45d349ee3b95b95a320ab7e94b9b1b086008e8680f467f988d831fe9", + recoveryId: 0, + }, + { + d: "fa68245829ee9912f9060e446882a257d4946750d2a5ed6de1e5f8823d3e2f83", + m: "3ebb97d1e644d974e11f592e18eb2ccccd412e1b42d12940119183407418b414", + signature: + "246c603f455e92af4895d974b661d94bd904f9978830d00396331cbb93a23c36108fbdc25b41c1dcd4d8a764b93804e0362ac27a36b179d6ebabfe3d0cfe5180", + recoveryId: 0, + }, + { + d: "52ae850ef32b72fddc7fe3f9d9fc2297bbb44dfc669557bc6f7c44d156e005e0", + m: "f49cb5d0a40f2ca0be46c13838f086579932afca1310df5b412be46de3d99260", + signature: + "d1b7d025c58b6ede5d5423c38d09501c69339ab5a401052cb73d75fae3f9651b7282da54c2abcd57ce8bc67884e659c6aea3d10c3d31ec18247d06f43a5858f7", + recoveryId: 0, + }, + { + d: "f64524a5b905c5d6f060089eabf86c000952bc47ef4c28cd6d20af84e0bce548", + m: "51ef1f0a3f16cfcbeb0f1648e0efa3f8474472fb5f92cd696c9f05302cfb44ac", + signature: + "bbc70cd07399020766cf92182fd790a55f24958606c1efb1dad227ce12ea1e266e3282525beef99fabbaea6314326de98191f18a99779e712909b53ecc5f18b3", + recoveryId: 0, + }, + { + d: "2ac3098f55f9d798b1fa69dcea16db6e3c0f69c8d16b2624fcc5dd0d33077696", + m: "8d0909084d3998d164292b94bdfdde887e1bf3c62a27bae1ca352e0a0450190f", + signature: + "d5a08d48d0374f3a88af750229881cb23ddb93f3bba452e9a477f0be1fa190fe390592c78aa3e3a4ae016c493fce87be290488fdfeafcdbec607944f6e8962f2", + recoveryId: 1, + }, + { + d: "445865dbc74f552451d8fd8b2a3d39da326392a56089f634d0bb55df34345d1a", + m: "7ebc5bfc278a845780ce95f02a20ea9294f509574e97803d5f4658742af37bca", + signature: + "0a1d7271f87078d0813bd7e8e2bfd40c20f1b39caf3542d62de1af966a2c01324eb680f37f86ba6143effe437a4a52d1a184112a579fbf4c4124f2fc452360a0", + recoveryId: 0, + }, + { + d: "d188ecd9b79a4d746005e159926bfdbaeb461bd5b41517a703952fcbcfd3a7c2", + m: "35a8992e0bf238aae8e3af2bcddd829d74adb125597a88b8094d0dbd8019066f", + signature: + "a6fd2aac2d11a5f302248496a3980575784ccfe2d26434331a92ce6ee76c3aa50616c0ca970c99b35ffd116951c62ee053642e037db3090fb4006b5aefe99ef9", + recoveryId: 1, + }, + { + d: "de7deb4c78b7327f45ef6ec6f9c2c9841e85dbc546ce5c0e3460bc08d6663901", + m: "27378e705e8280fcb8c4e44d5c96009e0ecb67d13243e66f93099868119d4d61", + signature: + "d447e0d512637c489e3c3fbf47737d07233e8961539d42c04d44f3e55525b1ff070245449ed94830947ddaa84ab13b945e294080ee601e19e3e211540a312901", + recoveryId: 0, + }, + { + d: "86efa416a37c1f9ad33c822180a22b7288da02cba08269d5a96cb8effb0ea119", + m: "738b312a401921c53e6ffd9b648fc05eeea2a6adea2716d078c99c4fdd4f1d22", + signature: + "806ee55c283443b2bda6a0e52a80b63747554f01f784f9ec3efb71741e3c7fae6189405381e8fbda94f7fea3a1def594da69b54e8e018ad826b4230e8be6bfd0", + recoveryId: 0, + }, + { + d: "28d797838a767c6938edbdfa8082fa3df3933ce18b47f311d9191611feba2c6f", + m: "96a95c1d7564250977df759a06f60a564fd957d7d360cd6c630a4b01215502d1", + signature: + "43b729bc532c0ad4f3e308dab50ebf11cf2bbf46393df2d7e8c49aa1ec1e7aa826de0ac98d4564ef214380c86e34a8a6d31cfc46c562ea6af483ac67b4060184", + recoveryId: 1, + }, + { + d: "d827759401f5fa81501bb53eb97294162f6cc7e0815107b5c8c27b11e0fab764", + m: "529d0ffb8329e2e984526ef3cbf8ad1fd359c58c4b3e74346a47e537bdda856e", + signature: + "b7611e23baae93b66b5afeda0b6d614a7f74e3abb580579842c39629b7a210106d746733711c05046cd3a175feb0796415ebbf98a51d33ea0204bb133e49cec3", + recoveryId: 1, + }, + { + d: "f5cd1d5758046e2d7a09ef2151739f1b888a9ec2e09714124b4ccc87572d15fe", + m: "b16b95b705482a456cb4e3cbdd77b0491a0c2c971c7c7d8726c096423b04923f", + signature: + "50e20a29a7aef6f6dafe2dfb8467da35b645296e43197fbfc573f82fddd486950d1fce9dea54455b338c5f8e1beb8c62fdfff2c55890824aba633166f1505a88", + recoveryId: 0, + }, + { + d: "d2073fb0679ee27d62cc5320ce157575da4932205d06f13876d4b57dc0a0eb36", + m: "7e6c20efd84fd474463f4f2c564b0cad87c5228b1e440a9d66a4c9e8ea516ac1", + signature: + "8eef0300b6231745970f1d0e88c959061eed0eeec130c2c109447b6d317e75493b1d89688ecd874eac47adceb46d418653445f21bdd6cd4b51b34858c61c3e70", + recoveryId: 1, + }, + { + d: "15d745b5c2452a76371c9c819a1f63ed917da11deba1f459aba5be150cadb91a", + m: "444a346c8afe756b83fd3652d5b9944ca9e1d9582fe058254eacb2b7a551466b", + signature: + "4aab4ba7fbe57e374f017aeb08c937e70ac59eb8b49a81f40dffa06ea253bcf70be7d26dcd97c8900f8228aa16f3af4e5b9f2a2f41f22ba01209ddce25be1744", + recoveryId: 1, + }, + { + d: "e472079f95d408fa4c5974d7b43c19ba10dcae19db878fd722e7cd1c9f1177e3", + m: "6b52972afb8dc868fdd6d63be126ba0f489ae6221453a1dab59b77395dad620f", + signature: + "be260dffc5732bb80debccc01008998ed441442d0ce7e9481027efe9683aedc72e9173da120fb34c30e611adee88fb70f33b1e44c04d50d3156ce69fb4ad44cb", + recoveryId: 0, + }, + { + d: "4bf12edfdfbd5d1974e00c4ff0f2569ba9c4075d5f912d91a1591416a7e52273", + m: "8abdb8046e216de0169c0bacef9372373fe09a1af5b878a3904c22cf17a4b0b2", + signature: + "5c66c9bc367d6da3c4be442f3cb096aa2742b1dffb5c8bcb7d314170141724ae07f4008b32286c22eee4200b06a1928cb44053248c7e691b6f30cba4b88b7210", + recoveryId: 1, + }, + { + d: "8fa549efbf741feb1bf048841b1393c388e14d34ebf0723b76a52a2fc451ab0d", + m: "bac535b86c640061a015bb03e85563acf1e85724cb9677383676b55a37434b0d", + signature: + "44500806aad07efdb4ef80d530205adb5c2d40af91d619d5148d471cbad9807b0da1616595eab2c37d2a4fd2084bf867159ab6342264b20631ac841a5d5eded1", + recoveryId: 1, + }, + { + d: "6712501579b08eb4ef01549dea0b710460166f8c08591b7c5afcc28765c67058", + m: "0438b1f7d1cb662a11783fcf2af0b4b44e813e086b7155a0413160405203e395", + signature: + "c4a76b2a0824f18d4ba4b86ff3580eb039b31f652bf0dafcded85e5c5a2ee2af254d149d3226f09a49518cea832a848607e2510b5840aaa32b4a71299aa0d918", + recoveryId: 0, + }, + { + d: "92919944f0012d8e945c601d463782aa0927d5374c941b2ad82e426f434a9139", + m: "8634c8627b35c015b300565cdd83e685dcfbfd3c0a01e945be336d8c08279bf6", + signature: + "1c05931a4f6832021d01147d74597d24ef54af0c38afd4271e92b38363ec3e08417851ecdd5bb535fd991424e4c3e40d230ad280bc8c4e17525aa33dfc369570", + recoveryId: 1, + }, + { + d: "11aed638752aa6f5c8f48d8473982bf43a1358d88b58167af0e6b8ef6c6a736f", + m: "b2e9bf405a20cab089003938aaad3316bf28475f6834986cae4ad9b77ccfb40c", + signature: + "a332bc72a5d8160a0a578457032ab0303d47a5ca3417a7f2aa1a821dff64d60f0adda79e90d6c3ba40a6ddf368e40e8148a3445c53d4291b3ddfc969fd767f62", + recoveryId: 1, + }, + { + d: "1c5781fb1ef6044782b8b81d61103497eb66953e96074825e001a260237ef938", + m: "6d5b4e8d65e041fcea6ea81ca69cf4dbeafa7a7b505ad42b339a9253712ad21e", + signature: + "3f4d2e9a36b6539bf99d8e57a03b6ccc695aa7976fb8b73a2af8bafd78376d6148121d7af3fcaae8e149e5840258c86f7f9f2b38131d91a4271f30f910c3c761", + recoveryId: 1, + }, + { + d: "16b459154963131bd5d4cfd783aa5191c9e370464e63192d8e88981d1dd732cb", + m: "21a2b314a024909861fa85c8f7357cf955e32de0f2e912dd70ddbe2c9d7c227d", + signature: + "45d6df3217db5bad2f1b6d801f9ee8760387de55f16667316e7c532335cccb8653d2d2cff9df56a5b6033a585c6309c60553ed9ae3451e5c1f72ec20d7552e79", + recoveryId: 0, + }, + { + d: "1d6d07e513e2dbc76912f6d035d9f960d1dd9c70fb2e9046d26426bb75f74f6d", + m: "e4f49a9e9f48055d51ef091576ac2a825807ea259d570c26243815f9e3a0f7d0", + signature: + "3fea260d7dc8292b24844f5f7edda879471668aebf550a90427c28d044e88e0413f153003f342b5c9e6e8e9057ace83595594ae489f03d0ce568b4ec64160a43", + recoveryId: 0, + }, + { + d: "b4eb3a3e4ee51bed5391662a384df98161410a0e7b4519fb42b2e78b81aaf7cc", + m: "ce2f2b83571cc5568116d53ba582c9f8cefd2555effa2e47ad27353886d04c26", + signature: + "94ae436914e0b0d714698e27d91ae1021d8d13a596ecf9de0245514cc20323a4498630857de1ee1de90c512203df61a212d7454eb5c80a8599229860d26612e1", + recoveryId: 0, + }, + { + d: "ee204398f7b95865bb888715cef16b102c72e898ad01627c7ca6c378bb2c2b92", + m: "8344999445caf688ddb21fa4eefde6ee5728333510862d1e05b37e756c77f599", + signature: + "2bd003d6ef7c4c3e10b39637550e29d15f108c399f7201298d3a71d181ac4d42322b21da4d4cf28836f4d72b098823bc7717ee5d641386c179a764b5579873ba", + recoveryId: 1, + }, + { + d: "f434930ffe92832901d2bcea9932ba08f4608b2f4539128022ed69b9f12d8398", + m: "89108267de8cec78ac5fd24a2ec7945771cb3089d74679cc09e7b53ef4a6d9c8", + signature: + "5a7de70986bccfc47b249a095214b4bc9d0db9d41b01d4ec4ba9834dcc830992633021cf7287c942c761f359620d1a634ef3d4fdfd7fd14cee26c6a77070d705", + recoveryId: 1, + }, + { + d: "e3ecd6bd3a548b3416937e2d4f402c3237cdfa45f6505c9bd4160ac761e0030c", + m: "f041ddcd604ca264c8a974cf687456623e004253454bb84e6fe1b657bb10c4fe", + signature: + "f32b56995a661550a6f2690216fe39547eea8af6b3cc858bb84b3506a48ec1d266422b63ae6b1bef8b6a76b4f313cb28723a2b113f7b137d3a39a8e7b4982e83", + recoveryId: 1, + }, + { + d: "89d9defdd58a072d6fcf2f84e1313a79dd9eb15259f6bb27ded1905e422a76b6", + m: "c1dd70bbae0f52920ee89cb29ef488ad18284c49a908c7e2284ff096ba769015", + signature: + "833d316d76d093b4bbb64ba31c54eeafe726bd4cbb09bbfcb7bad7c15f42651e51fc5de57a55ee5ca4c13f641af87eb62f4eb7cf8128286e29c50180bac8913c", + recoveryId: 0, + }, + { + d: "b99cc3e54a7c7865e15f3a69c5932aa447f0747b1328ca1115d40750c2a72085", + m: "ebedd9eedd8bd6a3c5a7a35a4b85360b082ec268acec344d857a7e7b07297041", + signature: + "b6893d1ede5d8724e96012799b53b6fb6843c691c31ba335783c9698c3f9ad300dc20d1f467153c92b3e7215fd249ee7126f535d86786096e3a8877593560b8e", + recoveryId: 0, + }, + { + d: "ce54d665f78d0daf86dc2d0a194d87ae37a9d54b23fdb707ee5a1eb9e128910e", + m: "39a4d59bb850f1406d8ae844be6680eee794d4b3dc9d84090ee8768f5475c893", + signature: + "1d52e6ee6917e763d7d5a915baa27064c66d64aca578ca18a56af7ce7a52406145f4012a528a54dcc76742bf8fd8142cd0fc6bafbc045ef84c4a94a0381f2e8a", + recoveryId: 1, + }, + { + d: "c45c20026547ae96a79c8277a45a3a5817f05a8345eb85ecd79b6a33f122029e", + m: "ebe80f35c7528e331940c625731cdbbf7f32cf844bf916fde4a947d4bc5b1d54", + signature: + "00674f7dc5370a61d0d1c8f98ab82c0c1b5f920eccd15f5785e4bd23b296c29211edf17802734e3dc603861acae05176a515acd0244fe6abb7a77651abf1ab4f", + recoveryId: 1, + }, + { + d: "0ba7c53e4e1094e265568dfbaf016797b95706e4b12b35b96f991c7707fb451b", + m: "229f8d4f43bf37cd3ef119e42965bb9bcf482a6af5681dd558399683f1d195a2", + signature: + "94b7e8ab84eb49c51f885f6ba32c2b40b3740bfbb1e9b3cdb4dd036d461a444b72f7ffec9e80815dd162cf2d109463301fc5e389048fdb1f62d809b0fdc5eb7d", + recoveryId: 0, + }, + { + d: "14f01584477ad58ae769df48a08b098715831634b2ca4c7c1057426eb4bb084a", + m: "fccf69fe9c0ec4455dfd528321564754e39f259dd89de0e357b5611b4feacfc5", + signature: + "fae75cb289dfccc0a9df5b248317ef9d3867854862f74159462c7fc8e861b2971ee4db758cb6f235736edee284e20bf6ae82eed10d5799f1d74746e1cbe5499d", + recoveryId: 1, + }, + { + d: "3d064d00fdb4699ffa4b1b2ef3c4bd3f39238e0bb46c179c60dfd1b8e66354e3", + m: "f421c0f4547bbf92ced9433dae0299292df50b7a0b8a83814e5e6a9488f2c362", + signature: + "42ff94a6e448bb7ad0279950e05aa8f0273f032a4b519f4e9a68d17d32d42ef5016d3b40f6f4cd39c056347a6a742b38ce7918fd54deb54f56eb1862e4b486e0", + recoveryId: 1, + }, + { + d: "7678e4d4fcdef3786b236f7bccf420158cd77001a8a2fc7e19cabf85e9249d40", + m: "652a2782cd6282b843fa2a3c8fb8fabec05365d232b5c1a2aa7b02acd734486f", + signature: + "53c4fa3460f032e1b5a23b7e3963b6f1f034daf8c97eee10cfc315995e5a48da21122bf137be25277d588aeae7a2549f77a3e8bedbbd4fdef96a8724e27bfd5a", + recoveryId: 1, + }, + { + d: "3230a2e65ebc709a7058c33c1925a5610c52bdc8df9674d815e2acf3045a0397", + m: "d9793dcc297ad4887eafaf9fdaae5dda98fb0bcf752a524502377e0eeb6685b8", + signature: + "00636cbedd4e0fa58afb79d974ae42724e4179344896ae746a76e13d62fad07d0418f61bdeab5c75ede2c75c144173134aaf9af8dd837ecd601aa850f7d67c21", + recoveryId: 1, + }, + { + d: "5aec0cc2626ac1b59c209a11e33a241c8dfa079e2c00fb12383b69b33db63fdc", + m: "d263ba867f493675aaf1c86dee363e2de7c1db8ccd8e7a30463c1f0706fcb710", + signature: + "a0302e50baf579048ca98fbe678cb6da51d0dfb29ec696a47f4525e91402199b7118b28f2003d0518afdf9295cf7307009d4ba32504f75ad19b7c0ff7f018ed9", + recoveryId: 0, + }, + { + d: "c694e0506e30278a448285db44655fb3b1860417f6020215aa201800aa5b4754", + m: "a6a55c8c00deccbe3cae5d79920a9db018fa703f3b65ad1ec7d12eea38cc8232", + signature: + "fde367e19ddc60cfc5ecbe3540a347f1c8a3bf7a24a0a1f97753f13db36685da050f3b926c5990e5e1bd2edc1a8284996a0764e68174dc686d74ef5f764d06b1", + recoveryId: 1, + }, + { + d: "fb8cf036be14f23a1c529629721f83a91e2c6451e1f74ec7573eea468e3f2076", + m: "0889991fd78cde0c685f86376732548dd2bfd6340da7897dcbb34eb6df7d23ee", + signature: + "347cfe44657396732cce6d7bad1dd60fc3812438ddcb47724668d7db1f1be07e0014d0c3759fe236b92db7fe516169eb8112f547870d98574af019e9bf6aa38d", + recoveryId: 0, + }, + { + d: "b810bf8f814d4414f0ef21254ff119789b68fa0c9a1771d41e6a695b7a0ff292", + m: "b69d282b4f08a1b098c82cc2f0cd75412e81feef9d396567ba4f94cad3f18486", + signature: + "e1a0838841b228b4b11fcf518d9e3d1323f266cf764d33d2a6e8a473c358d0725187e0f73e8a88cc7c64d90d242744f49907282e7f804efedb2078d279ece4b9", + recoveryId: 1, + }, + { + d: "f77fcac355d61ff6da90c00674d821a45710fa7f9c51674b81c32511d0a444de", + m: "54c425e2e8f080eafcd3f6c1d2c492a13b2e2124561c9d6f848431002d886f27", + signature: + "79b8d64e7c2b084cb3049519bf3c6e9fd513ec33b7c09c7683bea9801005a83677233fcb5755c2fcd1490badb517e4e52c68e0749bd3b47b8a18a617af10ed19", + recoveryId: 1, + }, + { + d: "884069e501e293d7f8fa56645b37830dd698327526e19658c9c1e2e72b159582", + m: "5b11d64a43efaa1cb7ac43f72227572ca4b806129f61b2ac340a700ce091568a", + signature: + "30973bcd03dc3e2223da688f776ea9ea7d87086eca95e45a99b4de2a7fbf8d5b48f6ff11e2c97c3dd22aa03c9fa60eb6a4151e0d618179ec6275ac2f1239864a", + recoveryId: 1, + }, + { + d: "1170f57cfb3dcfd2163fd896dc8fac3a827349d13b2fd680b8ec3f9738e5826f", + m: "1699900396b04072905617d7e5cdad55f4c763995a7f6404022b6bb021c5f81a", + signature: + "4b62a94b3975ab4b7705ec60d05684209c88b9c8fce50929d7b205ca47b08d527b09e972445d097a204f56130d8d8b4915b94857271eb334829d0af2fdc4e273", + recoveryId: 1, + }, + { + d: "b6e859e8ac5e669af5c681a2049c1c2740f517092c9a8acec65ec5129afef850", + m: "1d30ac6f37ca91513e3ea97aabfe9c3ecae04ec1df811290bb1a0c059dc0e7bf", + signature: + "c8ff0030ad6347939c768283675ad6bcfd4fdee41e42f4cbf5b0d04977c383a039877b491913d72f274618213612b46b25fc0f57ecb6dc859a9e6071d76c045f", + recoveryId: 1, + }, + { + d: "d0df32295df30408e309282719b37d8829e1b17ed195452017f6f58d849779fa", + m: "3071ea78f882289a182f507b1807dc8b20a149e2c9a7c65aaf3312faab858130", + signature: + "8c995c1733ad21d6f98baaf58ed898dc7cec3de39845c5acb92282b0d70c25601762fe7548a13d1c70bdf2ff9e23f16f27e2823ae6a89328b4018c03d1a2b345", + recoveryId: 0, + }, + { + d: "2058125ed192a872b87726f034d9b93151897aad75d63bcf0837a7c67bf50682", + m: "0ca2de856fea794e484b32e1227a977f2a022d42d3815693ad52b3dbe82cc58c", + signature: + "92ff2784d90207df9897e4678f48b7689e893ef5721e9194d3b316880b7168ee3da32930d1b81e3032a3cb6ae9137ec001764796e42d01deff7935e93ffe6cfb", + recoveryId: 0, + }, + { + d: "a0dd66b7c455708563228f84e0bce5fbaf5ffe440a3f6bb1c52d25d440e3754b", + m: "d24f1237f9ba3e4f6c012c7f0e14eaed00a7288a429b6fb80c73ef4cc0afac54", + signature: + "6e2fb0bf26b60066ca08225c23fc3e058196c6b2fce7ada0cf94e7c6aff6bba04ee1607f9e6bbe5a9df7f0f56a1d37d541ce580fef501c04d283d61f2acb02a2", + recoveryId: 0, + }, + { + d: "51507722dd2264f5200774d112e8cf3350cec8201c93359e049ba5a88c3386db", + m: "f989776bf42ff5be9fa68d867566101630a6d448b056f3f4acd734d8181f0e75", + signature: + "128dc1d0e3fea1d249ecc5a63847aea3408addfb5da8c61ecae37fb3ac4fd12f14ac0fca6c54325b0de32fff2019e0cec81ad68dad5d34680cb9c80ba7dbaf77", + recoveryId: 1, + }, + { + d: "e57611be3e2dba64df80a727109d0b88ad3d3e055ab0ad69e198d743ee7a50e7", + m: "b0b5e74c9c1fbc311637702bd13bb3cbea41ba16ae793c48dc5992dcb7153549", + signature: + "979949e71a48a89709f12c526187b49ddb1095085bd6bd9f6b5e40ec4d9228464bdd3e7149449cfa77dc2d9cfbef8b0d737c4be0f1aa3d3bab4a9e5a13114fce", + recoveryId: 0, + }, + { + d: "60a511e10fb50ea510dc74328be183c368c1cf1fd2389f0f2140866412e34fd0", + m: "350376d5caef9ed3219975d3e56a6146574432e996d6a6eb8e8e9ca59bf8b3d1", + signature: + "4a80111ac07a934e6791f6992fcc3e70afc01e56ad1a50632f6e77a682cfe48f58001817bae1b9fe2e77fb13aff4ae07c7fa0888ae879b7ac2b5b90634904148", + recoveryId: 1, + }, + { + d: "8435fa72704265a1c09250e9c111418c50c6bdacb4aa95dce6246bf38830957c", + m: "0fb64cf335b8b082bd0a7951530c3e2b5ca6c96ff894be33ca0f2675f63002d3", + signature: + "43946a4451153ef383351d03c82a37866d61510571e9c8b3d821c612642f615d7ff6e5dba9458782257088bd6300adccb0407df3dffe756dd4614c94436a88ab", + recoveryId: 1, + }, + { + d: "fe420c87beadc13b00625a9fe46465b17a939eaf5caa4521877cdbfa6c4c6d9e", + m: "e9995a31c84d83f2ba165aef2cc001627afb43a1553123e8f696904f1d8ff0be", + signature: + "f54adad09a42d05596d44db4d67b8224feaa5a6a53612c84ad700b1d4104b7b27772d8b7b828a4024d582ccabd886255f463e264b6c40e8996588aa87d5bd439", + recoveryId: 0, + }, + { + d: "e3c186f7a63573dd87fc8b4f8f6f0b0c0193383af5340a6ebfc7cbb1075e7e66", + m: "a551173b4ab91b6c291b2e77d02e9bb22c98d837575776f0fe678b24984db6aa", + signature: + "067681125bf8fb6c501c3438759b29f23bb7d633255988a23b0f0ced1ac0146e570f81e24dd6b836a58da6c0f8b52984608e3aa3da76540d485b266115c43a83", + recoveryId: 0, + }, + { + d: "0f5839c359119b77b1b6eca3025b73b89e8e4ed3afe47848007e25fe357722ab", + m: "12436049f3deb1b7320d8a527a3a02da76adc93657d7b31420743be3c6d68373", + signature: + "99ed05c690de0abdf54543fe7613fd2199eaf7d0fc9456adafd0c0ce0336b0777015d347bb15d3cd1116c798a53e20a5c1b80326e3671c29eb8d974bdb5bce72", + recoveryId: 1, + }, + { + d: "678ce6cf04f918452674d40f087f8afb33df85e444e87b30d52bfcb68f96fbf4", + m: "c875dd851a1d8b425ec865e6e3e5102a6acf799e9333ec79f9f66757b7b8df3b", + signature: + "440e696f98b734383869803cc765e7f5b13341a953344ed03a05b2d6afde85af5efce26a283db40ff469db8b2fdeba244dde288dd1cff4907ac6109d571dad86", + recoveryId: 0, + }, + { + d: "bd1c92e9c967d0c64c5b5e7f0cb605d90bc77e6ab51dd3b24710698ce9be39a6", + m: "693d6f47d22214cd94f0c9389409468dbd0f5b37c7d1394c1643cc2fceee3c80", + signature: + "dfd56d206a2a483b76917e1acba497eaa11b8d0879ccbf64f38efbfd062c64890cc378498c121dbd54df3ffca1d2214293d5abe931e80ea5dd662ee3d0d8b079", + recoveryId: 1, + }, + { + d: "322f3af09a0f86e2eb5b95259b4b48635fcebe416b9a9a2f60c5c626584189cb", + m: "101e10bdc6ed438aaeb137a1f09f99bf4b8281d8c34d071fa1e593047ab5d496", + signature: + "a43da4ace11047626a84fd7ddab214f6e748af4839aac88e7ed3ecdd9ff553620d61d8984ebe04fb0eba633ddff986b9134d9827de6e16c13b70a0cb704e525a", + recoveryId: 1, + }, + { + d: "2c7e789593c12c37a977182744db4eeb80b78fee9679bcfce721303c011f9243", + m: "dd763cb91207b61a29eb872ef41f9215aa22f562258ac71fadd54af00ff654e8", + signature: + "c332da3fd5a12b186df217772ec456b1f9ac995d668a737e256808974b3e945f03ba244e10018f9587e67cd9a6b3a8d7c293a8c7a78dabd3048b248aefb52629", + recoveryId: 0, + }, + { + d: "c3e6b2c8357bbf10c1d25b2c1fd8b74742a1638c16b502cd1d6f19b30d392556", + m: "df2ddda4f68890a287d6e70313d941f3be767201e08a4b28bee6c64742600bac", + signature: + "69131c5e90e3e33549b242f103ab3069ce5d7f8fb39269b5f4264bb29aaf3e0b7ef6c64ae8780d7c5c04272285f0a0f6ce511c32a8c7374c37f58c60d2f9e31e", + recoveryId: 0, + }, + { + d: "675f2eded37309059acf3ddec5f505d418c6bbbfa54a1c550c7cb5a22647b11d", + m: "aae1107f5d48f56dd5f533b1f19d8cc8bb09726135f01b353241c4e266496fac", + signature: + "96420cd3a64cb8038fbcd44eab43cacb916fc98802c62e6f7534cf63dbd89a6c14d561176b1d3e468a1610470edef010bf72ebfc48155dbab73c508f73fb15a2", + recoveryId: 0, + }, + { + d: "6fc5e799619cc09fb3c64eee0d984a510873e09174c1561134874e2d0820fa4f", + m: "c5b3e0c50408c1ec71f14abb49a86f3c285ab0f0789737a01d48f4abf11bc0b7", + signature: + "0a7c632978335c1c8b527ae7e3817eb80568e4b7dd0ff150afea3bea93b87a6250448d480fb76742c48e96067335fc1e78a1fa3a4788c3a2904fba18e3eb8ee9", + recoveryId: 1, + }, + { + d: "b00e7380cfb031c19f0343f36f00415fdd34dffee2f477dc6eb18bd1b130179e", + m: "e384de1ca9ef5c4567574e753d103df46bd41b366d772f5f348e07d44ffe7c51", + signature: + "2e175e713137c8ae21492c4e68ff626cb810e9d5230d26412ab0d1ef8d6e4e0e39744c29c958a14b085adc350fbf8f18f41a13cdee3675b91cf63d33e7cb11d2", + recoveryId: 1, + }, + { + d: "1efa3a6a168d5dfe9a53b768e969f84a6cc7bfb856b363e254fa14e2a017c701", + m: "e28f716bd6a21365cff303d46f93528d1e5adca318bb086eb84eab01afeb1e75", + signature: + "a50020b8e72ebecfb2b5c8bb4704d3645adf8130350953305c771ceabb946fae29fa6d9d852c2a0cf0e2021283a4f2d0e6aa709f2cdcfeb2834bf255cd58bec3", + recoveryId: 0, + }, + { + d: "f4d0a113003c39ddb62667d3b1bc07b5cccc391d9a4541203a8b47ced4461782", + m: "d1833bb0ee5de58fa451ca61d5b10ea9d4101bb165d416f4b5892c8d845a6206", + signature: + "3b3ae5073a5be494ba8d730c3ece39cb88bbdefccf82bc749071123e2891afc41a9f759e4d04ad5def03a88b82b028c5f49fd4958899fabf4e61dae28ec65709", + recoveryId: 0, + }, + { + d: "88cf85163a7e2a682850cf35f17c09117fe411ddc23337fdddec32f34d0ddd56", + m: "42a84dba119a5ed39f8403141703204943032418e9bf8a93944728732d1ddba7", + signature: + "b01ab39b0b109f44b313307648977f571dbcfc92d45676b7d5eae5d6a3a5a1ad6efd2a3a0453718d2986f7bfb118a89603f755b7bdead6c22b0c1b29eff368b2", + recoveryId: 0, + }, + { + d: "24638693bf2fb9edcb273a814f04da075bdeb6736da7d10a776248e278526b83", + m: "e150844e5ac6f76b767076595b543f722246ce1260972f7df201e351919e2a9f", + signature: + "aaa32a285fa82258bdfa22501598e650d9e89badffcf11544c200b65da98130f60a138df75bcd03f07297deb59ec9c4aa179962075a5346454ddad35e0879219", + recoveryId: 1, + }, + { + d: "f3a5c07d203edcf6206ae939800c66b337093e6d8713ae721cf506d096de2f9c", + m: "99215bce0c66095aca7ee58251cc140a4ac9b9687f4da1f93437cccd109c637f", + signature: + "724cb57cdad96e648de1dfeaf553494fbf5eb83e402548bd3505c0450c4494b87418cc5b84cd64538c7dfb754e627a060eff32327cba2bd5cbb050f5fa12cc71", + recoveryId: 0, + }, + { + d: "3a3a02c077368ff4a17876acc6bd7e5a91e0f9f58477e7d9cb0a967c8986f0b8", + m: "67f026932c51d4bb342ff1f8d0f782a05d0b66477d76ae40c0b7a3bf4792feec", + signature: + "928f7d7db0dee091ae3390dca855a16f4f26ef414163d9ba4ae7fd92ae84ebeb0d48568640ced0bd9a7f48e26664342727785003bed3aed9f5ed7929632e204f", + recoveryId: 0, + }, + { + d: "8193d1570413889cbf2196d2132e648ba99b5902c7329ec48f3a2b1a91014f33", + m: "1f7030a5b8b966bffe412386495b88f3b9ed820d3a5ce70ec4355b060075f382", + signature: + "e672e428f59542feb9cad65df26cd31a1414c68ef645e8af72caf5a12896421219e78640d5d9f1a1b78026219de98ffd3257934af7da3b89bbf5b2d4aaa61a3f", + recoveryId: 1, + }, + { + d: "ebb25b9d7d24e33404fc1483f6d779dc62b5b2c647b13e3bf4c464f7a1b90b5c", + m: "e81ae14d7ff58f8036e11b7d9c3d220557e2186e850c05a74e981acc2d8e97de", + signature: + "a7d6906b77a6945ce87db3a5d4843312bc3561c5b955ebb6cca8d5f6b68ace07066a870aef12f947b1369929e2872ae4813d5226420835d220c6068b832e6ac9", + recoveryId: 0, + }, + { + d: "405e9caaa4a9eb1bc60ae0cdbeeebec08a36ea75d3731442692ce5f054de433c", + m: "f0eeab7c871c81b4e6a7121d5b158299b34e74c7d2e1827752ebe75fc8b4516d", + signature: + "100a8889825d6a6d897ee31e63c86531da87e9f138c8821608affa59c8ef95454f16226cb43169dfc12de3cba35781fcf21d8600ed8662362d59a275b305104c", + recoveryId: 1, + }, + { + d: "620801827c7e949068c607f159eadfb290e26343bba13f1de1c0c078b3cfd691", + m: "9b45505a210ceb6a8cd2f7349ac42ba8f621c7834f7c82f50f055cc0e3897a6f", + signature: + "cd8972771e3456d25711de80f5fa17995581cddc9c9ba4dac2643bb8d478aacd13bba95456d5b6dbec80e0f2ef12d40e480ff36550da1e9e0e00681013da3e45", + recoveryId: 1, + }, + { + d: "a3e57a5ce0fe586ba6a6446a81493ad0370d21796e37e238ee2208377c389d08", + m: "73526f7ae8d5da83c342af7a596a2997dd9f7f2a63d4a23d99d40483eb22e006", + signature: + "9947c66dca14405528af5db469b4e3aac1f757a6bee125888ab817c788b1a5152e4b850b2842e437f5e7411c53c6024f5433129f57a4b4344db44907e701b9bb", + recoveryId: 1, + }, + { + d: "8e4d20345509a9b101205aba5e9927c97aca4a84f9b5736e18ecbcb8460645aa", + m: "a27902489ffca2074e17fa171b9969275e0f3bd7529a5294075753d1461a743d", + signature: + "2e940aac108ed04867e84b392caf76511dac9a2f73447ded89d712cd6ad3ae4218e6940429fc7669974a2be5d1148b03dedad8a5c8cc249f1ffc67acd43edc36", + recoveryId: 0, + }, + { + d: "7a7499d07467bd4909c86670aabebb77f2c3097a1047d0702fb1d4e8f1da4dbf", + m: "a460f7074d4a20a6352cfcb94da9734354c7ea7628d7d1c3709555a9798a61d3", + signature: + "6378ab71c3d67b9324893c4813a93d6f057fa86dea209f4c8ec3a257e5b14f77757b8f8cb1c8395f0223884deed179527d2e8d9c0cabcb841129c9e06a28ab76", + recoveryId: 0, + }, + { + d: "f1604b7015048f18171678f61c187a022f965b6bc6e825e4d0564e733103d579", + m: "154b465a0adbf2f44a2a2e2e0f47846355b7e6525c57ab2997214ffd9f03ddb3", + signature: + "c07bf7af55659fb29c66a388858ecfa5c125a2822df0ae36d7f722f03eb82aca4e662bd6b2cce6f21dfcd22af7067f885ea80e5d1b77f61c1c1e09b6f433c1fb", + recoveryId: 0, + }, + { + d: "76685d40bd0ef8c354063cb76f5728ec575d6681a0e23e50b543ca8256608043", + m: "cbb57c7062df75512a7e5c8c0c592c2617ba9e361eb2a0f17e799d3ed26e5f86", + signature: + "ab30f9c9809e087a3d30bbc19df1c7ccd26260eb6759f36c8a4accda9e7ff416621a3ee4843cfaa649591727020f41eeb735c3dd218e6737f85d08ac72469d6a", + recoveryId: 0, + }, + { + d: "f1873adc06c5d516219ada75ed8b1eb50a9a9fc34b1193a99b8e440f4b213b17", + m: "99090f54ab1bb4cedac0805d656f53964771b6e22ec953cab5941ee9a82b6335", + signature: + "c47c653cf1a04f2cf606545cd91893d62a7500e24d1646bf0a7af4e264405c196120e800eef9140e511936d0f344dd138dd776e2c2682e92836ffdc1ea3ee277", + recoveryId: 0, + }, + { + d: "824120086e06b9e51737e2d694e816b6ea1c44f48676cf04a132cdcf094025e0", + m: "95d3d6dcc778261abfb30bd5454155b374781c0121a1c618b807f97eb3124b9b", + signature: + "41165d23c7c146cf276d1279ed4b5feb83343019b68346eac06e230d4bb58536742488cb8a397f5c580312e81d8d1387a369e8096eafde3b4c547d2ef3c94384", + recoveryId: 1, + }, + { + d: "cd8e53b6fe865797ca11843e03c59b20e1697ec82345b159e0662b7dee4301e6", + m: "dac2f17330f8153575b6df5bb75f58406374a95fce6158d1b38f0829eed8e4a4", + signature: + "897eb8242cdac826d6df81949a6c707cac3083e789907aad1013598ffbf9d31f27f378b6560cd83c319db1d41f2e9f497fce871d3248cc4069d50fa71e50f555", + recoveryId: 1, + }, + { + d: "787a482b2ace6cc7e66af7011eb8c78bc560dd942101e7edd3fbcf825b594d36", + m: "f1574051948f838a18aa04fc62cae27cd4e2900736d7f2eea7fdda9fe17d8bfd", + signature: + "2e89828c386d2c955be29bb78fbed340441bb476bc5418d8ee23ad41f3c7f0841f880bfd2b54ef8a87873ac94257469a78d00ddfdf0b0eec5d7b8ab1f957d2b7", + recoveryId: 1, + }, + { + d: "ade21c61a40a0045fde52ce955f2085dae1c755ecf9ced6e0d9daf3175ed74ef", + m: "3353aa0dac75e33898ec35dc3e74b9a972cf807c16f1be57847dac7fea67138e", + signature: + "b1a9b992a488cf9da245d70a084ee4358d510a4213dbc32703473127a22adece51452cf26f42bf82079608ec1a204bbfafc8090559b6653411d7a335d1a92df1", + recoveryId: 1, + }, + { + d: "d2222bde4326a0132e4c967dfb44391915c25742cb01b79bb51d0ce1b7183dc6", + m: "80ba979d28e2b05aee2abbe010de0f14e0112884b1e34a916e5b606384f6796c", + signature: + "537072f82ec1be35435b6969111dc4e59333326d6a65eb00dd85fc0c9da319e205a9d32afd05018ecfceb0eb0ce05e38cea8519bfb308b1d4070087c3f7d332e", + recoveryId: 1, + }, + { + d: "c0ec27cf5e02afc234314d42b8311780b3183465d651eb09622f0ce6f6021d9d", + m: "0e0d8d306b3ed22bc29d65f0eb33022dfd009c75d859b5edcf2edd460534fe55", + signature: + "146468911b3c532d6b42af4b0a05fbebe489319b5b51c038bcc8f42f01e2f59a3df21ba79024f06e75e07933ecc5aeaf5185a8dce5f81a989187a0ec3ee45955", + recoveryId: 1, + }, + { + d: "d6a3ba877da7b513b50422d3a75052d0d95ad9ad1ac53f3ae0365721e37219a7", + m: "4bc06f6c58db8e144850b9505fb9b0d7c9bdaaae51b9ac7d53c5c94e38a0e035", + signature: + "9b97865df1bb820c1c66ce03a828251e25c947912f8697337da51ae9f0cc1c0f7d5e0b441b3358db4fc925687701fd17c87913b8c92d3a7c4a02b056147d6ff5", + recoveryId: 1, + }, + { + d: "ac6f880510485e5107f8a32fd38f5f619cc59708b1b04b7ce10512d797637c1c", + m: "9d81dba56af6bd83e3c0a29c2f9cfafe537c426d0bd9699aa569a4bae30d3723", + signature: + "adb298f43861c62e8ccab1b1463f9b7f1f95de37f63139ac577801e72143cbd204dbd226398a6c206e1c276e2121466c1f6b7519516a7c7c26233aa9b05b9c15", + recoveryId: 0, + }, + { + d: "cb75ebd921b04863284fdf19ac3ce730f4bbd290299a585ed24980c4f956f876", + m: "0d86f4c9bbbd5af2c3a91d9cf7a8124021a92fdd824b627421c3f81a6a837ac0", + signature: + "76826f6c95585684870c83b2fc286b4fd66e35ccd123f4622f846d66d577303e74bc4297c92021df1240b5639ad310cd45db4101a5685789998bfd451879c9e8", + recoveryId: 0, + }, + { + d: "7886a6640f4c9b39e43029197f9e78899eeed0b06329ec8b44d80ceaa31c8203", + m: "552144e012257020e34b8a44e13f89d1618e37065d875058428c186401aa2e4e", + signature: + "7a0da5e7045a19e403369204605e77c350583dbf396aede02537e88e862e2e03728485c7f6df80c38398d147032ed6c9b30529a7042149720d8cc23d2d9c69ac", + recoveryId: 1, + }, + { + d: "d77f87875681e1e5d6e2c4a9125122f24685830da1ab976c2fdf735223d959f0", + m: "cd684b33b29a58c73b25dde4467f28ab258a06b21203e2a0d92f0a0cdce0db4c", + signature: + "44c41a29bc114ef83c3082acdfedc962cd5dc7ce6e2b24f7ffa5858908884ac954d2b5e353e7b52dd6b560f58be246ffec550d325a9ffefb46dce4ac6d4677fd", + recoveryId: 1, + }, + { + d: "44f9fa1145dd7436b2c8c93144a40c844e9572cd98513551311b261600710f7f", + m: "358a0f254879bec0750c8d9c4327b1dcf936d8b4c389303adcb6fe6126cc1623", + signature: + "1ba0010996e22db6b44cca4399a9097bda6bfef185ec27e3d4df6c8dbbe60604509a7ccb66332a740e93776e92c930462530a33149101c218450d4d58d9f7256", + recoveryId: 0, + }, + { + d: "5175788562d6a4f220fc4f1f14a978c349dc40179d31901b4485fa0f66d785db", + m: "aca1b27a55ddb1dcde5bf79bb8503629348b3e3d85dfcbb474c0299f0a5fab98", + signature: + "0641f86b93f5d1a65295c3e6934a5790c7cb78db28a884588a85d04b8897bcad1e498bcc3eaeddb83e6f4c521f22fc415434d3bb61423a085ae4b09e44dbb5aa", + recoveryId: 1, + }, + { + d: "a7d18627525a69095277a2237aefe670f23fec87c96768742b8c8d843e200e2a", + m: "4c01c9481d92667bcd8d618726c88b57755c725c2f9e4cde57a4f9d2f1f182c6", + signature: + "fc4055afc4073d1829ed6ce5c44a52dc95991cb7668c636c8d8ab2b41405886d40c4b38699e179318c75d6a639ae68fda98fe1b2fd1bb44dc94aef54424931fe", + recoveryId: 1, + }, + { + d: "28c37a6bc2f0227a7f3bf411bc3f2f892bcf93ec7cadf57ae0596df4e98775f7", + m: "e567347c2155ad322d579f8e3655077d12e64031f655713dfd9ca382d3f1ec84", + signature: + "1e45e5f5fbb993f98a231369296080aba9f6c359ac970a98f2e8f916f78d3c28308c4a596b0fa3d66859455541c07ba3fd032e77abc6543ce80921c4f0c192ee", + recoveryId: 0, + }, + { + d: "455f066d23b5b7ba8f1c29fcbc33490da2f28869d817289fc777bba73625b129", + m: "e3979b2202e6941e306b739bcc88567e551d510e9cb73cf0fa9ae92ac8f0c800", + signature: + "2d42530470e230bbec0a8d7d57ee2a868ed0dfd3277ea10d967e6cd631e89cbb7beeb6a44edccc5247f4f8ee3ab6505c9be68fe1bb9892f2be74245e570214cd", + recoveryId: 1, + }, + { + d: "5d1aecf9339f23ec000834804c6c271c0d04b7e1969e2ee705dcc8f74c2679ad", + m: "048b79c05d7b3b78afeb8d68342da07dd606fa0c37529ddde409337c7e925316", + signature: + "891c89e8cfb89904f5ef8040729161b27e74eabd522599015b06fb47c920d1e00d3d54887882edaba0e6a293489eb2eeab907d0bba845f30aab803a587f6c341", + recoveryId: 1, + }, + { + d: "ac6be33e70823df6e479f120f1bc4fb0548b8a5e543f7f53c649f7af5352c833", + m: "9ef074f27b338cf6a523c2d5edad8edb6af0fda68b37d35ff942b0dd5ff1c72f", + signature: + "cd7c47d49c87e77d93c306a6b611abd6a227df05cc9493e5c7ca64258791634c03ccc3c92ecee81577c673f62b771841a2d662b853c222f6c659a654e4ee4c62", + recoveryId: 1, + }, + { + d: "0eedc17102da97c93ca6aba99714b6ee93dd6dba34aa6f8b191f3a3670af8a25", + m: "e27037b4ee2d1d724d9778e4f3117d2336440c211373d20057ca2cd017e46a23", + signature: + "a77e3e7c94c7d77510cf8480ef1478b30c2f04d47a313c6eb8f0a16b957b857252bf0f8ab3f711bd739dff98048ee394b5ab8d0077bd9f9d728cde0f8804cf71", + recoveryId: 1, + }, + { + d: "d11a7dd4a87021151a82b6406393411c5ca1d9f01a4178d7100ee72151c3844b", + m: "5a684ad4a607a35d1d25657ead22b9f4565347b3441587d4db3dabca1ae99b3b", + signature: + "32a9fef2b7a5c9a185d3e8f75ee5975e2da5ed6ac441969a30328b49225cd3c04841ca49622618b67d033761f82fa68862b6b42c7cee69d2f319fd6364c15120", + recoveryId: 0, + }, + { + d: "325f1d89779bdc5c951552db41fbd9b6de6e33dbeee8d33fcc566a6c8c490689", + m: "650527add4e1a730cdda7d3edf5ce7a7652487b8cb9b567b9ccdaeb37b9365a2", + signature: + "eca74bb8682a254a897e364055c3cc22452603a7e2f87dd6c02c35b3a6f0adfe26606f65b001e70f2816261b1c827abc78b51ace167a3c65ec910d682e5b39fe", + recoveryId: 1, + }, + { + d: "b0bf2e64d8dea9640693095c48278e1734848e12fe572c78c9e4cd408a46f2f8", + m: "c593513f7f0f1137eccec0dfbf4afaa577bb5f2f981930d47745c84aa7eb4933", + signature: + "bb2d225bc62ce08d7a5d8f115e6e7b9e69c6e64fb5a69e7219b62c7cab38ef8a04358be08cb4b20a259e719a8b56e0afba11e371fa3123a5d937f4e6bad6b41c", + recoveryId: 1, + }, + { + d: "99c14cc0d070d2aca5175438a7a0c1e41a6267920f7a117faa2d7e228d83de7d", + m: "418c68336b887cbbf611c9f0cecf9c4917f216d25219543167e7d45c31cac5c9", + signature: + "5e98ac1d7e604bea1005498bbeffb4de5e6a1dedbded729857dc79d85b9df8f45e3d8648aeca4d9e0298e003e4c00a16e198181a4ba45ace3365aa942c1a747c", + recoveryId: 1, + }, + { + d: "6ef56f31a330994351a979e741d42244b441f11b0cca3da79bdb116809fd0d29", + m: "764acf6df0ca93dfcbb177ef7328260c44b18fb82f6da78433f5116c37dc32ed", + signature: + "c09bd0f2be36b182082d48c26dff17bd946d988264358ce3cfd9f32531aacc7d00e5d6ea3b7926055d720da53fcf59c2783c93b5e43796755090d7489020e08e", + recoveryId: 1, + }, + { + d: "8814a3485fa37b397cc20405ac8be897362c07201806998a25817f3c3d946477", + m: "a79a14e45c36af3ad99f6f582af42916d0059d2149d923208fd7126fa9e4ac3c", + signature: + "32f2d5e487954d21be790e9e6b8e437f8c1893648931e473d811742084709eff28118572cc0d44e028a8f6fc1e5bd1a193cf501c16e30aea34600dd466c45012", + recoveryId: 0, + }, + { + d: "1a2f082225d887de39758e06c7c8ceab21ca1203b1d7643c7dd84a4d3b7ccb6b", + m: "024a1a36d88e4a1bb3b2e6d06ad66651da513ce4dd1e30b82d2c7dca60e94fc2", + signature: + "e136979e151b930c2900acc3f8ce14ee7ff940ddcc5bab3dda90660d9eab4e9e14eaddfa05f295b7f83ee226b76be458939539fba33d6efdd418e0aa6cfe63d4", + recoveryId: 1, + }, + { + d: "ce67cbf3f101f7eeb509222a65bb66a5adfc0a3fc2a1bcdf7eb6e55730f719e7", + m: "f40eca2437096a42a3612dc059dff2de75eb5bab49c1ee31ac9f8fed3264a5c9", + signature: + "c4cbf8f9aa89e3794d0e420dca5365ff653408c56f27bf283decbe97e708c38a6a07b4e9871600db6e6470af7814bdb85fe171ee25e8477753a68a950e629484", + recoveryId: 0, + }, + { + d: "2fdca62aa0df37f0b7aa1a44af24ad05ba3cf3348e5862b02571fc5dbde0718e", + m: "7a729462bdd68817aee038ade7374edd4624f79de3c5b31df10dd50ca1b15b85", + signature: + "7ba76af181d242870f700112af6a17bece708328d6ca070f5c176c2c581062dd5481a39977744545c9daa93e1417405e71ab14add4f9ec63e2c5596e7e8ae4dc", + recoveryId: 1, + }, + { + d: "5f38d0a0cd982a6cece620b0b774d7c4dd137ac905d93b8f501107ad3d1f27ac", + m: "94ca46125b23fb9f8448957c8597adc81791f6eeebab2bf2014c5bc7a89f79fd", + signature: + "c8ff13a08c5f7bba6483568e454034d657748aba5716efb4e53b73c7a6326cb472f2289ca7423408783977b1569145b843b56303975891629b0f4f267fa13597", + recoveryId: 1, + }, + { + d: "9715cf2832ac775e0be52f19a805d2180601d1bcc8200a5560c567fb1e9e9f73", + m: "1b1577926269f229d4257c06d335b00cd46041e012a5f7bf96cf5e307d8b3fc3", + signature: + "2a205bc134f85aa7ebfadadf9d8207e13ebf1c78c070d3ef374c1d4a3f5f8ab3648d4210d3649262545b8a5345ea79c19af3533f04a932b90019971b8b4e3b04", + recoveryId: 0, + }, + { + d: "1d8ee1d2a5b251048aeaa0c35029bd4cb7bc90a0068c308c486bbea00e58b047", + m: "9c72a2ac6e0c4d4c05a3250c7bde250559d42d5b5bc6ad0d406bc6ca6e1e99b6", + signature: + "3c0a925996f07878ba5ff259d12a44e72717719607dc230ccb2ced6e72264c7d68eb803faebb1f3d90c7c37fc292fa49299397604fec6bfa438590981e8840c9", + recoveryId: 1, + }, + { + d: "74340ec83116198c2b2895ca04f32aaa5e0773841558644ecd3974c89cc2f00e", + m: "ae557ba771d05fb0e1abe61252e49caefcf17bb2ba892c9714d9de2ab17e04be", + signature: + "0a1929d964de2193a6c9a726e12b77c4c878624dd1d5ea589d217cf97fbc014273647cbd6808d4c17bf55a15a288c84207d6c36c3042c0fbe8ec272e59abea72", + recoveryId: 1, + }, + { + d: "47149f965ecc5699d1433be7538d512b641529d5bdcbe8971409715232063200", + m: "5e02eb0508cef8a3be50cc7988f388851801e74ed54e925d4d1a08b878241ce9", + signature: + "aa009842810e154b3e491c98b86744dce3e5ffb51aeb2fa1943e1ca2d5644ec73e058d9a63facf3f473030900ee7c8cba54927d7ec0db226d7079cd2c155e7ef", + recoveryId: 1, + }, + { + d: "2c00ca12fc77c308b62578e83f081260de502a5b5533ea4413c4b2de7fbe7e7d", + m: "a2003071ef1a5eea526ed816dbb7c56c3782f04e6a6e377043258faed94cdd0b", + signature: + "169f6ba02ea6bb113f003e9b0136398ef7cb4a3f159add5afca2ec5861d600a236831e1c8a01b0c0b979f847395410296bbafec776d644d0f23da698366df156", + recoveryId: 0, + }, + { + d: "34450e7a9bbbc1a95e3908c8e32a49bc60f203b32134218a57b737f8619d750a", + m: "361d715d8fad15dcd292e37927559d8d18a20e1f396ac87117c90ed88cf86d42", + signature: + "b895a0075c7eb95b69ac0cfb6bd2288991d654156f7594b6918edfefae5154644a6317403684047fdc0eab32b0a6f541df1d41820187bcbc76fbd1bf6679a621", + recoveryId: 0, + }, + { + d: "7609a68826cb9619e207e4cad91be13c1361eecc133738e38d0f843875ad45d5", + m: "06c9c4a58447b2a35f942d0393edf379353e00b5748804e8941f59370957a335", + signature: + "ec29733a65206b078174bc1bb8a282516a5153749a7100cfb01248e3b04e408e0721f76bd5fc59df168acd3fdb999edba058489e2e8e95efb9140e0be0c6e91d", + recoveryId: 0, + }, + { + d: "71b8f6884d29264136fd0b49c9867ab6a008756f2f5f5466491c5f4397c8cb8a", + m: "02452fb02a3cd67792c7a4fd87ece324ce519ea8c631357374895d8aa5ed1624", + signature: + "aa93ba2b2986ddd396f6eb1df9e6fe40e011ecaf9f5ea79dcce6542a90076d28420633055d900383b021f2e920cb86730fc83381d11d43d726adddb37c9c2b46", + recoveryId: 1, + }, + { + d: "7c3c03392b650f3f292177ddeff6da02e61a23d5842db8b893272a246803b672", + m: "f039f69a08f195b13c5cd89347f3b2bfa97a5f4f7ee4d0c93d49ed7c38a4b33e", + signature: + "8d8825ee2e8a1c8e93c59d4542ab635204d7595ac864328e1d9c8e9e386070027028d6f145cb1055e22597cdfa3557ca70caf2fdcb48811d23334081a7b0a6e3", + recoveryId: 0, + }, + { + d: "7a83d0b3322e81f7a2414f73eb1a5d77409fc491796bdae8c2050e0e9fbbe4f6", + m: "82b730f247ecbb3d85e36f6ebe1800fca7c5700108159210e105e76d2ac9c129", + signature: + "eb968aabcd995b7029e31342c6db48ff1b40b29c61732b52f68bbb30c99106d4459c0365e90ff3812b7836e7d1a79a894a67285bbe472e05ea56319e9e32009e", + recoveryId: 1, + }, + { + d: "9f92b506a6fb8406ee246cbd6bd571575c1cc33782911f05d1fd46ba8d8943f2", + m: "b744ab04dff69af6898e3e83883d5a5bc6cc9033cf51ba79912c18b1e3d33e83", + signature: + "30502b9143bb5ca88def8bd8490b9b39f8b0093ea891df908f255f13e03bfc415b448605d39c560809bc26467efd045a7b15c7b46b375b79c118d2c2bfeda1e0", + recoveryId: 1, + }, + { + d: "424a1888edde117f3239e2ebb3d9a4c630c05f50c41398d01bfcb572428e1a66", + m: "2ef487087945ed4aacf00442fe5e5203107e8fcc93ef4d65675df2d6ab281b3a", + signature: + "b67332543929d65eb9604ee1e13bba889307e074237f8a893f55b91e5ddded2c2a3ecf189d95a002e510198fbdb5d3db791625ee872d6bb0e1f8d4d64d3728e3", + recoveryId: 0, + }, + { + d: "754b8c1c791c77d88ab6b4d1791df9241eca7bcdb210ce1172aff1651c11245f", + m: "6e8da76a0ee3859618255832267d6b532aaa76c077830a39b9f95e65f9abde09", + signature: + "c49a08758aca899d134d404d23e13244e166f586f0d9cef6ac6ab547d853c422204cc005c93b190df3256cf248dd89e882891c844cd6fa55ace547527d7d6b5a", + recoveryId: 1, + }, + { + d: "ee76a4b307c22926b919664edd699e01b23387a23a2ec6fd325bbcced5d3f039", + m: "989c282f91b057d2a78efa89f58923d278d03ddc85ea591577dc524324fec289", + signature: + "2fe3e753fa8fc0676686bfbe3d09cbc17ff19d2856f60c7b22796664eaf5ff920d9a7c7d7636900d8b4a556a18f07768b619316de7ed5b347c59eae22467a0bf", + recoveryId: 1, + }, + { + d: "b3733dab4edc49346f5b4f19363e573daebc1f3808d8b2a4dace10163eddf14d", + m: "15d97f58824fca75b3ab6a4e4fe5ce3c38ab0064319bc56c530132f1cccc9992", + signature: + "56364250c6b286f6fc24c34f1aa8bd65cf1f64e030c29de95aebf08f5e6c94e33c0866e1b7a071f5ffdf2841e4b2b5fb262db1df492775c3ba844450078abaa5", + recoveryId: 1, + }, + { + d: "35a6cf242bfe89688338ad52954b3c137335e133cd014e6b312d4e2ca473c781", + m: "8b1283b204a425e9ad2561993945e84b7b5935df73cdf1664df4af0e39e79576", + signature: + "188a938442e0056f3a9191ada8a6535c9cf215211955e27355df5389aa75f3fc7566157611d9af01eadd76c22d2beff009c339f152063739179ebe82c6808dba", + recoveryId: 1, + }, + { + d: "d5b745b876c2726a47c56cefcfd5a6d873d73c368d4502fd70c3db374dc5e9bf", + m: "c4a4899600f29e5ac4d6e1a39df715caf58d3f0bf23cd26f646b8a37469d227b", + signature: + "3f6cc93388e89b2d9ee8dbacb67fcb8798cda4bca907510cec69034f40bd1d8917ebbfb0bb93d3734c802207ea10a2d43ecdca1abcab68f53af3a392f61a34c7", + recoveryId: 1, + }, + { + d: "67233f653c252d606705ecc70500a6df703df76b52db4391198ead9b516ea1e1", + m: "bdb65a8bec46ac5ab95ba17b4968db4d8ad124020ef6eac11d533554feb44f46", + signature: + "fc307b88e4c9ab68d310797fde2d0ca277bbf7775145000162e9a9838fc180914c7bbd5f048189855be66124e6daa5fbcfb69c6433abe70151aee0d66555356f", + recoveryId: 1, + }, + { + d: "fe4373ab50f65b349acdade43b2544d510025aafea16532d2a344fd3aff99f8c", + m: "e91062005ee4d3be9eda4605fecad630cad76b0dba82b3b7c5f9475d17de9319", + signature: + "8962d6b5c5395dff3599d5a72052eadec54c85d5eed99686edfacc44668916475824412c45ad410ebe14a7e2e60890b28345806e1ea5d13ba919bad672e34f06", + recoveryId: 1, + }, + { + d: "61f07658fd714629536c445d428e94797b1a109381dc857e9d663828f9a2f9bb", + m: "31632b208cfd48c073f6aef3b48c3fc57461fd5040c98157c55a20accdaab6ec", + signature: + "887dc9c3acdd47b996adbc5354191d1da6b2d544baa1506c528ba7d50a314aab2dc84b6a6cfd173c4bc6aefa67ed5c6e5669e52454da63d83453da5850c44ea9", + recoveryId: 0, + }, + { + d: "40f02a52bc4bb5991f736e6dc634cb83068a4fad9b1384ebd8eb0d9618823122", + m: "d5bb9372c5a19e6ee464443796b73b49d63f12204fb6974785641828eb613e55", + signature: + "ed3a3cbeaeafd3fd2f7a257a92737de4baf3df711d6425603bb225f1345b65c138b016fe9405ce963ccea26d967c754527c07838396fcd093142350208f72150", + recoveryId: 0, + }, + { + d: "2f0861568168b27831d500bb630aa8716de2be48592aede9819b2397f1100424", + m: "dfa9dc800214f9f6452ee6ec9974cb728eaf4c6d45131510849d2729f21c7631", + signature: + "f0e38f05bb86de8af3d7eade0c1042a58268312ca3f41c08a3d655fbc097264523379288d83f8d342dafd0cb22f817bbd11ec151b5562b48a14b1bf35a939318", + recoveryId: 1, + }, + { + d: "311cd6b4080e4ca380e29bbbc9a840af19c44ddc41dc06bf7b8d3eeb0f57b8ad", + m: "c63382efcede6497ec7456629f55cf6a73c5609e3859cf1f698debb340c38ac0", + signature: + "b258657c81607be1342dd8344832e90ca3ad8ff56dafa87007ab4240eedaf4d8530ea97836b6dcd52a4b785da0575851ae063f8d0d89c33ad0e7ee536d105196", + recoveryId: 0, + }, + { + d: "feb9c9d980da27c1ef8c0efb77cb7f83ada45850b4b020a800efd1677bb07b0f", + m: "51ea857a9ff29c226bc8303b12191d79607c06b8676c321157236f7823bef20b", + signature: + "be0a17b6a9cc5775b8f3eb23d174270629370483ce4cf677d990552eaecab7e231ae099d14a4203d76449250398a15f2a035eafa172c7dcd8638ffe8eaa78872", + recoveryId: 0, + }, + { + d: "8b8f855663c9dbb809d7b887d2aabf7e65747aab1eb3fdbb52bb4e2844b04ad8", + m: "4d509414406852c4c863a819eb3e9bef8e6da929e4c6bca437d1a121c72508a4", + signature: + "6170a3d8e34c2405e9d85dcf110b8d141d4f7dd9272a30a2ab96170e65d6bf531ee8e39e2145e2c1ff6d21f41d36c67425ec587949c1e4157ef8c98d2bf433c8", + recoveryId: 0, + }, + { + d: "a8bcded40356734c7350de1714f1409edbe3fdc66864464ff5dc74bdf257c477", + m: "9504be9935e3134c023401fc4d80c92bd82652df4c7c238474a3b679559a0288", + signature: + "b496cb8e845e5c70651e1dc8555dc1eb76a1ac77b31c439942f1f5817d168b9f25b0f2eb5579e830bde6dbf0cbb26f76ee4a24dd0a8864c95b674ca3edbd65e1", + recoveryId: 0, + }, + { + d: "8c3b32379a3735aa17d4f5e15243d9041bf4ba79a3e2716b01fe4761c70b169e", + m: "b676252e727a3d8b0e6b076a791a0b8bd4dc0f9a56e28bb4b164e3c4e4394101", + signature: + "dbd56e91d66b6b37ee3914dbad1d78a68932526e78c719458414f28a434b57f62506b42e362b742668cf8a5bb319d03d7ac3e0369a41b10c15141f088759bc3f", + recoveryId: 0, + }, + { + d: "f8907b8d398bc5f6cbf681143780c03a4e14a075b60bc3a424ea0128b18ca437", + m: "d4a59586f47adffc6e90c8ab239f488c9e240c3ac549887b0a2483f0e5a33801", + signature: + "04ed208ae2d54d7895ecc1dea10107eadd881fd88a815a23bc89f624420db3db1d1d0333257397769ab71ab1ea8a5d0871d4f96d90edf94c280754fffd0cebfd", + recoveryId: 0, + }, + { + d: "49956f794ce18ce74589524cb9bb54402c74faf5637cc1d98e74d8a3a833557c", + m: "118e8ce9decb73f08d6e26cc8eeb8854f8fb04251842a4b50b3a6c1fa4545254", + signature: + "11f2f449da10b1fcc8f0530ca3064fbc5b1dee28f43253c2c0e03fc719ec15a77056dca8ef84039227b6835faf6fae53523d28738b4ca443c472b37e731f2a01", + recoveryId: 1, + }, + { + d: "11eb85e6eb09b3a10add94acca8e9b340b2296a4e1c92e70c160aff34f94ce78", + m: "1002284f49c6d66bfa1165e238a6383d5830d061bd30c412af58a9285c311853", + signature: + "7117352efaed857754b176c56d51e790b54457167bbad2fccd7a6264d03ab05d5ec0a1d1eb0be032ee80cf2bbd19e4ced0b4e6f01931c97d1318c25f745f0381", + recoveryId: 1, + }, + { + d: "1f272717c6337cba51d02d8408a84dbe768fb1dde8fba4a959735812d9f21cab", + m: "c18d02eeaf65c735be953e625855166964ada3237e5c292776718b969e149ccc", + signature: + "a832c77cdd2c6febfee844143d670d14700d6a244816e0e3cc9788a6dd7bb3d651d82aacd7d96c29128d7448ddb92cc79958e06dde4f267e20783715150de607", + recoveryId: 1, + }, + { + d: "9dfb4218c5d20dca1678dcb7dbc21a6088f9c000e33dfd0444bb0ed62b0cb508", + m: "378695b97df73a495528b98ec0df91e2359e34bbf5ce6f245b17f80402f63070", + signature: + "2fc8f70b63ecae9a6afc168d9ffa02aea5b6955b678390b04d89f60af2a1513f371268bce644fd40dc2f73b84d73fef57da26ef24c66d635a469dacc7168cee1", + recoveryId: 1, + }, + { + d: "5dc18f9b9b7cb2fa6973058ad67316107e21656612135a7fd65e362d0f44ec0c", + m: "46bc435a1a0d48d3ce22753ea4f92c0b05d0292e8a2998bb75c4ed89b4e41679", + signature: + "4534fda6856c5b6ca788562fa49300930aef23d1b3825ef057ff277ce0c1a04773b696a4d5c4e8ec853f4e46559138f030283d518ed8f9670e1e1ae0ddd5f047", + recoveryId: 1, + }, + { + d: "eb9976bfd6061aa56f3151f9e44b064c062d3ef48e15c493749936b85d679b74", + m: "813435e1232e11058fd833cb2c58a536c3e2cab017bdd2b9e5d3b9f4b4682abd", + signature: + "7bae3b8dde445775f0628e781d1bd5c99c45f1888560893a1c10af17aa809e9b40866f6c3b20147e4a638f6da73a35c6fa487b6f2be54dc030e634df48646274", + recoveryId: 1, + }, + { + d: "c80e4a6fe76322de00858cfaf627c16bf8b52b534b267d2873df224d26af191b", + m: "fb71917d23290e5be85d681d1118b07e165f55b9e2e2d1bd3caabc846c0db089", + signature: + "4e4afeadef0d586033604ec9f89ebe485a5d6971d2934cbf1915c50f1f9fb56d4d6ccfcfc4d4848e78ada31e2eaf6d512095100b9a38b26c6c402b526602eaf1", + recoveryId: 0, + }, + { + d: "faf8f8e2dbdeee890978d3b2b1f5f336ad9565abfe5526b5c6d4fd5c6b70033f", + m: "4ba7c75039e8d6870fdc4d9abe06d174e618e005f40cdee2f1e7b436821fe216", + signature: + "c84aa29fcb6b11f017cc1fb7ae92f99628cc4d507dcb750950b6e3693db459833ac7ca44c2a8651e4ab9f888326e62e6b9a6ffa07f444c904a0d2519ab9ccfee", + recoveryId: 0, + }, + { + d: "e164a3062e3e08fd984045f8d30b989093afcf50dbcf706a59a8c564bc5f2cef", + m: "ac63fc50972b4f647a387488b01d4f1a251905b0b619e9f6cc583854c66519ba", + signature: + "7f2b2066ed4630521ba4ebc73d870d70d8a6b3f9aab077ca6e7ddc169333566858df4835e0c1d8cceaa3418b3c9b813fdbdff95b0ff1d21527df8c45f8c4c73c", + recoveryId: 1, + }, + { + d: "2e090bda2083ee8c32a8ec25bbd1298641ebfcdd10406abce5c6b5ec67b2f0c5", + m: "e1590f020144372ca523e025fdd655b0cd02dced84a60a2e095c496791da6adc", + signature: + "3e368810ce0484c9e4ac2e8476cbdd085205eeea826602303fe3a534b5be249565d2ee6196a31c83dcf597f1976f3c625da8e9ae6ca91f96e5cb6143c5aeba15", + recoveryId: 1, + }, + { + d: "d8b40fd8fe24f436d5502ad1386f53acb69bde401bd6feafb4257fe3580807c6", + m: "849443c4a4a26cfc1f25859817a9b751a61da59fefab909001e020bda4578172", + signature: + "947b47c7385321fcbff379f700afa286d355151103fc80ff088d5947cb97144d7762423f60d7b4f9f3ea4e30ef9ceba9c5bad089eaba6105e456f4156f6bafd6", + recoveryId: 1, + }, + { + d: "8154e20df5ef21e32c62f4b141b4f231dffedc8590ca806a7dc07a87d12077d6", + m: "21475d456425fc3dc1796a40d2e55aa1de550206a416e901e59a430427cfd990", + signature: + "9581de4552b71f500d9fd6c2b6736a4976376774404f76203c44a244da5c1cf5703743548fa14eda3deea3c72ddd56549e111c87ef6fbb83cc92258a2695ce60", + recoveryId: 1, + }, + { + d: "9c665433587dc0f4bef2548dbf285ea9bdfc20902b47060ad3c12a0dccaafc15", + m: "f9eda5bc02674ba2346ffdf0230f2a9580d634a389396fe7bc3c69f44d3c808f", + signature: + "7198fa8dbb9981e34f3c59e77d336595d2f4e87ef12dea5bcb01e1dfde0cc48358d117bab462b7be4addf1e4cf95fd350bc01c1044a446c6c6938f225805456b", + recoveryId: 0, + }, + { + d: "f95a90d35a1007b844bb0b9112d3ba66a6001609764eca13e2a9d19e4ce70800", + m: "77b3a26ee4080618f7c646a48b7b56f782972eea0c9d0efaae35bc05ac7cccaf", + signature: + "4f8097f5413ce6cfa61a605bce8716a8911f001edb79f20a685022d912bb0f146c082212dfe8910a8f6c448423dcc89727329463add9bf9819358c7842993558", + recoveryId: 0, + }, + { + d: "ef86ba4ec73a54cbe66eef6200e99584021a1646b9d50e5a3da64f2ce286e81e", + m: "661ed15334c28b0db932d46a0769383b9f041422253345270c167261db3a2202", + signature: + "1c593b7841c7ddeaa2bdaaa8c547028966e6b3d32ef3f0106bb4cec5adb05b6510417cae82636fa9ed529509486a8141e11fea5d213c22ae92669aaca96ae1ac", + recoveryId: 1, + }, + { + d: "61a95a5e4d25ae6628801ba6d1b7888749ae633672efd906e4481ec09f39c2d9", + m: "196f588e9fdde7731a961416fc99b7b648df836681d709d1d3eba65277d5e30a", + signature: + "d8c8e74011a805174fa65624d49191cd17d7fb79f12da1c6b8f034783f360fb037d34caf71814998802279ad538deaf76451f000b0b15252c20d3a80688293b7", + recoveryId: 1, + }, + { + d: "c431d288542932541fea4933510ff4e5aa4afa518c4a56d6eb8b35f63457b957", + m: "745870b1313542ce318c0b1ab0a5929abd7d6567fba102e01e8babba54053c40", + signature: + "efe2bef99279bd998c24ed9f2a44c3dc8b4f42b706db75579edea25383f6435820392870d792a061b8658bc9477040c07a7c9c02c3576e615c54bcc63bb7b229", + recoveryId: 1, + }, + { + d: "34b4fdc747d81e0ea0f68795ba6a2c07440d91c8ea66b39e403ef3e2a9b3a95b", + m: "e3a45f86a04ad44cb3cca1cec4da1555989a6c517999b1e57b0779667a80a201", + signature: + "45a6e45a0b65c942fc0e6a3fcbda5474cfa13cd00448dfb062dc9b93c3af214f3b7fbda1d9f64067ed0a708f4fb0bb772226d31c027e591cea6ff8dc2ad4b050", + recoveryId: 0, + }, + { + d: "dbd46ccf3603e35c5c27fcfc1c74597bbecd633e709e2a19165395793dbd4a09", + m: "30c792a452a8a01adad278d8c8698f3603569d39b1f8aed43b8051698244f514", + signature: + "87709489ffe832bd828830b9d60874c9821c539a7a4f9179309a4c9c022e698e547d41f5560c676313d6801b1d2e839c078b7e436f2c5b8ad0585146755fd44e", + recoveryId: 1, + }, + { + d: "165e468d8fd48a3e1366a88758a88a194a6d024f5b943f1d92245a03641701a6", + m: "744c264f1b2eda7748f590358e4adece0403b91307e8774145f42f6c0e8c9f55", + signature: + "79fa7ea5b759973852a2f334528264aa9252a7429775e8c66b27820f70da855908aca8f520391144c8e9393d747647a891106dbae949162dba0560bd73c4cd8c", + recoveryId: 0, + }, + { + d: "b23261faa537a49c47bf9480349b87a49d3fe5f6e95ef589a6e17ae16ef28cac", + m: "10d2dd305531e4f6edee53048279708f636bb33cc1cc597ad3089913552c90cf", + signature: + "a4fa3dc4377d5e19da001e95d1165c64865b137fb5587f046691ea981d373d624e57aab8717a8d35a64d7bd1dede1b1d66aad555d357649b6ea5d3d73f64f6cd", + recoveryId: 0, + }, + { + d: "e427c8fd6aedba83e027038ce6d74e952d0c9c322f454007548a473ae3351ff6", + m: "9790b8a74cc6ad51fe78bee649ed588cd0a11bdfed01de916117ba145593714f", + signature: + "273bff2f910a9259f0bdb3bde613cd2300b2cd7414edec320cc1e2775c1ab58329628316ae5cdd3b42aba4f600a97ffcaaf5b89d06b4dd22a1e979790c895b3c", + recoveryId: 0, + }, + { + d: "9055efeef739303a103aa2c42a16a4d99ec943b49d423db712cedf8210873792", + m: "e346bad162253b0f6d2cc2dfeb8d949d348aa6641f6888b855c75c2e81fefdd3", + signature: + "ecdcc6c805bb54989b48e7fd349f79a1da82dcb1ef4ca84bab5e356a19be410f3f67df94ed60b41c20a550c39f948191873865bd764183155483562eefc15872", + recoveryId: 1, + }, + { + d: "1658712dcddd5c3c8f2d655d4765ca89bb1ed673144c78690bb93cd4f92278a8", + m: "0bab22220ec3124caf19b1d21f534a9d761b57c9b6821ec0b704035cd826c929", + signature: + "dae5bfa41f03b60ab62580e442ee5ea9be5330e6552237f0bf201b4c2ce609cc06fe3411839f41f72310ce6e9381d700fe37837977275139ea67d53bd57f396a", + recoveryId: 0, + }, + { + d: "15b2bbee6044231659b7d42a60a81a9075c8ca218e724f96d9a58174a069b1ab", + m: "2c543dde7827af5661554f2da7c5db0f887127c5c16ebc79bdd99c8157744c66", + signature: + "84c4d81140d37c8af8a095506a87bad7031c0b033a34fd4a434c556350eba3f67fabd6c8c4a0a0941478d685db792cfb3c63d51a5c43c261a3ae7e422b1953f7", + recoveryId: 0, + }, + { + d: "c6237f32b81ef71cb172e8960b5bd24ec89a4e3780ca4fee2c694ef6e62493ec", + m: "007ca3b5318727cadd5ef347989aa53ecc2cc446d0bcdacd35ee7b5436ee5502", + signature: + "49ee307d7837cf09958bb0383365440ed92199887345880a210b97551fd6875135cd70d88810b54559d3f749b8e6a2eb01f30680e5d04f275e4a23164e4f8503", + recoveryId: 0, + }, + { + d: "a22b10fb504de2b12adce7b009f5faaa28a50ddfe39822d094d9e659e52e7ade", + m: "9cd157733efef6494d98a915e4c6d0a4fd5344a8fe4dfdbbe142d03feaaf7d29", + signature: + "c9cc592cc09597f6a6f5e820dd233fc01cb7fcca0317bcf7951d06a2b254f2ab4089b9754433e7991895cfb29fe6e2f37d9c47e5b60b08dc33f4098e7ee98ac7", + recoveryId: 1, + }, + { + d: "b56f7be2f4418a110a18289cf7378146d858182ace28406cafbdef2e3916f85e", + m: "3011a2f9235dd483342a6244925c1c8edbd71d15c265d1e7734641157903c7c6", + signature: + "1dd01959da67eea46263c3283b0e92cbfaa479f44eaf86a56cbc07f0c9ecdd4d3679fdd1cc07ccbcf5f804c1a991066633300e9905ef9005c963a04887fc8506", + recoveryId: 1, + }, + { + d: "0e7339b1570f56d2e68915ca66a388f7717df4fa1be0cdcf957a52eec8bdccf0", + m: "8230e989fd6a80e1031b735c661877c8530d7d0b38326f3d7ff94e34f1b0c335", + signature: + "b35a8adcefc61a8a2036fffdc1cb81537cdd45dfb1d80836763c162153ebfdc40091f08646d87a79d75e6f0d0381d1213bdc66b2ea959dc22dc076261f227124", + recoveryId: 1, + }, + { + d: "7d8255c5e238b0482f9072a2f23d21f7ad0beabffe09dbea9896d1857961b16e", + m: "340ac1a577a129b208a3eabd787ae475bdfc31385213638586d0a4f1c41738cc", + signature: + "c3b257fd8b2f5be01d228c3bec8c1c01e1d9042d677ac5b54ebb97bd33ef48dc31afd928ceb34978f1e13ea65b1c6d7371db699ae3ccc86c9ad2444e5a187adf", + recoveryId: 1, + }, + { + d: "e2b8fdac62af60945c435d1054d12c0e99814ec0899a1eb2cf65678e888e4ac8", + m: "02478a90351ab392b7392e958b4a53f431bc6c23e642f8d1c3bb50629c8da350", + signature: + "4fe31d24ce607b10733b17bb89c96afb25fcc467edda501e89d028066a7b877f44ab65794baf93e51b0a50cfd0176f2c54e80c44acd730c6a7924a7e8ad8e1a7", + recoveryId: 1, + }, + { + d: "adf1e74630fba47d8e8d64f158d5ac39bf1d6e889c189741cdfdd786e8150141", + m: "34baf68d25ede07f746438d7f17cf797d1a697dd2e7467e74a296137afc75f4c", + signature: + "f5447a984baf6753d9883d646bf8df9476e71ec83f9b8ebc607c861e5fdfa7674ff1ca00aab0e0753b92a1db3a2b42c0d0d3733bf6cf50a68542131004179fac", + recoveryId: 1, + }, + { + d: "159a945f57dd49b2538323a6e7c3a6ea3b772b55299bd25e5cd76cfea0549aed", + m: "6acfcc9a761e08ad939342553386c58f7bcec09b2b4dd2dd5eed8bea77735ac3", + signature: + "cb0d759b4a77c2b22611bf94f3d281324455d91f8acb25818ced53a352939a001854565277b6ce59814b07178ad3124067cf67cd35d36f8956ee8d786a321978", + recoveryId: 1, + }, + { + d: "375e8a96dd2c0b4c65844194a807f3f9e34448f8d881d1dd6dca3d50925a510b", + m: "54f3f3218f65b064249fe9c97b1a6079c0940455c1bb056d6be85f3f87347df0", + signature: + "d9cdcc6c6baf385834b7a6299f6c7f106456839a892421453e7efdfc0209ae427d199756bf6fe01e19b016d0e1273b0a0bc06078e44a4ea16c668ab06a06905b", + recoveryId: 1, + }, + { + d: "cb11b98e39ce448ecbe0565f31729c438b101d9e3b634078b0a62ea461287556", + m: "42a4d52491e2d6b419d5e2de5ae14c95f16afd10092c2f37f0e7a23e623c59a8", + signature: + "8e539e7524583c95d81e972ba11612dd5b25a87e5941a6e1fa13ee0f1f8d6af500337271952ffbbb2738016a96bd3b400580191240daa0ff25d0e1dbe217a506", + recoveryId: 0, + }, + { + d: "8d7e41c83b249d5aa34da548c47593740f2aa518e80003b4b81303ce9bf6d023", + m: "a9dc7ba0e08ccbe22961144bcd85709b66a1a907918e33d44fad81d144571889", + signature: + "7c3157086a2a70abbe9ecbbb27a78bda833cf1aa988a351359fe6d946d67acd970ba6003aeb31ecb908dd63b216c77320857c304aec9d79768142641f3c01b8a", + recoveryId: 0, + }, + { + d: "3d2fe7dd25c3dc24f914fa0e382964bbaeb81d9330e631dbd417842a4e219223", + m: "3e9d624602e334dedf6f851b6b3a2dd0bc4a2feaf86fa9d15ed6527647e2749b", + signature: + "0e7d1c8506da0fe1809c16ebaaa7aa5d0196e1a6d1ec395fcacd7fe1a7b457bf77a18ee77ef1e0fdb49c1423d64dc578885d8a9a2279884c389c43266c324989", + recoveryId: 0, + }, + { + d: "f55ec1b86ad12d3053360f8f9de88aa132173ec1a686977bad4bfa1bda428526", + m: "b3772fa8c6a138742f22bcdf768a4c56fb18328812df1c5e1a328af2e03ea4ca", + signature: + "58e74731c838cef8bc09cf0ac0979396a212ed121abcddab16eaba38129fb6ab146830b5b8cf8de51242ab058313a38422232bdc7c2eb5a6f823a2fe402e8e09", + recoveryId: 1, + }, + { + d: "0216bf6b0bb040dc736d19253d28ed3ae53b09962ab49ddab5b2802473adfe16", + m: "a4c18a6e733a775c998db00a0b3fdfbfa356baa9b8708cfd9bb361c393edc30c", + signature: + "28691832ca3e677d0787fe68773d1f5974514f64882eb8cf329b519067507c6d601c3f68c919109290ee21450692a59637a79d33d7059a7182cbb3aaefc3cd7b", + recoveryId: 0, + }, + { + d: "43534788d0cc74c92c321f73cfe84d6855d80ba43e784e57f95b84fa258dcb0b", + m: "97d50b29e7a49e489862239294d2dd1097d46efb812d04b87ec991cf296d6d24", + signature: + "27f61291f15c40d56cadbcc4f5f6fd356cc14d79ca97dc9b2c151776930ca29313727a13d6f5e933551ce779028d0d16fffd5fb2d3a2ef687c3e6176038e766d", + recoveryId: 0, + }, + { + d: "ac4ee46bcec2c437a0f164c7ab2fcddbac4a75f0f1139a5ba55a29f0a9168d1f", + m: "2af29efe55fefce3485b9cd7baf8079a263909ede6dbf4d893c6ebb0062c0787", + signature: + "d53ea39b90bf76e1decb8837c0c9b5779290a5b001f9b8955a180d2b50d7cc874a98da573c31eca9d54ce89d90a43c4fe666eab40698d33e3019e8e2772d9b09", + recoveryId: 0, + }, + { + d: "62ee3a99856a7bbc6ef1955090aa1a99e7b04638fb77db3ea0b7c2426bb6be72", + m: "fca3eb40cfa37df2f3df4de91099996f3124baf9d8c9e28bc42b5c4b7e460eac", + signature: + "02c5b7f855fcdde89aff6a4a4b06b738c3f754f5335aa6286fb4b573828e05d37832470c718b5d60b9dc9735c262bc7f27a88b48ea9d81bf6fdc049f8e89bc15", + recoveryId: 0, + }, + { + d: "ab7b5ca07f476097011bb32aba538526e6c2bda4124b1bf864644e4066975259", + m: "dba7fcf548772b77aa7661727188e71be93c3366d8aaea2514b66b8b306f5703", + signature: + "efe05bbb9d5af36cc2432376718d05627a2c3eb04e9deda66299546b210a4f5168274f9d31f53b25765d9c0949b440b4a2992e9ec37cb396c224fa2d4d08501a", + recoveryId: 1, + }, + { + d: "719068d97dbe56f376834a41794702bfb469eea55dac0b2be3a7efee1cde762b", + m: "be1e3cb8136ccf700e5edc412a51e8280b6f6a0d9b94b2a93b7db1c5dd99d55c", + signature: + "5bd4bdb43a4d75c83181f105268d55538eb037b2daa8c796e1eb8c43844fccca35cf26e5215b98eb92cf0fe75b642bf77d7ca1cb8cf0296209822d1a8760b81a", + recoveryId: 0, + }, + { + d: "a69e97cd79a3727b2fd5b4c83aec8442861ef085fd0cd5648c4b210858d1b79a", + m: "91e064fd548fac51baf877adcc6457acfc0cc5160d0ab726651137a837ed5418", + signature: + "ef2c76df810df949bf0579ea8deef5a09c931a5b6232ce0d273dd544673630ea333f2f84ebcbe9c7c19c1d88ba85af7d59a849dc2e40ad15923d40061b108077", + recoveryId: 0, + }, + { + d: "f153dd0ae47f857c651d58eb623770221d85d2a51c837ceb8f785616d243969b", + m: "37e45608988c3b541c40b6801cfdd6d70ec817be0b086cf62acf987b22d462d9", + signature: + "319a427abc374aa6774eb02e2372cce1fa5221d4f1d19c7ea7077dc06fa26a376dcd80a8522d6e2213eaa66a66074669ea75ac14f8b2cf426fa0d6d102417194", + recoveryId: 0, + }, + { + d: "33a1ae5b0da0206b996f932d81cd81aadafa4bf87480b0673169d3b2de4877e3", + m: "d9615b891577665ed43f494c2c2cde82c5d8d6b1d3d29322ce10d371a21e143b", + signature: + "154b515c9078f70bea4c6561d2a705d522438cba67188d57d4b290242cea0a5f396036cd488d069918d632dbbc8624895d9c74cf293aa18c42e7e3742432f506", + recoveryId: 1, + }, + { + d: "0691f5dfef6fd9e2b3e5e65bc9a94aa854c77b47f274f297aea69e8f5a57e77b", + m: "4f4ac91580f7f68722a9ce475d8d04c33ccf6f61f21c85a848eef1b2e6ac50f5", + signature: + "e48e07c4b4f1b92b04fc975bca31c0a12d12d395fe87e4786e1db9e53a4991b10185b2eb6891911b7a42e109b3f5290f5c14d31997f443d37fc42ed77afd819c", + recoveryId: 1, + }, + { + d: "6957a778ef99af827369c64d2de1d92c32819eb83b3426ca0570f7b206d6a200", + m: "2b5fde250381bef83eab6ac5902907e9d0e5ec58eec28762315f37b4874e2596", + signature: + "f558174f1c83cde31e2b4c1a502e909032682f857732e610173431516a7240ab7862f1bb70ec5ee51fe5612d36ee894e18071d9fd77954a995f1fddb66f30ae7", + recoveryId: 1, + }, + { + d: "805f02cc35f47c4fc9000648dd8e81e569535a84863ecfe11d3a4f2b47faa4e4", + m: "5c577ad71eefd9805d42cacd0c7c233f848310593873c5b668e0694b8fb06dd1", + signature: + "7e39a14adc358b96111e80577dabe2dcaaa2e6d52417408155c0ede63fccf63c6025cb3c77a8f461875ccee9c9883a7af31b8c9178b9f50b48855a5310366339", + recoveryId: 0, + }, + { + d: "b31409acbd8a73f00a9a10a984a7947e67d7ebfd70717da5849f0100db4e87e7", + m: "2d4cc4060ce20ad71fab80dff42307592b6714cd9e252b7ed52bf402e94f02dc", + signature: + "2f64071686f5a23574537bbfef21d8f70e73ade129b621d6fecfc7059fb054d449aff171de5bcbde9cb03876ae7683467353a051d06eef678dedf478bfd4e5f8", + recoveryId: 0, + }, + { + d: "3fd3ac03d317a9ced9947e38dd19767ec768352d72171875f1a51bd447637791", + m: "bbbe92db6e86864573963f0e1447a88292ab507a0cb3ade3ec93105356ec4563", + signature: + "e673e0ec80df5aef6895c15ef81fbdaceea380f28de9f6cc9929a16352613e5439e5a06487c6f9dcc55dc1c65b2bb1ac26627784128f865c2bd9d70ef7744c5e", + recoveryId: 0, + }, + { + d: "f478d9bdc704e81cb2af4078350464092334a8ad14b19b4e6ffefd5a8879fcd6", + m: "1a79c0abed26eff1bb2e7785567885600128f88e508bb4937e890f1685f8f6a0", + signature: + "11989a4757b6ba55b1c6833141a87a1e5535001c15f13ebb251df33b8ad918e51f22e66bafd9b0951c7c1ed2c8d57ad13c4dfeb1da679547374d02756dd75777", + recoveryId: 1, + }, + { + d: "05cb461993291497fd85343adeb8d7327d9cdf7d53061464a47d8069e1e570bd", + m: "850d53d114d2b914c52c4839cf38300f05c5fcc4fec7fb07b7f92ec64a34b507", + signature: + "f58ff3527c5c84e909a32e91298f377c4a0e045556a72a9e26d7855b4b65b2f556e837a31abe021fa2908511602648a1595270d1c4d4734a6375af2efc058eb2", + recoveryId: 0, + }, + { + d: "d1f8b9664c5f3cfc540163f22b0068e36cf575da061182a92881a45d2701a48b", + m: "3f518696bf866421117b6c47f807cd9f0b0be38387e6f53331fea4cd98ab1bc6", + signature: + "102ad3196799162271a6b5661a9fd2af01f9dc3e906154b06176e762bfe6a8700ae4c944d072d2a7214931507152f88a404d368cd43aed31698afc8ecc88e253", + recoveryId: 0, + }, + { + d: "fcfb4d8b7852aa848ad07bbe3df12b1389b38a6d4b6728ae31aff72bdf408cc5", + m: "8d1c0e707de3a30b12ed102ea1f53a4222813dec61eed3a5d4b50839481a3d93", + signature: + "e2cfb05baa0ffcb13a78941d3dac5c70506129ba08001647d5a6274befaa94e955b43bf8635fe062f006fbdc98ff2df2aa04a0f548497bb2485054e5df772a77", + recoveryId: 1, + }, + { + d: "c8b5849b2d270baa95b7f8e53c681ef252558dc340c19561a7e0102a51c352b1", + m: "93b6a96d2e5561b8105ff9e3ed967153955605f5795976900e9ddb34359bc104", + signature: + "d5553b04bc602058e8b139308af30efa2634be58666f51b78f22d8be91ef708d545855b152498f53b18dfcf7c9f0b133688c73dcd1a00ff1fbada2b2f99d4da2", + recoveryId: 0, + }, + { + d: "4f3850d9aed918ec6cf13ab88688e792f085d7c5034607f5dccd589ecef26a6f", + m: "7ad64fd031d042a06529c62a370849a6caaa1554ddc4205dcc67216bb2105423", + signature: + "1d72dc1f8b1669141048c2461c3cd5c701d99866dfe619b2f3d3511bfcbd23a1515b753d8cbb35623afb3193de2a0298149b472a29feff9c01672cfdc3f9a3b5", + recoveryId: 1, + }, + { + d: "9f087c1e644f1e67726b4b6fbbfb392d4064db01ac1a6fa59bbc31de404a33f5", + m: "611a6930097339ce9135d33eaf91ae9cd54b9804b1aa809e594b714551fb6b1c", + signature: + "386d865ce110d03a9608c78af5b3c3d5ee0e875d0ec5b8f7aaec6269609375d20b7432c3d626683ed2a427f220c71bbc18ba7cbb05de506e0ed7cca6372bf031", + recoveryId: 1, + }, + { + d: "c1dd3028bd9f981abbcefbde6f381fadccbe3e651c05b01663b2d602459a527e", + m: "7b4cce604381126180f7c3955cd06c3728136f703de34e5d4040b6de321110e8", + signature: + "fe577b1b4b3dbb1217b3e93a0dc40ec00ff33745a4c13812486049b7bd9fe9c355d374f653561b56273dc1909dede6f063a2a25622a52551eacb124c3910800e", + recoveryId: 0, + }, + { + d: "01f1d6824c23e7356d80044d3e9211215c28e5eb3568141c59f4e8f43c4f3f6a", + m: "f4a3bb71446d4548e43d36b1fadb701d393f2b4a09653dfde2823c2e3f1c6023", + signature: + "f70d8e4a475d8f0ee6db5b0b2f756aa4711a42984c4de659e14e176464b0d26d55245ae7178cd51f9d360a696fc00ec94c9c2abcff9147b2d1d53a018cd52f22", + recoveryId: 1, + }, + { + d: "0160d763287fcc3159cd5d2b6cd69df4fe9dabeea1495c36a128ab200d1a5a71", + m: "c0bb751e4f648cda496dee03416052f8b04ca38b62aa1449f6d3e72722d3ee41", + signature: + "0a3f19eba0dae4dd22b7a343ee62bd6d4a8cdc90fe4ff551eeb4cee96e21ac2579505303510cd34d81d053e87459098984e319211b8330482b326adeb4b0abd0", + recoveryId: 1, + }, + { + d: "3582147de96901681bfea10ffb7552c4d1e906e4e7dc1b5f14d4c1066ccaa06f", + m: "e5bb56f44cbdeaea45681e19d160ce135acc9e89dee8562eae612eba8e40715e", + signature: + "3851051979c3a8aa4429b94979a6db8d0606bc093af8df252016c14fbbbf9f40784e44d64f345d4345fd18b49cd4d7500239b98f9dc4110811e571291af01d0b", + recoveryId: 1, + }, + { + d: "99a97fe2e446e2a144c7ad4b46e2d965b5879722299a18c76f8a5c32410b4fde", + m: "b651fa24aac22ec9326d38f05393810c8af71a1c90670d82a83c97689fae3465", + signature: + "3699fef26b6be8dfb60ee18e09a5ff5c0a502979042c8f1dfcd17c0f1df50ea82013017bc3f06ff0570d820c3142a603fccfbb22cd3c706501c1e861ed35a349", + recoveryId: 0, + }, + { + d: "119d9faac9ac001cf9cbea400396e6e2daf98879fb2c4a8c8752f0e3a1e5208b", + m: "a5e1077e529879197526670082acaa3a58d8c474ec4ea66b6afd678dc2190c5f", + signature: + "14a3584f2c14b7175bfa3fada976c5282bd9881d5c6b7ec9157f5d82843829414650fcf6e7bef7408fdd795088faadea2904dd8da3a8a973bd187c1b8bdbf7a6", + recoveryId: 1, + }, + { + d: "8a6e940135f24613d2108998c76eacaa2a13be0104081907e5bc078ef4fac5f8", + m: "fa06bfdb6f7b1e94d5ce4a6b86928216270c2aa3038bc54f39f71df698b5effa", + signature: + "a3d330cff9f6a05bc76525e1dfb44612cb47a631465bdb8ca4f660fe9f650469219151069872a7752cfeb573fc9af4a56f28678aa3584d5ab434d5e060b6fe95", + recoveryId: 0, + }, + { + d: "5e51056d8f5d279c88891476c71e5c7e9bd8fc8447c96c42dbb9ccd0c4191037", + m: "f7dcbfbd20ca4d70ab52e942fed0f5eec7ca523719502aa0c5e00bcd192f0ec0", + signature: + "596442037d641b6b31c59411fb34d0aeadae73cfd0ac44f2021dc2b0cf081f1e3bb22e26acc2b044bd258a9034ce343734b48e35712e8c16c8bc8a50f94187a7", + recoveryId: 1, + }, + { + d: "cf97422b1063e1e4008b0e76c016cab4a6d40e2f07b1168f6c23e8ae7f273b7b", + m: "60dce6b4288107d466f420f5655fa8e48fde01d9c425d81d974952b08d474600", + signature: + "a577151392318a8924c100ad16471b8ff0f993e21817cf9339ec285b7c48140c36d8be6fa86f16cfd9ca18cb7b5b2c3805a68085ea8aab1c340c8b826509fb81", + recoveryId: 0, + }, + { + d: "266b22bcdb9357eaf4ccd6c485972460c7efbecedd8bc94d712b139b2972a36e", + m: "f1308fc10d7349c49bd16e5f6c827cd6e0cb3b22ca9ede9185c92aabe21a4f19", + signature: + "ae8be32897265ac4b00e673f9cabc1bb7930e73280e7ef9dbec32866a1553420211d98babe3067d65b5e146559cbd8f1718ea75b756a78efd88c5e7dad25633d", + recoveryId: 0, + }, + { + d: "91a9203954921dbef7a39a4f60ce0fd4135188c0ae9118408d4a3f53e2464cf4", + m: "beefb03cf5faa40d990bdd1648a95d3777de750737301311070c7bda40669b64", + signature: + "13df3b696f663672eff79c1618b76dfcf25e67d90101287502d02fbf06fb37122afd3f2d99549504781eb12eb1ee6ab00cc1e9613fee7e87bfda9907b7989c38", + recoveryId: 0, + }, + { + d: "7ee291cfc385a5df2123535837fc5f77c28eea4aa31baf19cb1f6862a86161c8", + m: "90ca90c64d7a60e589fa414b7e0c273f00fb0394942db4ebac49dcb1be3df88f", + signature: + "bb4308daf24c6b430559b0326b42e6d2c52ad5aaf1b0afba36592d652a4eeed30d5a4a7a1f5e31c1aeb4c549f8a6f29fe61a1242cf14c78915185f15c775c347", + recoveryId: 1, + }, + { + d: "6f2877954785d9a67fb3e57002d0253a0c00b712a77b97ecce6f234fb4a7a160", + m: "bcfef0deaf3a747d905c9273dcdf2aafde6dbc2a112dd32dcd0d93b7f83f31f0", + signature: + "b4825459cf13d8056f765d3f79053e11b4f85bd3f533da2183e3a0dcaf788772078e17ca23e51bae584e892a6eab66dc06d01470bef7e42887293e5ca72df2fe", + recoveryId: 0, + }, + { + d: "c35c142896eb7b7b5cdac5a1f96486205899eeec4cb07245a816eef1d7c37595", + m: "a28e2e63631a9d5b70b6b2cef9c099f05872cafcde41f04ffd6d3350d575df56", + signature: + "23ebe2af53bb76e23210302d6c715c80c487d77ea53acf8061efb911e83310df5aa35b2222a9e331a1676a55ba2bdbb4718694a72a4aab4caa9b49b919a9222a", + recoveryId: 0, + }, + { + d: "9977d138dc62c4711bcca836b476d642a9c4bb47b2fb91a31dd61d36fa0c7680", + m: "c2193d8f669fb2bb978ea22096202b5aecf281e84b1538f9b8bf42fa56a6e733", + signature: + "98fba14b6cfbfc807a8f60699332513a8e9b9081674b5bf62622157db89dd565740d3132bb4f44981700df151d3538cf10373698913876ee47171f6ba076c1af", + recoveryId: 0, + }, + { + d: "f255045f55a993a9bdd19de13ad4938e93799f70701dd7d1e1dbbfefe41852c8", + m: "db473d1cecd9056bce9d153aa35b63a268fc20ceceee3737fd468b52bae3cb6c", + signature: + "06e356ac45b72211cc3e7aef89978457c2d303f5ae16d300405ed9673d07ed1177e4b87de1dd2ac4ce425423d4ecaf63ceef175f0260a5fbdb5cd7cf4b96c325", + recoveryId: 1, + }, + { + d: "3ba9359d6189e87c7278c5c4a133250b0607eed98c6a6a9aa4731725a49934ac", + m: "945fa696003a653cf9e440a82b641b1d1bd8168fdcb7c88a084c799d68295864", + signature: + "e61bc1f34cb4fceb15b75c8f8205211db9a6b91ec07dbf44e99e55e172f365c23c833aa2a6136048864ff50e84ac5cac35e41d4381ec37aa97519ce823ffd630", + recoveryId: 1, + }, + { + d: "13a8d43733fa3f3689ee3621d666df010bfb79de04a381b2ede5cd60315b5679", + m: "0ba2369d450f4d0ba560d76f6ab098a9f915d2e7913ccab1468f552dcd3ea8cd", + signature: + "06b5b4624645c7857afc1daac4d1dc179a860918de31c2c50fc3892f25e0efc2064843cc8200d13f12ff7078ac94375d781ee92680548c95f02e21e9f5c2e6a1", + recoveryId: 0, + }, + { + d: "c1eaf8145b396668e0da4391abebf0cf8871fb179cc0cc064495261e65869341", + m: "31deda633cbfd667d384bde7fa7af56c6b2a851133f71880adaf3d28a38654c6", + signature: + "69841898206e5d946ca3ec8e3f68b48e0ee6a7a06d9c684c19d8d8bf539badd26f8b8963ff5b93a42ddd04d22b61d2d85b8b46d5a7f8eddae735e3661055bf5b", + recoveryId: 1, + }, + { + d: "33c9fa9dbf255d4628f1bd8deb4682c93f74877f8f8233f3fa5922c58dcb90b4", + m: "10e23b8440b0a4452cbdf41de1cef36a1602287fde78904f43f8656d85293f8c", + signature: + "841cc9f2631d9a95f6bd8efb82b05660408846eda865cc1efd4c9a7343ea4d72638a30f614714307657d7527d72f7d2bab1f928c744c13d623229a5d952c0ff4", + recoveryId: 1, + }, + { + d: "fc08587f384c2bece49eb850bef7a38e9256b5fb42fc3017123830430ed11155", + m: "3602906d651fb0f48da346766d9347922a69fcc36ba52b3cd77577a948d25fe5", + signature: + "0a25c22e8fc242bb0a724ed11ff61fe7147a3c4556b87b8fbad8a557d053f29a2a4e3020ac3a67efc9ca90d821be650c9950799cb9cfbf95bfb603fbdfcee8ed", + recoveryId: 1, + }, + { + d: "d209ae82275de5487c475df4e5391e6f92279fa0a97c35c394c4cbe2a228e19c", + m: "dd51cdcac7eca6d1b4183ccd0d7b46dfe54a8b38fa4834acad5fbbe2625e392b", + signature: + "caac04fa7bc02100f5ff41e18e7d1c3abc6194fe29f722543d40c4a5df8a299e04b6227008ebaaff5b4a99047384eaa3bb8c996ccc80b5df99ffcaef80df11a6", + recoveryId: 0, + }, + { + d: "dfd616f200d808cd1a22282cfcc37151f6b13d6f163f762d181cf162a56a9336", + m: "80bf48da1ffb58e4f2f51167b3e870fba1bcf63353f10019cd0c5211a16aab5f", + signature: + "9cc05aa7e63d4585034a5c48768ebc73507b97ce86db881f0bb6585d7e47b9394364925dba7be0ccf800c53d3a499a2c29f45ae1c866002ab328bf5b78789488", + recoveryId: 0, + }, + { + d: "f6659c2962dc57f639a736fd5064f4ec42dff20dbbe2e44dd0823dc779a8574a", + m: "64ddd266098a73c3aa76afec758a2eab7d7b541c9841b32c8ac2082da2144c34", + signature: + "214c7dd7af7e4cb705d9c08a2744df7146a24c44db7a14b13ddbdf00b495a0687e33ff37d0605f47fe6619f73499cae34974659fcd40a5a8d7e6dfc1077f16e8", + recoveryId: 1, + }, + { + d: "9cf9e79faa59fa3e702368c684f0b80cee36e0845800615431c0464dfd02dedb", + m: "d21e9b02f4b4d830c4af2940bda83538a604d10fb4615248ad454c2a7b6479a6", + signature: + "0791c3fe96b6199fdcf38acbb5ecbd83860a9117ded49c98e4cb04b452990c664f5d24fc8b7ee0cd8fc5f030b4c5a2b04a3a1b54add085726fab1609cb062427", + recoveryId: 1, + }, + { + d: "35dc936a95a1c7dbfb7dea9b4ff73f84c0eb6c0178bc9dee04f73e0b2e706d8f", + m: "86bdb11c9fa9c0acedcbf67e2ff815930379cba00d4cfb8b04c509151650ed05", + signature: + "1bb2bef30d6d2ffa492657d676bd2f46d1eb72bc0636208b40cdeaf2b77e67a613e2513cb109527f528e50d1bda2af0de719e5327cc43f8ca77e230018b04b0c", + recoveryId: 1, + }, + { + d: "a27a0d7b43406f8e3f566ca41b5c9e44e02334632fd4507cf1be4553297aece3", + m: "18f3b161dacd0e113432ddb2fdd946a19fa12113bd740729a02c9691e779dd3f", + signature: + "2924500692890a4ef6cdb9eab11a82b76be0f65c7360258041e490c4be1e7bcc174d76234d68ba897e94926b9850ac31a6e4bc23f4b04f238bb167a9c264e432", + recoveryId: 0, + }, + { + d: "b7141365d39c21ae795baa8202b75f48f68d02e40154784e0708b651941c9865", + m: "c884f57ddd079e564bb026abadd126dbbcaa3d077dcdce77c188f7117738e439", + signature: + "ec4e90de63011ea5a254f59180a8f76671ecd3b78b2acd5c493d4e71b047a668186bd2c5aac948291602a7bac5d01dfbbd81f6530108d15e8500761f28cff658", + recoveryId: 0, + }, + { + d: "4805dfefad0f296d3dc23bdb5839f544b14f761780432fb6ab345438543a8c4b", + m: "36eee68cb8c5ad6b52065c304fe2b8a4a3138d7ae51bc0c95e4a4a00f0650944", + signature: + "6397eef71a647867d54b92d52fed83e90dd72dc835e76bf6d5a47ca29370ff80269fdf7b75871c0e754fb8e3cb831583de65a7c120267e0f53d094936b48c6ee", + recoveryId: 1, + }, + { + d: "4527797f18e643baea949279cd91634ddf8c1941d8e6fa239374109dc8f21298", + m: "7c0df6396f469f6b295f2ed1519f1f759ca8ab5a8571a35280b9e92a13ea0392", + signature: + "e9c93a23984ca1b640ff451ae8dc03dcce7761be064186ca9fd7d2f956addf854a8b1be42866fe90667ea234390f9e1459bda2ad489dd9627a2cec72064f63bd", + recoveryId: 1, + }, + { + d: "6f240d19a59dc4692537da2b51af08d59582f920a1dc517efa625b567221d45c", + m: "636dce1f9c795605a1dd930a9057ac9d981b39d86f6fa54fb275ed2653fe08f3", + signature: + "3e35890c8fca2d848fa910bad3d3d286792918602593b8aceec3d75782bfefc9254a14705e0c7bc5f5f2bab51e29d4b66cfd50c8ab0f9e4335ca3f5befd378f7", + recoveryId: 0, + }, + { + d: "6eb42895bb55751d03f86425f271659069eb13697bb18794ad059373e511a4d5", + m: "8d7da09c1f7ae52523ed6c8684d147df8b70e0230b13ca13df5c72c5ac526b22", + signature: + "ce5977050b4dfde4c05e91ba37f046992b13b613bffdde9d1755aa4f06a8e78d6e55fb317a6937a3bee4a8a07a1273387cc3e7c787e5aa7c1ec0ba95ba51e51b", + recoveryId: 1, + }, + { + d: "5f67a8e1dbfac15c34c18ae975a64ecfd2b630d08bd2c7973eae60ce995f63c5", + m: "b7c303a5c3a93d22d4935d383a898e8fe829fe4c000360cd6b31a7fc828d07da", + signature: + "73d962416fe8370b33456c344aadd550004ff6570fbeb5db2a5e68e8b98b048d5934c9b644027d69278ec76ec00518e7b08ff53be1e05565e0158e610e038b73", + recoveryId: 0, + }, + { + d: "e08f52518f23d712f5ce350a31fa38130f97fac80e20952d5e81fcabbf5ae0b0", + m: "9d6133d6f8e94953b22238ada8b3eadebcab141854be2b21a1b7b1358bb10a46", + signature: + "73eb0657ae8ad783f96e7ace5a31523a4811ff0c435491b9b66829a313b774e778acb7c5e559827f1f281d871aeca54546c04328681406b0a85cdb2e7244bb70", + recoveryId: 1, + }, + { + d: "6225cc3f56831273cfecc3e543e9e095689af389850d974c22c6d69d6efe0a93", + m: "8f1304e1d153811b3086e2b1fca68dc0a4eac41be460874e767d5565a9c7deaf", + signature: + "07f077c496289fd24864f55a9782e9f8d0623d6987e89f4527db66bf031512ab06c015b4e6248e4d339382a801545bd883c41a4ac52b33adb70751efcefec7fa", + recoveryId: 0, + }, + { + d: "637f21b5c8fa7eccd3bfadbda9a73d59f837ef9ff83e6151566e29a028164b1e", + m: "8416bdb8453dca07ec5eab1fe833d0d03ccd8b5dab74fca552cb2b4f3d74cbc7", + signature: + "3317e923906932b333198c31d05b5663e33b7d5db3b5697375e3e733081c45a036c1a02b73c855b63667a79eabb891cc0af19ee7a38644859700c593f3be5df8", + recoveryId: 1, + }, + { + d: "794fe5b231073c2670360d61f57fc3152ffba7e9f1e4dc224d2a97aa4025bb9b", + m: "af202b96a1f049fe1c6c035e6096b61816c5379595a4b1d7c58806d9924d8642", + signature: + "91425200a4f16712412c45fbf86c498bb8e1aa95f6c30b9f6737d15358003337642abf70c501e9231dd95ac54d9f1d98a16ea9ac80f9685a37627ce22484c5ef", + recoveryId: 0, + }, + { + d: "12f4ae0691e5dfc5d4df7a9be013365ba22f0d687d35288b77f200b10fc8b26f", + m: "d7acd41aac8a93d3ca17dfa427651e4d2904fbed11488d559cd02092e632c563", + signature: + "7467de398a8bcd53abb5319ee8299a880f69d58cebf39be5d15753764031ff1e2643b420731a1134b45a6b1fe4d3c00733824bf2421bda91da1c46ac56daf3cc", + recoveryId: 1, + }, + { + d: "b8da93bdb328813c4a0324af6b3a5d486186612b7c66fe5b4d8b2918bd5aeb99", + m: "af88dae0fa90f416f0903aaead790a6e2752626dad1bc44c212da5810dc99e16", + signature: + "d807ad8037ab5fcf26b2205fa04cbfd8f9833f2f5ad41d8a0702c77ec0dadb0e6a14718d2b8ef54d54011d6207141150acfcd2f609c2cb2b7b63343f27ae08f2", + recoveryId: 0, + }, + { + d: "9109efe99394cd5749ee44410e5f701aa0e5ac890f8e952eb826b5069057c04c", + m: "30d71d08f0116eded9bb64038d0f380436581cfc1e6b56f2a6990b448b6dc0fb", + signature: + "22ef09d667bedd987cbac02abeda86e86696933bea182158b3e169fb2e1fe8fd0d5d1a383b14971c26d0a9fffcfcdab2fc1e4dfc13e2c62983a1153d494dc7a0", + recoveryId: 1, + }, + { + d: "43e6ec34a7154801c68f9cb08dfeb264fd94133a20315b6b11526dc209ae54fe", + m: "18b9e3f81a123ad26bca42daaa1795de42bef9e177151c4ef6e5bd67016b7218", + signature: + "7aabe58bc6691bec3c99d7a1ce191f7d208ffb5d6dd7040422815f7fe07776d7788a1fdab4cbe6b52a57c21680299a88ddc4eeed0e823a0e3b16a630e77ab79e", + recoveryId: 0, + }, + { + d: "c5684cac05de3f33e8304655db4787413ff61c520ef87e7e8f334358fa00a789", + m: "590dee51e87ea0d3c79f5f51064cc8bdda7689aa088a511587cd23f923177c0d", + signature: + "ef7c0a93fbf5404eb11b08602619bf998b56939115b6c34aa8b34862ab9b648c2e50aabb32282f0c33c6a416096d395f563501d664280e78749e213951cf975f", + recoveryId: 0, + }, + { + d: "d37b3a77ddd9068921688ad32ae63ad36f2284e0b85744e292de862007944ec3", + m: "539139467bd3159f7a26a0be699c6e8b205a1e6bb7d6728d5342cc428a541e52", + signature: + "39c7bd1aa81f0705650945dd7db1df0124df95ddfa8497b8073f5a287cd96af22521e44926ff5c3f8f121aed9fbfd72195c9d7523990779f3e870f637d10869f", + recoveryId: 0, + }, + { + d: "8acefd5d97141c624ee3807ff806fc272f7c193ed199bbc16898831c01a05c09", + m: "91542b6fc91e6b5869e20a429e8c528a9ef60985096eb17be49c0adcf90acfc6", + signature: + "4d31ecf643ccdd0efecd4a3c90d062fc59e1ea64ad01ac3467d13e97b8b20a1e6d09a234d7c725c6cd20783b06b570dc08f110865440e53a0d66ace30ced427b", + recoveryId: 1, + }, + { + d: "773e8cccb4ebe08a2f4023778905af26f3cc0c4e003ea83d7b070c15b6d138a9", + m: "37bcacea596d52bcfbb81565544ec3b8d7b2d0668329bc718ba1b5ea39b1a542", + signature: + "7b1e458e05065e7695a3d3c6671c9c5871d5a2b7b426a0c63ba03bb65a803a9963784a673b2a545ad723cb9dccf8a7cd4cb52c9bcc3add37d41c2ac95205d350", + recoveryId: 0, + }, + { + d: "cc9f5ad88678b205d27388f586fc4ab89771592254c69ae0cbef48043876ad8c", + m: "78f1290f3b7a65c67674b420fe5d404c98a73d794e283e11ba6956797748c7fa", + signature: + "84b857c21696ff84c81354ff0d050542441a08ad7a581373d4a82c6eb10d851c4a9c35ce6908f89428eb03a79ad0c441892b4d87349fa0b1be10faaf783cec44", + recoveryId: 0, + }, + { + d: "47ecace49a8a305de07d71895efe45ac6a6c23a57ce82d2fbee20f815c60ab2b", + m: "9ea78db613be8c9790e5578102bc97a6476785978ad8cd9d596ffe536e7e0a6c", + signature: + "232d7b987cb34ef37137cab93f5650f1556b1f092c3f8eb954eee094659937f16b3449d644048b55a230f3f0fb07bfda0abe091fa8ebe6067a64ffb90cd8aa04", + recoveryId: 0, + }, + { + d: "57d58ddba12c9758c81b383a93ef97097233b1976018908d41ba9374c213d475", + m: "86b12c810ee2af095724f21464d0425f975e54a95a75b710aaa051e1555a01d7", + signature: + "af32554c04ffd17d87ef1bbebd6fbb94c82d34d169f65c5b8a3a22268a3cd9117b846dd9122544b6d01d798d86e2161549d119fa39230fe99bfbf1045cd08c79", + recoveryId: 1, + }, + { + d: "1dabfdf2561c0d3edcb44c4a5ddac4f92c7931a6a977748b3a3a497760359cc0", + m: "f96a206185e14b1735fa24b1777ed2c5dee53f50f99cdaaed676b6e9c697dbc9", + signature: + "4db96976dbe02486d72e4e8ea74b44910db6e31134d794b3f864f9f98458e1445e70d6836a2c8c6b57cbbf790fb7b75214e7af1e7b6823e7a8dba01e565dc410", + recoveryId: 1, + }, + { + d: "4b31797e1a9ec44f39b5213660bd6665b4171e528c27861694dabcca3db20614", + m: "a2b3d84e5070168ec75e9ed130e3698ed3912d05881a86c241ed87b0029421e3", + signature: + "12cb718e08220fd4ae44c906353cfc697ea2250a9d8dae1d7c97a4548f739abe7850a3950fabc12e29ee2fbc00e3f74e2d3268824ce0d356e655ab9bf93082c8", + recoveryId: 0, + }, + { + d: "9b144ae6f18ae5e0dbab08d1bf041c7283bb5afde50139f63d7a63587f58a3d0", + m: "526b84405be973eceea1458f70a5d659b661607b00704ae3dcf18b9ef2b17748", + signature: + "6381da0309075d25422044a86f31d170e3a7215590c868e27297de7bcde2245e3bedd2e10d00a5ecf8c8aa2692f4e4d7547dc1b954ce60367e30349831219450", + recoveryId: 1, + }, + { + d: "a4dbe9fc2228e4e1ccdd953f04c453e727f8b1a5203468368e21a4ddb6aa5e42", + m: "fdb3fac2490cc3aa26350be4c44ee3d2206f93b07776d137909d390309981919", + signature: + "d43d591dc222fd3fba5c2591fced571d20d0e4064ee8fe7284a1800b7494797a32f8a1fb2cb966cd1f35ec147270e186e63bca961fdf2807c3bf7257eccbae88", + recoveryId: 0, + }, + { + d: "8dc938971d9323eaca0ea76450888d32057f2046ebcc6724b9bdb412410ffd43", + m: "bfcf5279040aba15397f0d7792f4d1753377a567251877abd8373780676fdb23", + signature: + "974ddea1ae28cf6250ab9f1c804a264e68255e40b9b8d06ba26d2ff6dc4e86b458dee5d64a822b6158abab5962f6e98ad9e68f70b87adbd071417ebbcdd79d36", + recoveryId: 0, + }, + { + d: "1a3a11a0c6482a89f8e0a88274517bb722e57d179705eaa752cd48a526dadfbe", + m: "b336a254434520492a80848a09ab126f8c9acc6324f692fcecd6af6dd322f004", + signature: + "fa4ef136a6fd0209e48983bdd905df85710cb8ce411e8c5c87b389964e9e9fed2aab3eb0b3c98a95e4e9e7bd3791f9c3cf7ba1532cd26822eb54d31347996882", + recoveryId: 1, + }, + { + d: "ecda39e94ff414ca4fc0a257608b8bfb4fc10a3e81d92c3306557c1b5e033ed5", + m: "212b40adc98c4fc98165607dafdd4d810cd2664f29c69fb887727f1d56d68013", + signature: + "5e23d8ea04dc3a43cd112247ac93c82722c07bd2c2ff047e04dd4fc953dc842d6abbff634a8d51feedbfd4f0195889ac9fca0c185d5b5574634337f9785b902d", + recoveryId: 1, + }, + { + d: "d2bcd78e3d749ed3dbb14d76eadfdeec3e92533128890588618392faaf2a701b", + m: "50ea76ec0d433847894cb318d55904a78c0772c4dd4607f58e31663c01d90f9b", + signature: + "a30bbbc2fc6d105eaee6440f55ceb560d4d67e0ae44e6ee63e747e69c80565f914eb07523e088be0cdb4eb903700c0f5cda41a6ca231c912ed29983afff719fd", + recoveryId: 1, + }, + { + d: "6802493f3c708d66daca86c0b75bbfb35067c2912285252991a5b2dd67cdceba", + m: "e8abd983c60df8ba0da32ab099db82b3ccc142841803c065569d4b92d9263013", + signature: + "9d7ab7717b77127bf0961faf8ea43f3ba0a596c6737642573a8757b771c2d26b2087f382d190990c92d5406ad4c608d147918c1ed2e3f161a8ebcceba489641c", + recoveryId: 1, + }, + { + d: "825089d7c6f1d14e56ddfa1b1ee23ebcf127c6cafb73de1eea1b0b2a12b41fe2", + m: "e616ed42614601c8eb23a6a405f7e15a7959e7c86c3159fab658e142d3cdecda", + signature: + "1e3296f5ef716dae43456ee66f65065df897f0e0e1cc3a38f0ee70b94a4e677931e9b35e40bb96221b6e68738c668458f5f0d40fc34a85eedc6bce162b7b2dbc", + recoveryId: 0, + }, + { + d: "38074830fb67a07b492d84a31f5030a65a3fef1a958e6500420e2d83cc806ffd", + m: "953a29f1ee9b7754f029840d2ace93a829865a7d215785f9ed4ede61fc52a4a1", + signature: + "05a2c8510478ccda1674980b2931aa318dde38e4eccad143ea8d8d745a4f56723ded26414afbb79dc1642d489c753a43797d2078dd3d1663a47f460b16bfaab8", + recoveryId: 1, + }, + { + d: "413eaa4eace8326a4b0aa78bc3eaa430a2a35055d206574fbac3b32855a7846b", + m: "0a9eda334e7183bf17122563002532c520f8bf21e3be8bd705458a41a63eeef6", + signature: + "4f011cda65276811aa36624a2bbd95f4979adf9dd0813390b74077d8a6242c047c95177f85f115b58f7f50a6a36ba65cd8ac2cd472d9fc27fdf6592b8ac231b8", + recoveryId: 1, + }, + { + d: "1cb3db00fc66388bae3f41f60e55fa3a67f36fcbe6246a2e68459687287ac3f2", + m: "232f2ba1d8a54079a15ec7cc92d60f89af08728e736a72cab29b65a7cd560532", + signature: + "f92f8d121fbfb71a90319400cfb76f1eb73b6e9d9632e95f8303401bc10b7c35023a31217d3e454d319a3dd7163b85332c9b20b095b1f035d7eceda18b78fc19", + recoveryId: 0, + }, + { + d: "7460f8b264761a13ab16af3231b6c5cbd47e2f9f47ac5665bdd28403967d6ebe", + m: "5f0ef4b27291f19792cc2001cc20cc73b65dad2a6a3364e0fb6fd2363a91116c", + signature: + "fcf4fdd474e1aff7ab81032ed2b8dcaa1d18bec1ee06149041c8b676b82afe2a0468936e1ae6af4ea0a803ba395250de7dced7659950f7862fe404ab68fc7345", + recoveryId: 0, + }, + { + d: "001f918fcde862ba8a166972a0adf4b5930720c96f35efef2b2e3ccc170cf57e", + m: "60bdddd9f4259bc095e9cd4fb42410fda3f84c29427627a1e2d8ae878d9b3e5e", + signature: + "a2e57f92296c15a8a1c307a05ae96e8c6ed7c0e424203dcd950b5510dcb20ff3054222d54e758ad7a12a10184847cb165703e3ecfb7c3a9d061693fe0483061e", + recoveryId: 1, + }, + { + d: "487c42ae8b49d046ad0e8458c38c606c56a81502cd647e5de7e967047e415901", + m: "d0b94911ee533d06867de71e40e49275722c6d9de4cfc2e02e95529d7b512d2f", + signature: + "2d5daa6d3c9cfa377a4c2cc0eb3578dabaa78cf3bdac470dbf59452539de29e950c7f49e5db7f20b86d9cf14d94adbbb2bf1ab5e3b57591ba7b94ddd58075a58", + recoveryId: 0, + }, + { + d: "d14eb12dc2b04bd1f8c9d85ad62d23761a470a0a6fbd51f416f5bbbc4f21e4b7", + m: "e2fb5401ea6adb07d85933bfaac741747a454221965d1811471af92ef85f7ab1", + signature: + "02c60a94f29c5f78d71dd5769a82ac52eef1130a9a292671fb893622f93352274898ff999b5f6c6bb549057a059ccda34783c554caaeeb2a73d1fab9fb2954df", + recoveryId: 0, + }, + { + d: "59a3a221ccfe2fe8a5532dcb5ed28f39616ff4400cd5560007f5b8b9004a8339", + m: "cdde3133e2073a3fa01ca96efc471127dafecfa28e25126ff98031efd41ec8e4", + signature: + "6f450a977d7af01a1a133e4a0686151bf23c21122e455bec1ca738ebfa11649d5f3a95204c2d942cff9dbe3181b6ca43ed7779608af2a167f1fae3a06feb8390", + recoveryId: 0, + }, + { + d: "6fa525d07bc0b71ec319ae165bb219b079f3b43c954af61f1729a346a7591724", + m: "e38c55fbe47cc83a651017e2031091169b960fe0d3a8008ce0fa40691daa4c55", + signature: + "c6510f56b6b17a238b55fbf8989a67797d76f4e4238a21fb37e565c269571b846267c6a1bf42922c5401e5d44ef7b80dc517945d4edff5d6dd34be119171f843", + recoveryId: 1, + }, + { + d: "361cbe8c1617f6cc0aa9ebe9262ac44e92f823cedb3772dde3505b0cfab9d756", + m: "a31cc391cb972639485b4e0a8f2824dc97492bbd5bf4240a6cce305ea3821d0f", + signature: + "f629ba6802bccb5533c3927d1e8f2e604143c7275a63bf68f65019d16d87d5f5310f1c0002f2cff5114dd8e287b9b7e556338635b3af8deb714bba6f795856be", + recoveryId: 0, + }, + { + d: "73118b8be785cb6d277696e0085c3188b5f026cdebe3dcd1fa880b3956d2c7cb", + m: "dd2b4cc8fd95081283d5ce4acec969c42fa62923cc140282f586325c7f29bd08", + signature: + "84a5f837f9b959c3b52fed4dc977ae054fb110b7477cc85a8019cac17aa90c9349ff02bced9277e39c23d56b945402ee933400ab5919bbf36fdb423af99548fb", + recoveryId: 1, + }, + { + d: "fa5cdb8646ee7a9071ea80c02cfc537a8d0079663c1458bd18ec94b6b8364159", + m: "22bc6dfa4137d9a2141fa2626de19c4146b169b5926e27c72f518d3a3cbd9ed4", + signature: + "36cb71d15111e9a119e3bfe2d37acae05105e2003ca0449e48cb8a64832966443c6dc9f2bfb254b8777c3afccdbe98c5b7eaeadf11c883269e41dbf4d9ad9db2", + recoveryId: 0, + }, + { + d: "823910b84f02e8bce69e4ae38e32498d68723560caef42cd3e19ab35fd74c112", + m: "c34bddbaee9e8078a5f9e7e3d858a9dcf02737c2807e45a62e5e38b60ae6b0f0", + signature: + "a3565d3642af711a7edb28ec05acd8560ca19008b022d3bb1fb837599512e8731c6f060b24aa69b5a78247be4bab1d7890d3d8914368d7171c8e820feb1b86f4", + recoveryId: 0, + }, + { + d: "6356d68882159af0a06e0bcbdd9179546233d576f9e49e03b228e916351ad787", + m: "1c4f60c49a62731608a52bfea9fd84c4e6a21b93c027e027b9568484990dc35c", + signature: + "930174f05a808a8d3ba0a6123c5d11834ab6a852b4f7040e87b2f47b9c71f9c02aa0fbe2e3788da48d0b9ae8dea717da09a39409f0e08b7f2e052b1329cb07cc", + recoveryId: 0, + }, + { + d: "cba681bb515f6d85c11d070a5715e10b7670ddfc550e676d7e0912d6fbb01b0f", + m: "dbf902d476f53398f189c2cc0957861435a416c8e0d6dca4edb9f88a6c65925f", + signature: + "9c4b72d5f9b0880f6a506d20d24943ddb0cb3a399de7a4735f9dbda14e57ca7b7199b0859167484f7afd92040ec84525fa9551ebd394f467e2b940d163adab0d", + recoveryId: 0, + }, + { + d: "12daaaa73123c86b6b608c1e4f0614c2bcc42a969cf717f54010c957b94b6adf", + m: "df886a2d7ce0be4f2aa02595410f2236d0227fcada84932648652483f1ac73d0", + signature: + "d23bed65e7257ca4eca20ef1ce28e99d89d3e5693e705851e14493801e14fdf6372c5e2e7e0498beb405097fa789e5973c498bc6d1ffe822599cf489e1703288", + recoveryId: 1, + }, + { + d: "c30c89b0509e2f51720f5b007f9b5519a3ed4ac1cc73690c53dc6093448a84e0", + m: "c8e66b76e041469a60f66e84bdc9624570e168148c763dbf8a6a7f3d1f10e014", + signature: + "5a0359d791b96fe251957d21aa40a721eb55468e0b836d225199a503894aad123dfae18343c6c9e4e31c0fb200304117cf48e1152a1ad004a394ac3a7bc909cd", + recoveryId: 1, + }, + { + d: "c75b08023aad23db056083635d97693011b72aa5e0a9af7c92b4c247b9f3dd3a", + m: "4218165ed6b6035861ca8cf453b4ba55111f42380e4b2393184692a93dd17ce7", + signature: + "3b01fc5a7b0ceab3d485cb211d39e6c7d2dcfa3dfc413c1f28f898e0db796a5c3076df8098528d4a7f0be801a70e2b0f228e004129692c9c408d89edb54ea4f5", + recoveryId: 1, + }, + { + d: "8e26dbed2b81b672bbde33e97d320449985855c6022a2ddbe76cd16c8f2a80db", + m: "aaa315bcbbddde4733cdcce0a0754b534732af9d975ebc8902c5507f0a919aa7", + signature: + "74c579bb17483e07ff9ec15bb3958bdd1cd1b068c06f5bb541864bccd529ea337b7dc961f8ce7612a53fb2afbc7d487fa6b7a8b830782c546388b23efb32fa13", + recoveryId: 0, + }, + { + d: "6b2151bf205637d46a3c35a8ac44d8cf3bae7b65b7ae5820fa39c92f30ed7b46", + m: "c36b1038bcb5f8c45fc9daec534f0e4ecd2da0674198767633fc9eba6a9b2649", + signature: + "1c1d7ff3af0cac2521133771f4211bb346947febb0bcdc82c68ad38afff5be6807233fb4f6e2fd43538788c18aba3d813998c2f0f25e520451fb8e33189bd5c6", + recoveryId: 0, + }, + { + d: "b80259c836721d981da31b30fcaa423e778f5392a8c30ce23e42f9be3536fa33", + m: "6f812f973033dee18a09df751632e0f981cc9550419b9344c543fed8d04dc598", + signature: + "d5c3d2e61d43a22b3b2af39e1a08ab254fed74043673e7fe81f75bf0c87f277e5162ac06ebb9c4fceb187655bf55d0ffcb08751795006bcac115021400c2d452", + recoveryId: 1, + }, + { + d: "2c6b7762298f601de00a7e02a4667d02a020af0852ce6ff015d172c6a7d3ba03", + m: "1001cbad6aafee084c1f5a7774e2899bd985749a89cffda2378f119106111d75", + signature: + "cf656607b9898d18990f04217bfeee3883f80246f14438161a3e24f63505d0e667bf932b220b397651d934d924e8d8f743a52e926ccab0cfeb97a4cb98f39556", + recoveryId: 0, + }, + { + d: "85e245f3c98a2d961765858c29d05c689a5a23bea7573bf010ba43d94a7fa422", + m: "0250c02adf03e1b9f92d337eee6850bc172f4c31d129a7f263b42f78edc9369e", + signature: + "497cf5d663ba8f78188ccb1b451fb3a9a00569159d6c301dd306dedf97fc55664cc0ede3ddda67190922e16176748184a0e0b702592c69e8607177f07f398175", + recoveryId: 0, + }, + { + d: "dc914f65bfb4ce2eddd06b86d2d204268794c2bd272acbb0650f4140922d8e4e", + m: "18799e77e902ac8206d1172112be89d9d75897aa85664930c9bf5aeed4e808d2", + signature: + "aeaa2920cd5edb6c922b858911f72aec92f4f42caa2ff492f44736e5a18394e66ca84de635f3adc967d98b422e8a01229164bb631d94f5ed14ab479822da0e6d", + recoveryId: 1, + }, + { + d: "63c242c5cf7dfd7f65a338f66960b873245820726b90edb6a681e0b95e38b3ba", + m: "fa0edf32d3db77b34af5611c62fd6874512eda9bac1db0d0341d2f94e4f9334d", + signature: + "cc1b3c5eabbd857cd53f06812d5b84511172e0cc5796ce6cbeda5d92813aba6b2ed6a760b1e0087a720ac3d30d57b4517418006d25f9ba11c07663f08105f1fb", + recoveryId: 0, + }, + { + d: "22bbaea634b71e9c66a49c501edba07afcce152ab0a18fe700fa2db47145dcae", + m: "130415e5b5bf673fd5eb35892f3d4511689f6e8255c167bf8007b6eb2be6d2fb", + signature: + "7c7ebe66c28218b67bc60c0504d9184f88b64170d415731558cc4e79d3420e971704046c55828d472f6a98fbed9b87cc748693716a5138cfd5f571197cb7d7dd", + recoveryId: 1, + }, + { + d: "5798de3a8dbf2e986ba83924a9f5acf8e39b0dd07546f5c812860c066b304b54", + m: "209c439f049f3df8bb5dc39495e608ca5af8db34efec8717c308d4761cd28b22", + signature: + "44adf1fdaf6f180c938541a38ea925044cc0db12af271841133e11ed474105d015b72ffd6ff5ef65384f8bbcd654ac875276e067125b2081fc48cfba4c95fdc2", + recoveryId: 0, + }, + { + d: "1305c2272ca562dcfd795a8066b858ac15421acb031e540fc80eecbb62c362f4", + m: "7a7517384c8db428b1c2e8fec2c0d04abe56f8c2ce15ae9a67c1eb18b80f9e9c", + signature: + "fd39f4404cefcfb61eaa845fe56b5c76a661a7ad1fee965988e992ee75a18258041509cc97e1a6ab51e61516b6f22020fa6b0e504c9afc025479e8816938a12c", + recoveryId: 0, + }, + { + d: "7291a6e14b1d11b2fc11ad0c7cbbd7c043273af64fbdd57711f16d69b02ff7d1", + m: "37a53d970a8e93cf4a3e6b384e6ec27ec2fa77fef19b845b89100c78691c806a", + signature: + "c5b0e1b0393a769985cde0bfff9b1dee0a3667b09dd3f6dc84264bd8283841c969fbcf1a02a9825c836da669c0b4862f1095e88810df19afac38fd25bbeeeaf6", + recoveryId: 0, + }, + { + d: "5008e9430e1f1d9101b372d99bfb90534a156e8f625feb5a66575464a6aed10e", + m: "5302463bb485dda04e05c20e255498017712d9b161a4d7dd3971181f53cba13c", + signature: + "04c1c4085feab6f0fdca2ff6f8d4cec48363cb2a5cc83bbe52f538a65059359c5eb4ff158e68d648f39e9e6c6c39cc843b3a1fcdf6b8dd2e2d5a53fcc84fef0e", + recoveryId: 1, + }, + { + d: "c19f2a0f7b4c6027c9f3cb91d36cab81121ff85b875421eac173e68cd84c7862", + m: "f8cf07895360106686807cf22390b212963a1f3376998536d511b4cad7e55716", + signature: + "d09142940f659a70bdbea433bf0b0d7c2e17973cda935b70c392b38762ad5539779d7e1c42f7087f678241681dd5270185a320fdc7294daa86ea38353817963f", + recoveryId: 0, + }, + { + d: "02dbbc89a732bf2d245bcbf1ea5038f558b6d5fadf6272bc54ed83172e13b1c1", + m: "6f906a4a2288de9aa15f6508983f9b418b2430c1b2f4ed21a409589e0ca8cf7b", + signature: + "476a118fecbec42d2ae6bd0e3d079a11ffde3aefedeffe0822ac944b3fd32b041618239338bb06772a54fae0514e2aaf0feff2851a552d0fa5052f61a9a516e9", + recoveryId: 0, + }, + { + d: "2841d86f57eb53cfed341274d72a125c86563861cfd74e3f6ec6690d58b93975", + m: "fbb398aa6bf04f3c12fe3da166af2df3a44a06d8280a21414b90e89357adee7a", + signature: + "834458a61f1c87a6a143ba21dd13dae9634bd4af2995e7c61a21d6c9f405ecf626880467786615c03b5d17f6ab2166de64ad4118221b97cb9f0985ed4fb0dc6c", + recoveryId: 1, + }, + { + d: "6571464fbb6d2fd787d5cfc877254947ee013b8a283fee1e3b86bdcf1fc5ce2c", + m: "6ddb23e1c18770ea83ab68149723e0b18e90d111179de8a0a71562e9c8478088", + signature: + "eeb7bb2fcab469cd1c56058f7025ad88f5aed2b3f8b2cd9c037cc8b1b9b6d1db0b615945b7725b8f4b84c335275f2f35d43bc363f3eddb2032aa4c6982a23fdd", + recoveryId: 0, + }, + { + d: "22c75821f3af94f5ac01a63847f36914fe3d00e25208dcc1f6f4c1861e440f22", + m: "5cdf535d2511f781d23154209172e037acc00d20516bf96e818abbf5f2dca8dc", + signature: + "bb4092ff69278fc2886e7b90dd9252cb9bed706d2e7a2bb9d3a9e97085a64f486b60766bd52d993e3eb03583d60bcf8ca9f1702b6e3bdc65c3abaa41a37f47a5", + recoveryId: 1, + }, + { + d: "71ae321dce855e716a2b621bb257f2a4fd55c3de66e66dd551e4b779c1734bde", + m: "c0095c11f2b87e754001037b4da8d4be0fe0bb90ba7a14e5a487e057e08e51af", + signature: + "9fe3afa44bfc286502f5ca9e5d59f7287c1c30dce68e9610b8769b00e5f887561accf307c5f3609274c400bb3ff69e8df6fe6b2a9d9a5a44f9776e65e77c50c6", + recoveryId: 1, + }, + { + d: "25a8c1c90acc4b6a4cca57ed6e6661c9e04d604dad54080393634de041e2259c", + m: "a70e44913a5e2d764681eedf45e99d655d4a97199d99a9cde07ab028d9d19d44", + signature: + "6a0abb2d674d58687ebcf12af484e2541778225ce0174a6e10d1fa901cc2eec272259f2f64cb0a2272995b6b77baf416dc0ba96a0d9600b216e189003302f461", + recoveryId: 1, + }, + { + d: "b37107b51dc69bf9acc79bb65e4d4c8c724ed835755003b39297e4ea465a385b", + m: "77dca07131f6539b4502621ff0605a9a714d8b7143aa2da30c567e42629a72a0", + signature: + "790c5fba1a6e3fe2e2f646d7017cadb1ac6f73c33bcd906f6f7bd8e5a4310d2e2c3e5f16df877168871ff2475232b0eced1c0567d87ce7994b240f7fc259424a", + recoveryId: 1, + }, + { + d: "ce4b52cf3965ee77fe1bdf2b1baba902c151052c0f747e373476fe127f6004bc", + m: "92a0442bb07c7c45e7299d1aeadddcf3781b2e57b0d18550599a417a0220edcb", + signature: + "78972dfbf2a79fa879b1480afd91e2b269047e5d5f6428cdb609a77e4c771e235f3fa6577abd2e062a43fbd94dfaf04427e5975d4ab5a8915045f1c7e435a209", + recoveryId: 1, + }, + { + d: "26faf58bf9c12b2b129b28e69967cd732581841edb3af4a77d8c54888669a5ce", + m: "45d8a0dc72c173a9164c385e930a538f45ea26ae49f2026d4d86de8982b3f951", + signature: + "d5801ba9615fcac4d8a3db150ac4f2359b862ed1194d2e407fe08ff1e94461f00c2a215a00df4a86fcb6b3b38d4f316f12de2171d518a5f54020b096645d857d", + recoveryId: 0, + }, + { + d: "cb3ecd585402cc1e2292b1d533571e631cb7867d9a33631e56e944f91cd0057a", + m: "dcb0b75e523825fe27d3b5feaa3221fd4e411082dce288c25e4f74cf387c76b1", + signature: + "1aa999df37273149ce3fe6862360268667a4250cb4b238a2fc809aa2ab28801914c0584d2d28bb64ce4e2bc170648519ce5b96a1a548ab36ebbb45e873c7f5cd", + recoveryId: 1, + }, + { + d: "cbbf73c4d23daa7d96a9e8fbb0f2992f774236b36c17ee6ce557fb6daf18eafc", + m: "b73f79fd37e926f6be4dc69826a9d88adcead2f62626feaf4620e3081257aeb6", + signature: + "cac8f193ab3a45c4862277de030e7b877e7ea13f2eb7080538ff7edc38b41528632bce277ea8ade2f7185c294e24565d8329ac0b58bdab9cc1fdd6c61bf393a5", + recoveryId: 0, + }, + { + d: "6c2940eea4275e69bf4ea5d54ddc551ab18692f6fbf32f11b37c21046db879df", + m: "a4c3c5cef3b7ab8f38abe466acbc133da79f580df2be7c3c9f5dc7523dad7199", + signature: + "fe9f1b4c63e9edf338ce6dd0d49e287d647c3e8a8f46c7ffa1e7e500c156306c7b9754595df293ddaf26f36c20c237633a4070e1af662b8acdfb293c7c221439", + recoveryId: 1, + }, + { + d: "f4fe325997f2908de16ed4266d74185bac13e26052f1cf71336c410ee2f41790", + m: "8078d86fabd55b3088e28954bb78cd620724d069891b3e9bae1ed4968fb4b2b8", + signature: + "dcb0d44f8119e3dd61a1c71fe1517c3ab42f57c327b35ccd615e8c19ecb53ce42a5320fa516bf45676489061205f63ab734cf861d2e41fa6abf64237f1826bbb", + recoveryId: 1, + }, + { + d: "765e8e4153cbcc14fd98a923cc5f77c5728f3e28edcbc25f7bde87f715674830", + m: "b18ce4b39e5fe19744eb2c03b7c62a195690c3201db8855317f9e1d34d979726", + signature: + "f37f9e4cd81bc319de4225c94d4a40063df4f50b14de5fa219c8bd1cea877afb4598c579aab1c8faf254a3a7ccc121782cb5168833e45e75abed3392dc083a38", + recoveryId: 1, + }, + { + d: "e292a6f4704cb59a585743170e79bd5d31b58fa7b58459f83b31c5dedb262db0", + m: "4b87ded845a4167865e9dc36e9b46823ef08d59a28baeb02ee3f29692e57cefa", + signature: + "f5f862c031e75b33db71a6ca8db7b2e7d600d554ed2d9b414dd609590244f88a6a2520f383e5b081386f8bdcd2ac4952f4697d625995c720736709d47a1bb8c5", + recoveryId: 1, + }, + { + d: "6af72eeb717c02e1dee8bb12777defcdac977bac298cd977ccdddbf2534f4228", + m: "e5055d34fe28476f05c992d95058aa51d96239997c8b81c68003b0e1af73bec0", + signature: + "9d121ac8721bd236f4c73ef373e4dc4eff25d4ffe7fcf318f7907e48d453262904e8dbbf20bd22f98f8bec2033afe427dadf8b5a2fe6bdb2c99c72ec8c3702f3", + recoveryId: 1, + }, + { + d: "0a40c9540c017dd63961540fa54ac1824033ee125146853896e0e2a771d59191", + m: "4f9979bf3f58a8ce517c4ae1eb138784e3b3033f83ef868d93ed0799d7618dbc", + signature: + "0ea6b9112263c21edd5a46e242666b989e2b4ab60c204cf9517918e8438414ca2faa7be08a36c91d4d38af4bb6f79eb7c3f17aa9cc51f9699e20883fcc84bcfb", + recoveryId: 0, + }, + { + d: "af67376af4dc4bd7abf098f2e39cf904facabb20fbae396cad4ced3ca7cd193d", + m: "2ca3182230c55ed8cf27616007175f5c6d9d1d785959d914a1dcf3a66b677b40", + signature: + "67e06263f58cc5a1a117d8b5f8f7b0bfe3d8caa1719e6f2bf77078fa7ec0f1936c291426d6b168da6de8ff39cefc27d31c3520c9321128c0e9c952a054ceeebd", + recoveryId: 1, + }, + { + d: "638e1ac669450135acb485240a5d3c54d9837013cd0e3f29c3b152e582a19e59", + m: "455a95192791307ee74e0fe8e2be03b1a34363434e6c7410f68ee34e9b526106", + signature: + "d3c9fb43de0824069f60bcc58d6bdd8043c4f8e11900aa922d0a7ef67d9fe6875ca83b782430c7ee04fdffda6d7f24ef575b6279faa2f8bb4f49661fc48fa5d1", + recoveryId: 1, + }, + { + d: "110b0f2589e29941e17dc4b6092bf66cfbf5247a3bf78516f7f9b40c9d48e335", + m: "98f19a86c4d53d1f5b14f62fb27ec02950b64a8b766da4ada55a442a51724cb7", + signature: + "6302fbc8c01f9c161e00d8e51a3a1e18cd4d56bcc5bb7d03078148e7c47641262dad1c802613c98c50b29980efb92c710a23d9185e43a7ae99dbdff51127ac99", + recoveryId: 0, + }, + { + d: "8a5e9d3fde3d95fa0038ec0db77c8527fe7a81121727c64fdd21538dabd33486", + m: "aeb438197b904491d093b00478ef3871ac46f3881019f84e0655d4d387673e43", + signature: + "db13a3c2a6e41a235405c8f687fa110fed11c74e4d2b35ed5c8f750b2600652d4197ecf56d9c885973d421c7b4de0981c9e623605c2bc8e0cc9e30778a38a4df", + recoveryId: 1, + }, + { + d: "8b7c23f758a2977f5615d4a2bc1ec11727a4bb7fea68a320a46166e19684d2a8", + m: "29f7d98ac78ff67b3660584b4f7d11deea0d2761213751ea1a466612e28d573e", + signature: + "313e06776f63310b108b8c1f70c87b5f52f02fdf5aadef6bbbe2b8810afa00673720d340bb2992b132140df3e582413cd0f464982cdc9eac2ff6023e53ec275b", + recoveryId: 0, + }, + { + d: "e54799b1d75f0a253be553b811a0dbc80ce87bbf822737769091cb296d549e2f", + m: "18a89ba5da9f70bfdb5e3913d936135355743676dec8bfa1f7f27c1c867718d6", + signature: + "c29669f91b5a3933a6209aaf656a993a6dfbb4b2358fe2fb17aec327e421ce2c4959a507e72a68480710506b2736dd29fd03a71c265a7ec3b852b3efc466edd0", + recoveryId: 0, + }, + { + d: "2c261e94960a9f008158690c00e09528b080127451b10c990978318aca1d8888", + m: "9a801e3f24f2b15a42503d6f422b810b6909f65296049b2c5afaf39ff347a973", + signature: + "0c21aaf6a67d1150c885fc55b8f1817f4b5c17d96dbc4194abfb578c288e24e438ee7354ece4dc1814aaec249dc1f9c0f1a13a0b58fcf7e6c710cadc4ac20ec7", + recoveryId: 0, + }, + { + d: "60d1d16760d5d6e81396627a53f890618a1c15f1c21903cd52706c100987d7bc", + m: "bc1b6a65777124578d69488c044f9d2b40bc147b8309c4f877abcc6aa7632fc6", + signature: + "604f2d5cd1accc7a573ea5c7f7439c9e92bf46fc882ae85da4d1a877cc80c6657d93ae0df0b60a7425f2545c4222bb96cff054652b62b162ea9535ba8ba759bc", + recoveryId: 0, + }, + { + d: "c0178e0fba503b2e2a40b9d07286b302919a59b5483d835d2cbfa77f0e7367b9", + m: "0f17514f64852bed2d0ebb2b66b929acbe0cd2945bfb176945170c608761e9fb", + signature: + "2de2df52c5950d93bc6265e20caac7b6824db9c37e383dbfd3d603f5c46062505bba10fff0cb01b6d9a0495ea85971c538c962675973498f2d218ce1fb0fbdaf", + recoveryId: 1, + }, + { + d: "caa4c32c970fecdbe2456bdded548104971aa96ea54ca9b2379a87c00d02bd8a", + m: "2d6561112cad9327de8eb686a161ee10debb35c6de3bad7a5ec80df80540fca4", + signature: + "e27e92461db8943632a1787d95254eb12ae8e6a151e9d2f689b00f7b733b5ab208b07b9d620be176eb3b731d8013d74c78ecb81fc17b684384923d3e36195c20", + recoveryId: 0, + }, + { + d: "07926c75fe207b24b13eed2f5190b5453a4b800325f8054f17336b9c213ec6d1", + m: "bb48c0a1aba3e1c20a03fe8904a30289eeac87256ddab80241503b524290f503", + signature: + "160391221116fb60119d24b4f1b10226a217a4b4661f15dabc52a0d9e6e39469637882933d7ac77baa48cd8482f6d21ddda9d485b9fb7fc332f17e3ee8ccb41c", + recoveryId: 0, + }, + { + d: "cc0e67653885fd3a42bc08d48e27f79949885e0717af6f304c0b3734c4ad29db", + m: "39508af2c349534c1a236c4782782fb210966980237f0515f253a122aeab7f28", + signature: + "69896601ba4c874ef1316963b691e54e4a94e9931040d688addc56f0ab0219d36da30b5bcabf014f5d498417c5c0092909ab428bfc64e87a31d672a899b48528", + recoveryId: 0, + }, + { + d: "1e74072a99f839b69d250633c44b5c625dbbd08595991c963289757db3e3c36e", + m: "5616082ccb5a8411311e6c2c70a994f9c924b70fa446dfd5e1c642fa8710f2c0", + signature: + "1cf05658d92805b4f6103c86dd17e0085ca77ec33e14cd2c73d334835863b6194f71004f5b90ed01d36da0c938311ecaefc6a9fb64c638b29bb410b45da47dd7", + recoveryId: 1, + }, + { + d: "331620e2309464b74a5fbe9b8195753a06e161edf6cd551c7fcc13dce50463eb", + m: "fc4b2ba59759cdf9e4f1a58b4f2768e3dd48a4c3851e1fbb3ece5d5ea63817d1", + signature: + "33ae74b55ef8500462159f4eec08b37554ead437e24bd48ad9f3d5d5c6239d3b02cedfac31dcd12660e1229cd0253fb00cfb3a2ee06f62391bcc5b1f1f25ee6d", + recoveryId: 0, + }, + { + d: "dbc7f97193fee31258e8f6201c892bfc807a99a76a4bdcb8290323637aea596a", + m: "ee698bd06c810cfc498d95846cf17e29373b64cef4cc49f04bcd38a7093db4b5", + signature: + "336a62c506f77a76e48576bee78c922c34aa8adc13c75ee90ba914b826414197314e419252ea11bc16b8b4fd848689cf7a58fdec55f194347c1731c877b8fc42", + recoveryId: 0, + }, + { + d: "36da67a73566f5e3ef0f2c2846012afd7414cd4d6a51084355ddd6ca099aa3af", + m: "0c7b9a5efed773c3f7e9fd6c71828f3e6ebf7a0ca3942a6cae94c48c3bd9a6fd", + signature: + "58cf3daa6dd3dbdc3763894317fa0759813de58aeeb2d932251c2bc3927bb4af042f9a246d611b8cafae386f7bbf735e8897b1bf16dcb8229691fb6b0ef4ae7f", + recoveryId: 1, + }, + { + d: "fde112c0d958f7f908fc1a52462283afcfcda6f85bf9848c3d46f807305dd47d", + m: "f745dbe64e4276c4e1cf0f7268a4418c53372099b27138d2ab50153a86372184", + signature: + "39fc83e591d2eb635061268df3fb52b492a2a86d091bdf2c4aeac427edb763a8614061dc8b9ba9bb06d8e14f9a77886ae9c67db9bc3884b2306bd2b979203011", + recoveryId: 0, + }, + { + d: "30165b17ea80bb1781a58a457312930a70007e96a116a5084d0b7ab6a19c169e", + m: "b95f2d6667af23879a5eab1d151089b8539558c095c9945b90186efb0fd0144e", + signature: + "21b58504ef59891079f1d5f9c0bec0f6b5a39d2d5bd0fc66eb0bfaa900c5c8fa428d009c8beb22eee0cf4feff3566cb898ebd5145b8a4aa65d8520872259eab5", + recoveryId: 1, + }, + { + d: "9b1231d82d2fcd9bc0984a68c752bda9ad3600dba1d0b59a2b735845c040ca5a", + m: "9e3cf92b4eec4d1adf4337caee59049f316bfe6b38160087c2e034754e29288d", + signature: + "b0414609726482db95c92931267386f9efb885bfe18fed9828b7cb5398f1d5e1687bfa5f7f2551aff5fcdf0328969fcd120c0d8689d66fb49823038630b3a95e", + recoveryId: 1, + }, + { + d: "5b533179a63c696a9e219eaa56792a397d1472d88ae006a8347ffaf6f5c41978", + m: "f648a00fb378f9ea4824435ae32b71bdf96b77caf499609d4c90fb7ddf0eb2bf", + signature: + "d425fa49c157791730a7840fffc73e3c220e7bb32c6170a493616df5e37a6cd528c6cdafab2677cc040301c7f4801328c4372d3d6f9d88f94cb6b1a67192a07a", + recoveryId: 1, + }, + { + d: "9e462f53e77b85265e51feb03a0731d7c56a8643dc01c0ac673fc8a7acf933f8", + m: "cdc7c8819adf8291705bd3ae9de3eef4e02d21a3af63551087f26e5c538ece30", + signature: + "35a608249a87888c8b7d48e5036c1c12b07d53383abd20b9be08a78a2e2f6fdd3e3c15437e1c4e3633bae99bfe0e81c8b07e1af871d1b19ec697fc6f6e46eeef", + recoveryId: 0, + }, + { + d: "9798996c085df19c74f72b3c6876a73eb814a41c09221aba55318749160c1f19", + m: "7f032e8e0cadab2316e20fa9e86ac09541ab163d007dc10159362df8b74e8d77", + signature: + "a223bea22c74b16e58b2ee961a093ccca1c6462a8d6c44a8e45b090da0280d364fdebe8bc01834c360fd3010dc8a655b26e72d492389161d4dea97566a50ec4a", + recoveryId: 0, + }, + { + d: "6cf33d7f99b16c868bfe673e63c605fa855ac9adf56adfeef7525e69bef49594", + m: "bbdb6aadb2e2b1eb34f0695bb894a255c93d98f0d16d4197b145a459a82795e0", + signature: + "b6c002dd3bec0223a6e5197d9e6c768488ee09e47b8f90f051e01bca27649ffc200e1d92452511e93e6d8ed5be010d6c8be27f827875fadf91a3db61457637fd", + recoveryId: 1, + }, + { + d: "d7c9fcb72bdb434d0ae04a451b7db57fb4955199fe8182d001434ab05b10b42a", + m: "a78075a760ed27d22144181db385b77b5edf1129f779a7714f8df502ecb55ab4", + signature: + "73a310c0c45422e9e06f06f04c0cabd2c6e0170aa46727481286edd6bdec757b3fdd3422039b707aadb7d4484ecc5768d0b2068fabba0c7e2e50627399a6a80f", + recoveryId: 1, + }, + { + d: "e4aa3eae4c70d0ca6f4686506d2150a75e1c65b61b0e37d3b6e153d2e72417dc", + m: "c28da8c036c1361525b418c682f6e33547c98b4f2517cf989bb3f38346835f90", + signature: + "ee057fa306a19a3cce951d0d61a5cfdc7c2d7cf30cb19378c2265dfcec212a7e1a26695441308c577accb6b13f14dd9e13539d16db14770f8f6c95f25e13735b", + recoveryId: 0, + }, + { + d: "d87b2c04be72235a22722b319c9ffa2d276f2cbbccaeb6e602add3f73e0dce5c", + m: "835c70b539e4497d2cc82aa472d2a92013d0f1e9caa0891c3981c572af58225e", + signature: + "6249b9d82fd6a0b281b6a9b934846acc149a87c103f068ade6543ec5df59f11d6215a3a0d40dc40bb4c8ecc51f687d84d3686a2fb1c6370e2bff9c31cc8ebde8", + recoveryId: 1, + }, + { + d: "ac365088bf78c2b0e6aad884797dcff1c623dbfe36d02e5995703b5f48e168b6", + m: "684b3570a3e870447ffc3ec45a6f45f7dad6c72a778b21b6db5dd2b48a643f79", + signature: + "3176dd3f7905e4c1bb08695ae7330612ad09c113be69ddbb9d4547b3b72ca10f343251ae12b3beb10880b9698698a581034f24e54c54edeec094bab13a036149", + recoveryId: 1, + }, + { + d: "a4ac8d09650eedef17c91d0fe12f12a24de3d686ad7554b7059d07d18a036a0d", + m: "5f2de68f1cc7497b0b2a4164335da6e1513797be7cd086760e9511e50ea4d57c", + signature: + "170d0c26d8a08c0ae7aa47e0797d8b3118ca7018f06ca66763d9e702aa46e64310e808158ed13561302040b18a94d9f1fac289b304b39245e0fc311e1a80a448", + recoveryId: 1, + }, + { + d: "19dc8a26d63f7bf798cb6090f57bc51047cd9f24fc6a5820929b55f6e736aa1e", + m: "330106772dc26fd99c6511f308a27cc6ccb4d422af0141ad4d067cd9263725a6", + signature: + "645d7dde0e60a3c8178254b7ad7b8c165aaa88fead92ef9e352ef87c917c675c5036e053b45f1235d65731df048e7cd8adcf7c3e494106ee0a6e3064072487ac", + recoveryId: 0, + }, + { + d: "b0f2ac2fa80837c5c68d080ca562098ae24d1359adad9b4c7be321ee81c3b946", + m: "37558d657fa7b7387341ad470a1e55c61f7ee2cffa3d8d1bd90df2d6c805dbd3", + signature: + "157509298b3159c4211e5542984c90b1460412c0c4458774474eed4c1825d66a4d92dc6a706f46321220649908a345039fd8a3ef23752616ae9a7134e1a8b321", + recoveryId: 0, + }, + { + d: "02b4c238924947bcce3660c541bcbb8ee2e93d37bfa092560973522cb6b0c716", + m: "110ce57ecb6cc265d24d04d79dd4173b1967972a298fba6a0b98a085387662c6", + signature: + "fa929662178fe9e6c3e52fded0f600026f63ca6c9db83f9243518c91e4f2cc5169515309cb53dcc7337ba2cdbcdcbfdbc55775805e4ada337702480f2535458c", + recoveryId: 0, + }, + { + d: "e695efb87120cd2aa65cd0de608866978510c8844d8feaca31681a8ee83766c6", + m: "4c41a848da08e01c3e04c168fa9681981c7de89a6054cbf2a33002b3d8285ee5", + signature: + "15f65f39ca94fb0a0806e01e18107604f5c5f047830720942182550523635da233ed2804f8a538d3f12cb63dc5420755471d76626ff4760a372a7a40286c2823", + recoveryId: 1, + }, + { + d: "6b01acfa783e6fa69dee39f93ef721a00acffa74a3b8a9243006d56bedf687e4", + m: "9fafa78848c2a29b8581e927000aece035e234368620034246352c20b8c9c5d3", + signature: + "56e36e122573f7092cbfc7fb8779cd459c59afa8a51b3fadbf8d85d1347f760549026eddae13843cc33eb9c55a1282b1823b3c43962f5cbac79945cb8ce8c3f1", + recoveryId: 0, + }, + { + d: "b00b447b3ac1e327d154f4e3e1bb44e65c6bc35c3a4951822968a594df992492", + m: "b157e75028e3aabb3e7e5dac0fe7dd16ed3fb2ed7a3edbf89c441aa627391489", + signature: + "f80d341dd4fbc3e135e332fc5ff56fd0b384c196b0beff083c497c787cb813633ffad6ee5005e966eaf28e8104836c34444afe8b67a9a94b92b62ffbbd25f44b", + recoveryId: 1, + }, + { + d: "d28cd426108513a4d31bc68264a69125f6a51360529e06e5b5bb5fa729970000", + m: "ca4f3b30075b042c531b0ec72456badb468b79fb36875b09eec0b774499a9e46", + signature: + "59237d654cdbbdab25fca9d22516cbc84a11d32c1db1b1f976d3503f620b00ec19326c32bd5fb42f62f802be20824015ba9ea3575dfcf7062b12214c54a2ed14", + recoveryId: 0, + }, + { + d: "ed1f6d4ac051253217cc83797733b42ee61b66b79c32f4a7c0fb26ca02b1b849", + m: "cf8a96bebf276037d80c810968b275a9567a515cb38bc39e4524fb79befc1cac", + signature: + "b5eb38c50655c5f84a685621873cac96ca43b244f23160e6601af9db028717b51b241f5eae2c12bccd49d6fbb8cd37976ecec40c8d990102162b8c8d43915bf3", + recoveryId: 0, + }, + { + d: "f72a4956952963a3cd66f98c4acee4e877ac1960da6d683d95c376cec1c7d40b", + m: "ec256f725b9334d161bfc6527f6eec8ef3f69cc2a3c43ddbc05b3f9da0d09acb", + signature: + "b315e1c7c54865e019391a35cdfbdae9a4801f4a457fbb740f49453927b760a83be50fc1fec088c50daa67e2060f3b2abbb457f1d886a7911e9eaa12a11cf044", + recoveryId: 0, + }, + { + d: "d050cda1a92d957610dd9dc22927c4b794a3e3dd159aa77ad45ae49e282b777d", + m: "2976acfda08a3eb2065e3435ded26e4778e6bc0c05c6fb6c08798a66ab78bcdc", + signature: + "ba58cb695795d238d1bd144935ca4bbd62dd777fe2e555bfc14bc268b53c94e61d879e0548121089a3fb4185fcb5129210429b0cd9e7bc2709af3665f1839c2d", + recoveryId: 0, + }, + { + d: "480030ee6313b7d1a476f1886cfaa3449a6b5f4df81540f2aa54ecc4d0789a90", + m: "e5c9a4c4e0f904d997ebc436e302403c2403ab000f6fd6750e84592e7164debb", + signature: + "1147d4b77c26b2b79f2a7f5b187ba048a19074289c9c5df78c6c5538a55a55aa0a230e3059754ef1f40e35e72ffbdc1d1c92e2bb7a7d471f141efba94f7832df", + recoveryId: 0, + }, + { + d: "922b95adb7c5f5ae46dd227e83af0c8c08ebb9ae2dc11a9b3cb33e68c9a64023", + m: "8f24c906d2eaac97f267633505b126b2c73f26764b32982461131f3ade30a08a", + signature: + "08cda8df1668879114211235258c05b54c93af9cad019efbf79a18108a79716037129bee2b838dca294ee036ea3542ce679c21fc04eed60aae04fef4ea497c3a", + recoveryId: 0, + }, + { + d: "51e4e432b9cf3733f921ef712ea1bf39a4c235b3fc500c1254964e5b9d5c6f2c", + m: "d5aed079302397bc3aaf7f9620b9f6169e250239b50ae9f27cc6ab4d248a076d", + signature: + "ccec920f303ddff9ea99afb8ba418ff6b56761fa3eaa8a7b47c51f86f52eb0d96fc5a9172e4ce14ef84e15f4d7085308942832524b7dbcccf40f1019c30378cf", + recoveryId: 1, + }, + { + d: "6119aaa5b5ba2f1fd3d85dc8539fbdc8910fa3f914b2cb5adedee0d495feb44a", + m: "a60efe8b2de6815ef5fba5f19dfb3764bce443790c4e2cc7d1b982f660517aa0", + signature: + "e13f44b9d88f621c37b17aec71ffb1fded086f72c05e123b3dc9b25e92fd845d1e2e785a931156688efd362cc5a92139f082316b542645fe74550fcd56923e54", + recoveryId: 1, + }, + { + d: "b93422c0cdfef6741673922c0681a66f2f832aa7f7dae6a860e4e0cd904b0817", + m: "34f39fd0f6654e494c56122915e4062cb8ef522e0a6c06cec8f36fe4e30322c5", + signature: + "7a27a60f96c455212aaf441b8a14ce108c9e856354e6d430cd949b9aa72905521886717b55628fffe3866bc2a27ab63f8adbf52fa18da62959f427dd8ad3cc6a", + recoveryId: 0, + }, + { + d: "dddec087509fb4047af5d812453f2334886312c86eede0a26cb4285f04edeac4", + m: "ee169988ccf8e783a3b020f6c73525bfdb8157a90496a4f4b615dd96c8f2cfc0", + signature: + "2040548133366d20ed6c8533ec685fbffd61062c62ced4227cc3075765c84b6b1eb1f7fa0255448f8a71ded271c5bc6901fa0a3abcdfa44ed3df53e272669249", + recoveryId: 1, + }, + { + d: "920f347c539603eb7b3fa15198767b49c45c283c2444f07baef5f8779a793cc8", + m: "c1adf4436cfe81bc651f354610b33c401aa328d7ce3d174eeacb0130da3c0cf9", + signature: + "43cf7ba2729ac5efd40f618f8c35285ebfb1240511d74d7e76fd161718adff09155500bb2730d7bb026acddda08042ab0ed308f061819c994f049091c0528303", + recoveryId: 0, + }, + { + d: "fe1c4c9d328379a14e6f97753ede9e11b717004bb72fc72c27c22cc39821ce5f", + m: "87f32594c5bf29f084098ff4b1c0a88b7097cfa33781a54a90ca56bd69d6e941", + signature: + "dbe95364b257bfcc0ff4f9aa2bd0e9f69a5d4d1c9e761a6dd4e7743c610ca3e836d0e1071e97e90e8520ba3060cf3df5b21f9f74afa63484f6502d27c94e7052", + recoveryId: 0, + }, + { + d: "73a157d7f359b60d5036e2d05b385a02e9725c4fdc16f6a2337f0ac5e22f2518", + m: "ada1711aa8e479d9ad3b057c89424118afc80bcbee44f4113ce733cb633dc91d", + signature: + "19e013b03e240c9a2510beb9ef8942343d1f2a61bacc02be890dc4c6396b7384028741ddde76e68807e96d52e94dcf072732695b32442bc88117235c1b668f93", + recoveryId: 1, + }, + { + d: "404e67af68711c8add06703024cfac3c73079fcd20b5df7d1c3e18bef66af348", + m: "d80e8fed50ba15877c123e0d24e631c673a6ca6317b59c7171bd1f19eb10a619", + signature: + "0dd56f0d1e83b16bdd7153dbabf8451028cc01d4b1f924c175be34eb43ea01a6534498d9f2facb1c5a66fd863f41197d052cf0e2ea1edb1e40b5a045c7e19dcb", + recoveryId: 0, + }, + { + d: "1050c1d33caded83c2f28d59d7850f229437ca79c856ac9256cd17e4ba31612d", + m: "a74a7c764e8d78263c5ccc0daa3554b3781d3f81b37fec5a5a8decbb4e625d04", + signature: + "0c8b289f26719a05f37d69140569c8957b7a43f353a2ad1c7951bec588f002ca24356d325b59b03b3efddff284b673a00021859a55033807248705c843269a76", + recoveryId: 1, + }, + { + d: "96a35f42f14b5974cf60c26716006050080040850eb21fe1dbbe99b5d23e7405", + m: "870385226d27c2ef5b5036522372c59e156a40a7aa475da6b2a6192a1d02256b", + signature: + "a259971590481f7066c4467143fe7e6f70b34d964a2ad2dbb31ea065faa8f5380265679a61240fd4c48121c6540287b158039fe163759905bf630b5d9b797060", + recoveryId: 1, + }, + { + d: "56fa124d580063c871a37844ea82dff164480941fe9d4031cc04e2ce49f8206f", + m: "b373281ff514f7c6d751c5e8dd54c9aff69fb870ee3c295bebba466d6db7d8df", + signature: + "e8fc87087c43512ef7095b2e65f5346dfa8f3c2aefeedfda6344183fbe02a8557f40827e2a265b11015d6a825e96ecdde4ce2fd8aa71f81fd40005f2642fb4b3", + recoveryId: 1, + }, + { + d: "1b08cca6c61ea9ce2b4cbcaa337bc27b8f89d436a91dda10599178b0dbb39ea7", + m: "67fbe9e5378b7133a057a4d1b9a8516455a7d8b48474453d07b1c87f15dc9676", + signature: + "f0084fce91e6b91a26f5899386d4968ea99b65b84616072574def640682418d4662879aef1dc4e34d3c47395d525fcb974ef5a7e9fe0cfe12d8dc95bdaea412a", + recoveryId: 0, + }, + { + d: "5cb79a4172133ed0bd16f57dc47116d7dcaf3f3f0319dd2aef7fca33fd70f353", + m: "8f81d45f8fd86f13696f5f3a3a4195f5c5a73a7f1056a6e61fb6bd6d85ac2333", + signature: + "d9ce9d0673fcb7abe871d411b72db4ae532760b56473ce893210a573332c530471120361f335e51148011fabd16b68bcaebbfa3f76ea0e1d0fef7129ecbf922a", + recoveryId: 1, + }, + { + d: "522b1c569e0e4ece9aea599a68c72dd059b01f33a8bb61ced0b5c39010af3074", + m: "88c20ef06b41376bdbf191c07e9dde8803919e716bbc26845c7c7678ba0efd8c", + signature: + "815c6196e0fd829ed1532d2c0159bc86368c49bea0f8c60284a03ffab4e08322432ba27abb5636206fad497241995eaa043b9d3b1cab9b8416903779499f23fa", + recoveryId: 0, + }, + { + d: "ddcf8a9ae11a8c62875fe2a96f76fa86e1568f08eb4b7c55a9fc04ea7a3134c5", + m: "d6e2cce7d4af9c61e5c96307bd8c2c339303d4a243da5a7add74235ac571234d", + signature: + "1e2ab9897e5034600a5ed434eed7e456d4542b60419f0631b54db3edcd0042ca710d5224a90e686114977d1d7409c01db753347e407062ed4c3c1357d0755e13", + recoveryId: 0, + }, + { + d: "0de8bb132a4470f3cc9f735a14d60cc2a8631a4a8aec343de3038f25bd24b39f", + m: "50361d92e5f8f52f9a925f0c20a6cb1059d166bf26bed56cf893b4348ecfbc1a", + signature: + "372479e84c27c9fe8e3c49f7cda746aa3b334cc209d8dfd323d6686279af27955fa4eb86a86e4b74f1e09173c7d3d26915022a19b84dfa8a8e11f9e3739229b7", + recoveryId: 1, + }, + { + d: "0cc5a0337366da1b12ed013452b152178991b00814375bcd3e3153e4b809bad7", + m: "c7f584ee6197070f1b207cc69fad291a52cf587146701fa6d904c2791bf282e2", + signature: + "865e00fbb4b5973b78a543a8c5bd95672fca831e53de83d5546ec34ba7d8237b655c35b10104caaee97926c0103a955568d2014a5c413dddc62a778a096bdfe4", + recoveryId: 0, + }, + { + d: "257b633dca9553ae45172eca1cb7a92ede0770802a239e1fa7435f81f8a5260d", + m: "16a4fcd776925eb1c0241454033cb90130ea27988c43a798f92d3420e8562b09", + signature: + "95ae1098c119f252a82bdb72986d5d91bee2cc32ebbdfb1275554659188aa62043ab71c39377a2781bb8fb100634be5ac786f07639f7a1080722bc8473f68084", + recoveryId: 1, + }, + { + d: "f3a313fb3ee44a42d5b10b3bfec2604ca75d65a4446dc042b4b213e1d2c8c448", + m: "b8e6fd23e6ba5eca8d23c7488ea6ccf4e584cdc7797b4c63a307bcface65c6f7", + signature: + "17b2f1374fcec35ba82565ada37dfb12fd7368bf1b2322692be2c4d16e8c0ab03cf2e880ba2340d4453da74a3cb17143d4ff8356ae3e143ec6ab627c87d20a68", + recoveryId: 0, + }, + { + d: "6c9d35195d5c4ce2cecf43f3a05651c5224e9b4702093259e1a76d63822b7ed3", + m: "5a3eb4fd98bd4ef9a33e30792fc1b9f9f665d8681df19ea08a791fbe0e76c137", + signature: + "000930df70e9ac0b911890096c043a73cf1bacdd38c3983d029fe8c87e027efd097c68c6494120c124ae201b4c534d6f7e5bce184b384ef2846f69c9565ab66b", + recoveryId: 0, + }, + { + d: "5e413553f604265340b6d29e06b31e645e407ff50e45914dd1ccbca2e27aba19", + m: "9483072e38c5b77e314273c7e39bce5e89f92815e1f62a11d790e3825dec54bf", + signature: + "212835649ea9341e727e7bd415ab44ff5720269658d257cc181a93817af1624e26f3964aa3c74164f6b9800b04644de6e940c68dcf620da5c28ac2c2a6e11e30", + recoveryId: 0, + }, + { + d: "0ee54370e142b915721d218994a171f50c7559cab28413e25c77ea9a08279c9c", + m: "5ce92b0826b3aeb8b9ec6cf5d78a04c27b06d73f077142473b5670ea2fa1d18f", + signature: + "7eb8648f0892da523a7eec389ed547c63145fae7cc117e245687559dceca8d9a6f7d59c1ebe75ea75f0f59c78acde9753d2dac3d309972739d7b6a2af44e267d", + recoveryId: 0, + }, + { + d: "9040f1e78fd57f8ed8779fe182500d4507b88a03156ba4d77740f7efb19fdad7", + m: "4041ccb5621fc034c2871046f12de4f66295c0295967d4eced556c4dcb1ea6ed", + signature: + "599b1c4f984ec4b813f31b2eadf511c4c87a5a82d4b6b37532dd4dc6e61586037bdd48d0c8b539858f8d50f21225ab6081ab1f373b8b68d0a15b343aad6d049d", + recoveryId: 0, + }, + { + d: "c59452b9571d774479da31f38c12b1a8a5822be93f24109cad6c5761de43e993", + m: "b111efe0b23ea4f0e6e48119a10a23420861d3a1b7947df802844b80d8e94ffe", + signature: + "4385e9666c2b29a8536eeff0b75607ce41518a915a9ce40fbb6b0629782e3adc2376890723142eb6025ed32717916e9c05b44cc1ea30980d99870ead8a429578", + recoveryId: 1, + }, + { + d: "6988e2efeb2f29821933ad4d076e27c86fcdf5d022f04431bcadf37ebc5e310a", + m: "a968e08b23e5ec782488ccdeb26cef589a11cab7abb8854223055283e78702e0", + signature: + "258ed7dc9e51f7b280261edbc1a03e6804019a1c5fa929011c019f463e34f0d71d34b22e1810622a9f56af2bec7e23aeaf15d9e569e8137ff7cf8edfb927be5f", + recoveryId: 1, + }, + { + d: "906276d9f6c4c6738e7fd6201e6f47ce60d95ac334e5d5cc2f998136e6c90869", + m: "43fa83b2a0a853ae52e2e572aef96a706a818f42136e5b735d2b2181a06ddaa9", + signature: + "3ad2c4578c1696a59b9274de2a25b6bbd55f620831214efbbd98199abf3a75044c825a0fbbe0d7fd96a78c68c7bea33cfb597d87469b5b8da26aa6b2550c01c9", + recoveryId: 1, + }, + { + d: "ae9864afeab71e2be52fdf0c5e85cd6708e96124fc4663811a30e4f49022378e", + m: "27c3a5d589b700d0f2502feb53270fbb686945d5da2fa3220d9d1281a4683faa", + signature: + "661d4caf4daf722a03532ceddc1b96004a542ae9891238915bad9c4c8fd7fe2a0302e5fe4e30ac1a6057210e27787cedc9ad17837abac280a3f25db2c95e7ff7", + recoveryId: 1, + }, + { + d: "50ea2addb25a59142ac17d2f8621625647f74d89e44d458010c9a04ff8df2906", + m: "386601091a2f35209763e1aad61a7ec51e8a8251db5f38ecbdb3c47df59bf927", + signature: + "4b9e518d3e539888ef6e56689c1a6619d6864f673714a89c72311992a0da56cb7c438afd48611252ae5b0cca6112e737f07ecb84ad17075a77a07fc33e4e21ab", + recoveryId: 0, + }, + { + d: "c5209d8d63bd2b3ae7f0504fc4577d6d05ad476e18e4f1beda32e06429ee9ced", + m: "e8c81ace98dd98ba837ea1f555193c5e60900540672ab82b0b447fd7dd0bbc00", + signature: + "0fc9489962f09ab8548c0566fc9d4e01ef5a69fe011cc9b87101e03c5207beaa497fd1c433394359516b3b676271e78dceac8c116a761ce0d8d048770ea8d828", + recoveryId: 0, + }, + { + d: "5f4f1df4676b34dc9e2c24a56cfc4679b5d55dbed7841b46274724a8b4b3611b", + m: "030db54b7135d266c315f3b4268bfe4bbaa1f764e25de3cbba136fe55bcfe54a", + signature: + "0a6af91dd0463be7bf653909f35180e7a6371187cc3efdffd4f655f3caff041d64e4f434396cd3deda887537c40b69d730a9ac07ca94ca516bfb17d3562e7468", + recoveryId: 1, + }, + { + d: "db64815ad8ef0893d871cfd31d7db5459fc80c19d233a07c381cec3fa5d015cf", + m: "0b661c182c129ace993ba36c517fc33541dd666dbd656e62a4b1c259ce0a1342", + signature: + "db60f4ef235dc79490113d058ae00d7070574c299b356833b95fc04cb9325f2c10ec01e9efde6b11f567ac76af320cd966ae587cc1d8b384dc8dfdffcc0ff4aa", + recoveryId: 1, + }, + { + d: "5a581363bfd6e36c9c7e1aadb622810e2409e5c6e76f94d05241232ee9f63e1f", + m: "fb93c40f5e71c7c80974cb2432758c00f8fd0e65e066006074768210cce1e0e6", + signature: + "78a519a864cf1161033e39f5b514f8e40d9f226ab415f68a6f8855f84396c228423071c686a623c4b1d60678a60628fbe9162bee9abcfe65c5b17b44a2d455a2", + recoveryId: 1, + }, + { + d: "8cd3d83b73ce6d59400f6db0b2002e9f8e3b912f1f2573092238c45daaa9eea5", + m: "7cb8dae843610cf36949054d7ad5942224bfb888878381716b3a7f70bfb89fb0", + signature: + "8825132f57db488aaca07c99ed434695b1a56492bde71aee7925a0ce0e0107ef426fb0271a9f56747e02532d6c68f0419c1b0c76b687e4a7a163018afe08fa17", + recoveryId: 0, + }, + { + d: "5cf763fe94fb85600744e3757849d3a9b4e3b04d56a8189a173fccfb750a6698", + m: "d1b394c6fced7be6804e7188247f23316fdd0f8939020707a557e3cf564cdcfc", + signature: + "0196c3cc4ab5ab0c9589bdef05f7b8326debed055ffe6410d4a5f797a399fff834038dd84711c36f26080e26d69781f4c3036365ad97835bf90da432e05abde3", + recoveryId: 0, + }, + { + d: "f2cec76779738e6caae18fb56d077af12b66be8d43708bdff727f3af18ef9b53", + m: "e43350e1d35d51ae19b2dd6fe1d647153cfa34fdf24221ca8bfebd07b43a3d1d", + signature: + "669b6e6155347213ecd7a66c4230b79d5cc8f8e273e447a3bfba96df06fdf0cc0ba2f1305952dd78684cc93f9aa986a3d62390ddc57256f5d461c1547f6fb261", + recoveryId: 1, + }, + { + d: "7235ccb2412dc0f9bbe9389b010bb36c08938f693d0ac1093c782bf143fe4059", + m: "4bae972507ed08b4f2c7b52fa6e9b836e44b5517d7e10879df2f6d6adad97774", + signature: + "cd27cf4a2f0b2620c8c5e6d0c19f04c314c348bf80239d1c3194f7d782f1261a240e4888143fad044d231495e75c7dd8aea20bc61aabc0e144fce1a1babf60c7", + recoveryId: 0, + }, + { + d: "16b4f68dc709f42a7e5b23121643570e790d59686d96d2e4974265d78ef05dfd", + m: "6e1ef8f71977f094ef7757977ecfc5d6f6bd3ee078d5f368c42d89e67e8be126", + signature: + "8a0d5fe22ab563f33c291c0a8a80d9da08c3463e9447929575dee82cefa6691c05fcfce7e83797993f14f0ab76bb427d812aaf83ec51db356b7728071d700161", + recoveryId: 1, + }, + { + d: "0176196725b5f4671748411e5f832694d9982a6e768c2f4467528c6f30a9f8a7", + m: "3dfddfde6686646dc5676fadbc9cd17adf3c4df3afe796088543e4af3dad1e5d", + signature: + "d4e17dd85ab0a3fdd14fcd4469bdaec2779b357b17d7202e9a3cb1405cad0dbb5929f64809f48b377f03b0b43f93aaf33252d5930627c62754e26e06e556ba43", + recoveryId: 1, + }, + { + d: "8e165c43c6f7d7155a7deb8091eff833175c43fe9de745c4baa43a4fd065e110", + m: "317dd23f4284e809a846db5e6ee3a8bccf64021e923bf7d48c0ab5a949e2f85b", + signature: + "b8ef1492758abcb299b58f026d63ab651a4f369096ed28f72270c7266791165e7624ae2b143186fe833ba498324353d65766d64d4e0c4568fd3713bb02b6b97f", + recoveryId: 0, + }, + { + d: "d8d37264ea1a8f5ce8818756de3bfb95343a9f8736bb496b04ee58f5194bf1a8", + m: "1daca7cde1adb3d6c9b8e071c4ce2424952a88539915517e8918d29b28bdba80", + signature: + "d712ad8e287709de0e025508208341cbab965cacfd7147daea0ab3748e8d4ace637fd8a321f81b531b554e1383b898fffa965bcd6b71278702e12eb0874d00dc", + recoveryId: 0, + }, + { + d: "e624ec2aae714d905efe088c019625de6d3a0b27972a863a228996ed9ac2e2c5", + m: "c40b87251d9622b273f78caa174dd26e08ad566875f6ac9fc5c44873bdf27a92", + signature: + "b2f51874da755e0189d4df4bc9872a68da16143ba507b7d16c1a21e398eca798592e83b2626e7c363435e6550e2f47334d2dacb469a9c851210965af0ec4c258", + recoveryId: 0, + }, + { + d: "f7cf8d83d40d4a820af9e16a9ae507dae00bec7116cfa6c58220c67e619fda98", + m: "b9c197536a55700880a21eb3236d59c63fd073177b4b2b409ad638c58b3f44fa", + signature: + "a4d95f099b9c889a28867f2f5d50e6fe7934292f9df4a00b29f4151dd6f6a8c55733f55b4368ebe2aa258fcad25f455a638b2ed7e248463667bd689e5c114c2d", + recoveryId: 1, + }, + { + d: "eccfda7635433e5540ef5e88372c45a448d719a37fb4f77cb5a1d69f18b30121", + m: "9aed3fb6bcb770a24e680f9b0fa4f842ba6d7db8dca89f023f421afb70236eee", + signature: + "ded357f2f7d8f2cf917ae7ffdf85025b3a0c5a2fbc64c8462fc7f009b386b8d41dcbbb02b4c587237064e16cae803f4a093012f9ee90f7a6dded0fbb8a1b1a36", + recoveryId: 1, + }, + { + d: "78fce090795aa3a3c8dfc528bfaa7ef0611fa5f670670a123d71b2a6c455465a", + m: "1b27a363f302a31ed197447da372f92078a9285e684eccb89cb939484cd3abe8", + signature: + "ffd4173fcb27e5e38b2812f79fd505fb98766be6d08bc86ab545ff69f224410230fecce7dac143fc5598eb1645ed9a14e8a5c01fbcea35ecd175fba1def4a779", + recoveryId: 0, + }, + { + d: "2010ebd40f90f7b21861c21185a5c6594066a112bc64aebe66e08d14aaaec568", + m: "79e9d27b3a8c8b0598a36f8cfb30f52b6057ce585cdc0f227ad68cf1d729ae71", + signature: + "c5aff8f97098164ada1077580947caabb4c47b8614b4c47aedb49eeda4ad1cdb78c210180e60cfad2381c921b3c091c1c52f218db43d45956d479ee8d2762324", + recoveryId: 1, + }, + { + d: "bc4e72a8a8a3485febbce9fe0f150f2860b1997ec8d37fd47a79cd2b06075379", + m: "99bbb9fae7878aa4f5f04d3caf0526dd049b59ae8e4cfb23de860d5d2dab80d6", + signature: + "8ee0529134ba65145e306264052ddb9df398d41d6e9ad3ae273030cfa7f5d90239d9dee7ad228259f0f1a66925f24fbf6f520e9af1fdefae8f27cb3d3fd43fbe", + recoveryId: 1, + }, + { + d: "49c524b28c52c52958692a59dfee78e6772cb50e8a91273e3ad338b071d6a59f", + m: "09fe0ba2cc68251669e9510fe8cef0effcc8afec01a5b6dfca8b2c0e2cf968be", + signature: + "d48b9c36d653c37e32feeb372c4010a91cc30f3cbc39a042942d4e0d5235b3e22ef23e7bbcae3d3023478d9bf8356f0d8d380cf0b5281bf3a455b75a71e697ba", + recoveryId: 1, + }, + { + d: "bc4330de22b88a703a72db7adea8efc22ed7a4d46e8f43b35cf945120b869b06", + m: "1f234bbcdb68a802618496189af4912dba65f1f31ae29adefd036b3461fec9b5", + signature: + "64802d9ce1ae606b05c342381f59c2cfd908853d7f091cb517ae0a3a1fc1868e691317e07ff2fa26f75d97b5fba2cea19a0084398119c15c71b0976ccaecf58c", + recoveryId: 0, + }, + { + d: "233c822f12c0fe2ec182866549ad4cc0ac97dce88b693b5e168c6956595b41c6", + m: "0e660a82edb8fed8d3f87823a1e57c94cb35006d1947300d6cb0d054d2cce14e", + signature: + "c93030c9f37f94fa55d03706d811c4244ee357af4f8786a2dd63d3c77a2fec9e31a4cfc2a929fcc83c931f594ce8145b52e2cbdbd23810b345066583e26a0a05", + recoveryId: 0, + }, + { + d: "440fd881ec2de9741441c61e79cecd49cb7fa52bae8a60edd331f32cbdf19123", + m: "bc7876a7b579e1c05c8fdf772e03cd88ac8b991d4f23f03638c1626bef5b3483", + signature: + "a360c7cfbc3a08a3f4cf92819959b08de73a1b563254df3b93a4f89f010fb95e19523ead978b87fface225a5fb495e5f290b23d1e2b212c05cc4a28bc0afbb9b", + recoveryId: 1, + }, + { + d: "92dda6b76352bfd768904ef9e3ab4f679822843fb38aaba7120f0076dc8af3e5", + m: "4c3e410016f82856ba1627bf568903b3243480123ec01b5a3d7c2724c98ab3da", + signature: + "00ec8b71098d336c9925cdd74bb0fac05e2a86a50f2a3ce6b3d650975f4149ea2e5a0a4c63fcaf347af3009e977f7865a9fcc8c22ace85075b4923ec4845bbd0", + recoveryId: 1, + }, + { + d: "5a069600571a84a93d8b734956caa47fe8c9dae8407bcbbf70b46945eeedc50d", + m: "adf3297e5885994e05163fc6da2cfa215521d03c8eb8ed806b3c64562161aa8f", + signature: + "4069d79128ff39764c7af5b104b65d7b726d5a6f7c2b6f2090b343c7fb68e70129ae920b6b5c927378ed9d2e5c417a121e0d3f8a19776c20ff2b8322fc99c273", + recoveryId: 1, + }, + { + d: "e80502c642297c69f9bc629412338fd27f62d77d984209ac2eea17392bae5c87", + m: "b48faa7c993d56b0dc880d20c9ec4a97f7e68ca5b2072eb8de15843bd3962030", + signature: + "cb83247d87eb26689271cd5aace32c62249cfda5c960ac59569deac0980ee87b48444cb2c027a2f4b100f7e7f46e561243b91d85513922e450f8048bac4fd5fc", + recoveryId: 0, + }, + { + d: "205c629b8743ac47b90ef9dd3b8aadcf099cfc78cd468774355fe160c6295033", + m: "a453f0e2759a7472b2cd78e8e9a50710f8f0d5a3e3662985834c782d612e821e", + signature: + "f6c3df8980c673d48150a47e26d31b7ab32937f45a533417844eb0b8ad955ebf15c3c968c3d1baf4b4143b3175e32f2b39461ef83ca2803f0e5e982172d1700a", + recoveryId: 1, + }, + { + d: "cbae72543e8fc171035c4257303302eec97158ab66edf19f89bf56cae5a652e9", + m: "419c209b83972359c36f3fbbd3dc3baa8c8b46c39a5cadb099114e81534cc333", + signature: + "555bbce7cc1934d473d64f4e1824eae85238e1763b60d8892999de44ee0e43d3599f9c288a56b56c56ddfed176e70ea720ddc14efb38629e7b4b618507fd7707", + recoveryId: 0, + }, + { + d: "71b07e7f679b5dad5e9210df075076fede1051704fbf826667c634963a6ef963", + m: "5447f95a8ce8d592f5a4e90fd94f9c60652758102fef7f1a90ed84aa0190c9d3", + signature: + "2f8b53bdc8acb6a54daa84ea5d973bb5e5ad629ec74f891687294b62cec6fabb169ac09570588bb6d5b1654bcc74d2547322e6dead01b2f66d19dda8904d06f5", + recoveryId: 0, + }, + { + d: "652005fb9562beda749cab3e5107a485c27c426ddf1be42682a2b7846e939126", + m: "f1dd6ddcd326c9e4492e428af7dc0fbb415aed0b8216b375a11cd074af34539b", + signature: + "fa5715c8d558d8169bfe571c5682bdd91b166bfdf60f08ce293070eb92aab623366462d7377f24dc0480364c34329f77a35300dc968b1d4242ef21b64f7e8d01", + recoveryId: 0, + }, + { + d: "6445b7ee67ea6375ec8e184bd3a8b28b0adc4fe560e0a6fda8b68c5dc65c4199", + m: "7013f1b6c27ce8e606a35d9e92a4bb38acfa6955d976e647909fb9d8f3cb5ead", + signature: + "c243f25ae8d1d98ca6fd1f891c405b62ce13f90e58189d2b22598a32a9fe60b33a5f9e69572ba82ec48e83c02a7dd6c54af5a861b5d46f50bc4b1349b9602c1a", + recoveryId: 1, + }, + { + d: "5f04b66e75c894ecce5a5f9b17b08e7be3a0fc058143762a27f2b8c7d55695dc", + m: "ae1dace5312708f73f9d65ab149510d935ec3649af315b3b8f9af6ec8855ac52", + signature: + "31f9547b564fea4065b1c00d76b31c339453c081a9b046c27c56ff4c84e985e2380986c1a801b5a6538914b1dc3dcef3f787881999cd63669a6cf635cb49ed0c", + recoveryId: 0, + }, + { + d: "8193e32dba4ded0b263aaa660c40481cea1505fc2e88eae046bfe98c6e099488", + m: "d50bc61c7d6d0dc8162e4b05ce8b728db12251b9f35c52fb3643e7b85966698e", + signature: + "4ca022a820e141732f74f7f2d9f4d106ca660357cd1877f36015e8590e08dc4f44ab2bd54af23d10d5cf27086b51d30898a7002d56f081500f2260e54737b1af", + recoveryId: 0, + }, + { + d: "521c8fa43477d90917ebef1a5d00e1f4e72156d2a1d6dafbc7b53ad9de4f957f", + m: "8faa610ffdfb026ccc3b7929332a67c1e29fe14b97c99ea9de9f8c17057835f5", + signature: + "c8d955678d574da24cbe5ce683a8fd1d824f1a9ccff722b8fb453a3d06440f3b2f7bbc8b7d9c0944eb32975c621b204927a33fc68f8e0ba58d7868cf9b35f6d6", + recoveryId: 0, + }, + { + d: "6df847facbdaf2cd5d590864d6f0aac70193a57ed10ef1ea518844e6ab7622b4", + m: "b8c8949f4987f8b7893bcc0f706ccbfb8d1d19649c68da718bdb14d3ebd0d341", + signature: + "de37898a939a7a0c3c98057f543d50775ef5740f7fcd394aeccf22cc30d2036a19f97166eacf6b7d4fe3cd993db92aac311991cddfa7577c3e7846a1f17c3c1b", + recoveryId: 1, + }, + { + d: "dd38782c7e6a2719420ccf45be8de8be43695fb695f3552d0b2bee2223bec80d", + m: "3ce9fe654210ad1875fa9a7afc6cc9a886a5488638094f206458854739cb129f", + signature: + "8823081f60cf8f468b6a077afe1912e59ff67f6a9e723c7f5602c6566ed681cf783a8bd1631d1958b67de496c7b2244482bacaff3a52da6a550942f18ebe7ba7", + recoveryId: 1, + }, + { + d: "e908b641fd5c9f7a73185beed9cb7fcb3b7de920b98afc5bd17f0b2a48098ff2", + m: "211a436dfb45979da64fa5bc9700a912b96b6dc75b0abe272dad9bbf482efcb8", + signature: + "74fdb6bacf4261fa9b0bf133379113fa7eceb461489a276145d518b43f684a6f1a296bc32981143d4744ff331ba8a983be27b960e6b92c7b248645db3839c980", + recoveryId: 0, + }, + { + d: "fe90df6d1fbde13db24676efc461000b603fdf4a98f011625179c7cc1bc35fd0", + m: "f580960a1c8592f9e1f68ef71687d8131212b64ee6a4a11b9dd7a86d22eb9dc2", + signature: + "d118a44f5b7530e2bdd7ea30998dca0e33b6d4b92211a78f1d8f5e476609d07647934caf167f00160416eec366991146e3167fe65ef05e7d6685821c4e565169", + recoveryId: 0, + }, + { + d: "4cf622c4176cb4878891152c41b5444ebe453ed752ad3f817d9b1cd11899eada", + m: "4a9aa6ebc204dafa7e737f2ab685a27b068e883037f1212e334fbf4fc4d22c78", + signature: + "03f9556781a2e5dc328dd6041fcc5c83ed8a25e62b7b26a95e107168393c5f96662e7e0aa44b07f103cb14898574135ea6e91943181d2d21e3200695b7a924d7", + recoveryId: 1, + }, + { + d: "7a126209721b7aaf2606c1a8cd3dad636de062cea9abb3de22a47333d0dc4dfa", + m: "bcdbcbc24e77cb908882f856ecf40b32967fc6f9fcf6e3183515b8df554e8abd", + signature: + "e94cf9055dc3bbc09e5a3f70e3cb7ea635ce11129c546c678e5d2e94fd5c0bda3d40ea5ebbdfcf6e11d6a8757e393bbc96884a7306725239c9e37bcfa8544df9", + recoveryId: 1, + }, + { + d: "01fa5a4dbf5a3bbd00b3885c6bd4ad6bbf1590c169bc91f2716ef6e56bf34778", + m: "bb0826c3ccad0566ac48c8b50ac67ae7ca112be631e51c538e391114a789a048", + signature: + "56030ed80d5acbaa117588846506d917150ad7b15c957b689c8a07499d308f3f2a25381ece03e179c31320e66d649cf560dbf5558df7bfd5e07949a4681b8ea7", + recoveryId: 0, + }, + { + d: "62f935ab2e78e4e0cfa20438f1b44256acd5520d3261a8a61dbbd8320233ab5e", + m: "74e91c7a717e847df1dda85778c28f15bfe45bb1c42a689cdbe113082def16c8", + signature: + "b101726d10db07e110e4ba48169f4ddbdb339d8b1ea68c20ad0229ed678f83c52c700fd9c6fe481eda668f3409cc86821a702f93d440eb897915624cb95a3d06", + recoveryId: 0, + }, + { + d: "6909020c8a290a7c7460be33cafb2811bf98104f8e83c981819b757ed9721499", + m: "9ae228797990935f3977a680c5decd530aecab3cb73069b6a30844360162f22c", + signature: + "55ce10e71d966e43bfaa0e2fe115e4afaa9338ffff942888d45d453e078778976554bce6280af459768cbd99efc7322d4607b6f929aa3f2aae27be82f1fe43ef", + recoveryId: 1, + }, + { + d: "6d2eee66d3d482e8edd468d319861881e00cd1874771bf9523041aeb2cf3540c", + m: "a2cd0716f7b83f1819062193664c2037507754c0cc2591792cdabe83e8244882", + signature: + "6877c36f392c79ec8e9847aad3f7c405415a46f8ca7f024bdd34ab5178f2609c7e216e063e4eb18dd68010ce9193ecf04ad3ca411d1124041f499a55aba785f2", + recoveryId: 0, + }, + { + d: "79651a9805d4db70e179285aea1289f74066244d46fc88cbf5d2d27d7ae43ce8", + m: "0b2c3e7407780b37ce7de4447d33407a407a9cfd98ed2deb3c01103faca71903", + signature: + "b3d97dacef27471e1a30f9b8821a773b50e6a421ad60553ab02ececaa7c5a55f194fbbf2292f9f249ffbf97248f3b895b247fab9c2d90f1995504c89fb0fe413", + recoveryId: 0, + }, + { + d: "8df48419e2b451be6fdb1af37a12d95a67362a04daaa8f4b3a4a3c7057d5471e", + m: "f601bb51d2a0faeb67c9250f654464bc72f7a9240a2a5e9300b2edca77517e9d", + signature: + "53b17f52db3d6cecf9e93dd9d2eedaa21e60e57a511da9c4125dd089652977937f9e4a8aa8e5d620c7596bc7dbe31e20f9dae47fb9e673e45ab8fa0f86d42b7c", + recoveryId: 0, + }, + { + d: "31cb45c772e46898b9f714aa94dfafeb029f90927192a3008bf5ee62607b2925", + m: "66f883f0bbaa36a447f114866a8d06b74117f1bbac99f63e6e484f064da2fc59", + signature: + "db14cfbb7d6f27d90ee79e21b89716517763b9174e42450d0045f3bac52b005f372e1e2e988cf63fbce8a9dc2a1c6265ed2ac625b878bd4b9ecb01ef9cba4f39", + recoveryId: 0, + }, + { + d: "6915234dc41f7686ac5cc371cac2e21add47efa26ca70f36e645ae4fa2829180", + m: "b571f109ec38734b10e7451ce79123f79d977f4ba962d051097b60c3cd876438", + signature: + "8f504d8263c1024c92e9f3c01429b436dd721ca0eb009840e32f2039004028123ccf4a8f8f21f18c4364e05b2099626dce07e6924df0956a92706e3a2a767164", + recoveryId: 1, + }, + { + d: "ec30a2479421d952e9e648d23593af5b0d53a104254919f85345ec180b510f87", + m: "f61c9d358d4540b872728195467b38d943941aac5038cfcf9afad9525aed4d89", + signature: + "41deef2ec1b9fabed7d516136ed02ca6a5c3963e3ac7176badf7c2e6b9a6500350fcddd7a4d111deb97de9faff48b8e56a059c0109195998eefd120444a83483", + recoveryId: 1, + }, + { + d: "7871bf29f19ab05e1dbeedd963c645a7435977c0330cc808957248f7d53b83a9", + m: "a45db968d2a3e55b7ef882bf48c29169bd689d4debee6610c40b8e1c8491cad1", + signature: + "8960b44c4bec4e49be1d4a4652a6b74c14e838e2c2ae3e0ecce5fc16222c0e6c12a9deb53072d764176c44d775130ed89cf7edfe02576b3611573af91e25ea0d", + recoveryId: 1, + }, + { + d: "209630af73f55776c992fb701afed17e56263b6b339ededf09f1401a05396702", + m: "e830132a303b9c0ca6e867bacc182a0ec188489760da31e31c952625adafde86", + signature: + "8f86e5f8665bbac26603d9f18fc3be8dc821a330325f711691b2bca69d9ba88c49a81bcb88389b6d5ae1c12b0043f0a4ed7dec264f056e09bc3768e28890acd7", + recoveryId: 0, + }, + { + d: "2548738909e7602becc2b589ebd928b8e897f67ff9efe578d2f086cc560ed1a9", + m: "7583ec86459f8d9069d19d355770ddadf60538640e56365e747d40223c1fb7e6", + signature: + "4b6acdfafeba68cc2255be5151a7cb95f7ba5475936d14a65c43acd99f030d4032ef427a8011569324ad42361153099635fd2413fbcc66787efe278f3563fea4", + recoveryId: 0, + }, + { + d: "b3980b621b24622709e812b087cdc288b7b3397bdf29276b8402e92abd3b0739", + m: "322b325f9b70b76d74a2612afb56546eea4e7a8d4cd2ac1086ac29d5616f2d76", + signature: + "c735ddae8af67aa6c289b4390ca3a7db911c2ac371600322aaeee3d2f59b70e96bc4a62581289da1097d5b6e59887c349245c276aac6ca9eae0e087a955fdc71", + recoveryId: 0, + }, + { + d: "7673ede2b1a0ec960de1ce1b92cccd3e523664d46ae923962cb4c2ba00822198", + m: "0146f84a38cd9ebb3c0020917c10570d0b58889075f00c000613f204f47a3758", + signature: + "c29352e7fdc5999e9990b1f0ebe888e16c9c6f812b32d10aba88ac8c8138a95e297960f64832ca5881fa1e74359c985e37e55280d9bc355317514dfc1e137229", + recoveryId: 0, + }, + { + d: "a93c58dcaca095277ae9cfacec5b9a955f29e4ea53fcfc9f9f318e3d5a10f338", + m: "e52386160058595f36bba2dff0b72856a4a484f337f0ed5b78c0735ce05ae6bd", + signature: + "bb015184825a7afc142d63d4285e3896412bff11fff4e04a2575813ca363e23757dcb1f7a50b660729511e2bf65edcb663f77ca7aa97eb8616401ac1d7b3f827", + recoveryId: 1, + }, + { + d: "84c6550c4346a64538a09f506fcefd452a2c41e43a9b3dd5582b2346d5828720", + m: "d8dc2a6719be12a52be8ad1e6e8122cab64ce4231bcfce8856a848ab1334ba52", + signature: + "6789144be46327696aeea5d9f04231a1f3b94a0cd96257fcdb39a9823194a44e18d068e09100474ca9a875f27e22d4e0a99192f8e01669b87e3ba8663989bbff", + recoveryId: 0, + }, + { + d: "721a5cabd50f2adab581c8289bb2e47836e992ba213c7a25a527cd1a28c828ab", + m: "0f373680c752c9ba86d9e0819c3b1cd8e0b3c08e7d1502407c0d367b32109bb5", + signature: + "ec5b39d543a9122d058996849efa18bc0f47f21179b7185b70fc9ae04098feed0c893ca9963292dd009d0386f6e37ac056f3f1169a0c7df17b6c455c80ef4b4c", + recoveryId: 0, + }, + { + d: "e67ef11f4fc7e99e4170df44124cbd84a550c0e07e59716e83e5c345d02dfbf4", + m: "d5a9823ead437f19488d83966ad03a944461467f4c610a0c1d52a0ccacb69676", + signature: + "72c3d894a6193bc289c15ae12a4b3377ab1ebcc1aaa349b6711715c39da61ddb6d16d096b959956386f115ec985c60e217b92a11bd9cb1affc044f0b72d0504d", + recoveryId: 1, + }, + { + d: "8058d6a10c04179666bed5b49cbc1dd46e2840a30b7701bc7d5204fbdf4f5285", + m: "2741fc7bd7ab1f36955ce1ca1a310a84a2c4059d209c4e7985fadbf058a99c06", + signature: + "7cff60bf7403d0d77340c06c7f12f38e9bea627b50a763c3fe663eb9354140e067952db60ce3e049d457db7f0b663c3a7ae345523dbaa2fd2fb49cba1104c0db", + recoveryId: 1, + }, + { + d: "379956c6b7e2ee3ef3f68387ba12c678f037bd1b30f01513a718b2df4d09c42a", + m: "7f9c8108750f7b40f69898d87b68cb06e597e534cb3ea390a69ff787a939be05", + signature: + "d2a427f225039c6b8d9b1711497c2c9bd74da2296b9779d515597a02bc0c6d470bc0544b954ee23e2cd4e131f3e540cce8329db47c8194853247279ffe10406f", + recoveryId: 0, + }, + { + d: "37cf1df4706c8631a408257775c8a5742fbd9f7bfb93643e8e53160ef7f0bfb0", + m: "886c3b0e0d4e87590e0a30b0a08c9b75ce0c0ed7410ad8ecfe9ac0baa57e2606", + signature: + "57773d015d8c9103dda02c3012485a2bcc032964ceff4e94635d3595686afaf710dcbacc53452830ea154d9925fc0ab8b56da8a585a5f0524be4529e87f9f2dd", + recoveryId: 1, + }, + { + d: "8e329b14f4ad087797b74cd493498f742cf6a31e1d8591f62bb3eee3680f7cb5", + m: "ecc6d08391f667a59481d49f7edb96b5c6ed6e0ff270289a311a61e177306f53", + signature: + "d803f1f409af803b290e2fdc61dd3df32a7adb61f86f8d19f8565b47358fce2154a34ae6c70a73f21933462b4b75b660d5e2ab9492354423eb5fc967625cb9fa", + recoveryId: 1, + }, + { + d: "bf748c4abec3b75c26190614bd855e242f64c808b8b53ccef8b5f0b9e22a98b2", + m: "e05d1e79cd8001dd8f26eb589d967a4fd729c21f69f0a2e840d7816df8a5a57c", + signature: + "ab9880c890f79b43b9298237d9da6538cf9f759d89817699d19cc73b0e046b6e66595400308a2e5c082d55847493293e2643b6f07859dc099054cc1e10749bc5", + recoveryId: 0, + }, + { + d: "317463e114a817609ccb3b34e698b39dbf0de0bfebd25c7e1aeb7a62533d024d", + m: "4690196cce2833017c1ad9ad2dc59be2a30dc997f6e9ad0f4c90d9b15a548fd5", + signature: + "a9d7bdd9225bff24f2ccd96f9d34f1ab6fb14bd7a08fb5ef665d018cecab661f68a720ac9a2b6041f19fcc4fe5d193998bd2a5ac042ca1667389cd12c55af6da", + recoveryId: 0, + }, + { + d: "159da171a7dc7f8b4330079ce0e230a15fd0da4bc87ac874368f639c45139a78", + m: "7394a7c74abfd7ba4bd2e0c885d48dc667c365c880e760e717b6912fe173350b", + signature: + "ffad899e8886ae04b89ec9f66a90e0fa1eee9687d670d8021545b120bc94c84861c8e8f92e3ad170cc28f2a8c7ea6dd7ed332d3f22f474c1e9a10c0ace5339bb", + recoveryId: 1, + }, + { + d: "fbf4a0598be8435c73d1fc692b561b3e56990cefeb21864fe082b0809eaf9742", + m: "3ca6eeea0c362b8909eb7039431b827b4754055fc1b312e4ae218519e05676ba", + signature: + "39e54663b58fef683a0f90dbca269522121584e5a57e9de534059934825dd5cb41a7b8d0bfd249961dff7b6223654a3dee9fdc9a22b8ba7e39c542a941fdfdbb", + recoveryId: 0, + }, + { + d: "53f81ed01e78cc32f150db5de8cf8219ce59175ce6be8d63697e315f7e7e3fc4", + m: "4663032560bc4fd731d7d23b10c60f97ba34881975fea750cd7493956c065335", + signature: + "b81d51ba7b1286ec04fa1c73e0d6100df09a8f968864a222e77c24642195bd341ccf82d353bcbc6172bd9dc1cdac1505943423d59bcb36f1089d991092348eec", + recoveryId: 0, + }, + { + d: "7e0b0b5f9fdcd0af3db35cb3a2caa75ed1dda538fb855025bb606dd55e47dd6a", + m: "efefe26df51052741dac9b701d937d8c79a468e9824337c0b35c2c551764b06c", + signature: + "d121e8712e8088da6bc7d741045ed844fcd098b49e64e8f8d67d9b9ed078a2b9090ecd0f575bce3b2424ae2610aa6b2272456e185fa6ace70c88fe246071cb28", + recoveryId: 1, + }, + { + d: "f883a3821217722072ccd7a9d71c2aab4220a0596771f70573c2cd0150697be4", + m: "af6bfc437c6ddce5352da4e78949f7f8166b0d690fe3b8db672b5464caeb50f0", + signature: + "e7ae6f73eb62cb6703a1825f5065f0ef20cda33e13797879286f4fd0c6f4f40b41445e3ad88832d491cdb07f3cc77029294665cf8acb6580bdc2f4a8c27ad2da", + recoveryId: 1, + }, + { + d: "0932363bfe115b9020f9395b9f2487ae8eac62183183f2e70c56e46d31031495", + m: "1f3f7ca58b444425319b436ed60820f513e06933a2b77036b4cd0c0d7570713d", + signature: + "3f65d6121690e3a2710a1af1429aec8c8ee75b6859a229fa8a42a2e6c39c7e9130a69e3bd56dd5df67c27d5e8e43b9fe20be0a4427b3de8d60a56bb6b8272fb8", + recoveryId: 1, + }, + { + d: "a092dfbcc6bad5ca12e4c355a72c9f37c0de5148658d9f2b8f2b6cc3bafcf23b", + m: "7ca4a820b13063642bbafdb063666e77fe029768d43e4213e5b2fa5457979e68", + signature: + "1af00d21db382caaca8b64acb1aa085632d69645d0df7b8947f0f9a2f3e4406f44700c55ac6e15289516ff540a0c779a08a087a870c037ca036b490910ebb1e8", + recoveryId: 0, + }, + { + d: "d91dc81b9a86d06f49eec57e33b069c5e12e8dc8ed67e3773b44bca8506d174a", + m: "fd1411778598158accb87be77650f5383df47478bc962c4d720231b5f672cc29", + signature: + "4f49b6e9364eb500718c98b1e67522cb284b4ad365990839bb744002675a085e311ffe6f67fc1642a09a3c0308fa0ea6f52c09a7d3c55fdd12b50c9c4d1eaa91", + recoveryId: 0, + }, + { + d: "c74a4e21dace38c8578965961ed75645fa0950450bba9fdb7217755c274fa5a5", + m: "baee28609bb63af6c0940747f6348e1a3beeb5987910177f8dcae422c969eab7", + signature: + "410f0187abfe9806c0e76f1619d51a902f438c54760404a29f876fb2bcf9e9784ac8bbeaf556fa35fbbbeb57a89e24ea2dfd79a4f5554538ec5d8dfc14b4de71", + recoveryId: 1, + }, + { + d: "0d64ce60e699c042edcbde0683ed8d6d11c96bc91c272dc358a998dc8b3d6dab", + m: "634e9ae5880fb0ae30b5205ddb73261d036068672a7d83014916a6addecf5ae3", + signature: + "176653e3b0593afbd3b7ce62ae4d740350db895f82cbd42efcbe71a113f5fc9604114a8fe6706115e6d826c1c5a87e74b193fffdf5d304db1562797b625a6429", + recoveryId: 1, + }, + { + d: "e81a578e7c56764efdab70ab4897e8da681edf8f44688b555936970065abeb9b", + m: "73d33a27607c8868f5f42e29ec3f8675c069d786411881d23c82ae899f3d7942", + signature: + "7168e4bf282615c6d926d372f615b6b0d3bfac1330f635f1a95056a19bc46e300fe5eb539680d8682f3644db1d93d67b540c36966030734c4f22455ea56c5d04", + recoveryId: 1, + }, + { + d: "75a3c0de7a838809ce5e4b3989e6c866a65e6acf0164d19c5c2a14515b5039a8", + m: "a25161418c70754a07407bbd5f1b5bdc909547c7b2e800bc2e49c72993b78fd8", + signature: + "c3daf465e3878cc24e8c938e32cd366315775cf98f1f1f745f164087d2f0ed5c1fb4ce991a5fadc46bb9c289d061be5d54bd34b4d3b14d842104eed913f07dfe", + recoveryId: 1, + }, + { + d: "541520c877916cc07b0ac4e5ba376888726f2b8ce0f3058bd9bda0adf97cd770", + m: "4065f0d0bbd5a99f024467b1597b59b8832e71d73393edef554b835a3496e54b", + signature: + "a7dd17b35da117cb863d58c265eb44a112015b10fdf90665d83a266c592f1d591dad36e2df2a81b14f52faeb7b5644c9fe721906c92b0c048a669e68d278dee9", + recoveryId: 1, + }, + { + d: "cf172b5c47ec9192e899dd9131815ab9d53f5976399d4208354bf7d45c0e83f2", + m: "3485b611f293220da679763cdbe5ae11dea5822dd9e84d66d61abea3c919bdcc", + signature: + "202594dc1cb697822084b16df1fd58787375a01fed8a5b70cf40263e1fc7c23438cd69f6ce1d487be3e1eeeec361d82020aac39cf907fb7487d8ca53f89ae026", + recoveryId: 0, + }, + { + d: "3491a9334ed2ee4c7fce9d84425802b0c18d3438f7798a8ea489451f64d7957b", + m: "d8ad009263a8a01c980019e550a0a70dd303ea3b48b898fa2fa1771a276c289a", + signature: + "8996d6d4dee79873d9360b8da56451196375c19a849d5e6573d3ae1eea7827f67755ce7fdedde25ef0e55f72c30686ab817ae4563c2754b9a0de7e91ef413033", + recoveryId: 0, + }, + { + d: "1d5eaf1b404c893b4ea99e7b03ce9124261fc31706e7f3060a0b4bfeda7b46bc", + m: "9f8b41608c6bcd00ac3cae720694c59177333996866dc7399fd33df1e9905f42", + signature: + "8e637466460b868db9c9955111d40991d03373532fc2c24ff28836ef33c20cfe450920a844e0f0d4f1a7bd6b9b9688a6cb684ccb1431d782c45056f9a957a61e", + recoveryId: 1, + }, + { + d: "5f35cb30d2880b8f2af1258ea38207e161b586e6f892f5c59505382d331392c4", + m: "e07d234143f27ee8850fb92c691282101d24f2002ccddb2c72531ac5e239219d", + signature: + "f2ca357539df1674f4be7484ca489d2040a95bc7899dc3a5961e50884149d0841cdb3d22330ee431159d77b693273598eebd2986128ebf5ba04f19fef5b68a14", + recoveryId: 1, + }, + { + d: "9d2b8ad867f470630ddbddbf527b40a5040ebf1e0944bf38910962607f05a775", + m: "d45e8c533637a5e836124609684bcdaa26aa25c2d3465246ba83c75771a18f99", + signature: + "c2817a6ecd75055c24edc72e661b87457b653b9c877bde0a8fdd0aade060a9852e49d4477d78b95c84d3858c08286af73897ef22cbed13348711d95be9dfc2ce", + recoveryId: 0, + }, + { + d: "a781db7ecd2e0ba805da29e2167d7cc1f9b7c284db6c8f42e7408f13f2f0b6d0", + m: "aec1ca205181f733d4e0c238e49aa701809f36929e6f2b96a1bf81fc02bf108d", + signature: + "3c549e9749f52ac4433d6cab292e1635fde7002f061e28795e5ba02aea93e43b03c0b35ed45b6ca21f22889ebc62e7bbf1a9968dfd9fe6632dd3828aa29786fb", + recoveryId: 1, + }, + { + d: "d0c33dc1a846514b5f786a3682773b6f3b019d91e4f1a8a45689c279e48ae322", + m: "4a7fa73636b4bd5fd66f44a6128feb542f77fc0dea731960b60f0fa3e4f31c47", + signature: + "4a943229ef4df2155e4ae279b6491204d06ba95152d59207149ed56239172d4c2d7c0d8129a82e2acd6ac22f8a65a314b92a3cc51b63a61d2f5ebd6fc5486355", + recoveryId: 1, + }, + { + d: "5e51e749aac7fef86da5e404cd9f19b748d74f2ee3ebe60287fdb407f4bf2d1c", + m: "9c47c3108f51c890e3ad38f3601530d4869115c5bcd122988595aa669d017b2d", + signature: + "6579ba042d5962a6e5569157cfeaf917d7f7295e2754fd2f7f555512c12a2711111e8c955287a7220ce59e9ec9685b30d08a49bf6c84dc254947636269e7fd92", + recoveryId: 1, + }, + { + d: "688afc0fe5744f0860320e2ec66c5c340c15c81ca195940df24b033c36bf59ed", + m: "989a06a22cf2810f528b9165617edaae5cd2ae1d4f6b4f90461d27a89bc1232f", + signature: + "21cdd2a653949a58a464c7ace08e5112392fdb79ac21330edadeee29207547f158249290f2e30838dc643a8a53638bd122263d623a038612502393406065059e", + recoveryId: 1, + }, + { + d: "9e5938ee127d8cf9db7eee508e370856ec7bda45aabef74ed886f02c205b74a5", + m: "6a82f06c32dbc105ea4b93d470203d0968efd08aae7fd17a5be2b45bbde17d2b", + signature: + "5a5c86ca26aba03146cb65b9c4852e308661245fbe894ce31c1303281d3a607d7c13a3cbdecf2768ce439231a34d3e593c0cbe56b603adefbe324a57de71770a", + recoveryId: 0, + }, + { + d: "575388fc823da21cb030833b22dcb90c49c9e164026438e88a6d34c2797c253a", + m: "3a6be4b9b7be749d2e850601cdce352f9f78bd0da7840940b4333ebcdf0e5441", + signature: + "356a86ff0815151904778e386234d8ec74048e0baba2cff3aaa41ad03026b460324bccd4b5feb50982132854b0b83a1bd678d46b914aad638fc44bd93a01e1b1", + recoveryId: 0, + }, + { + d: "d7bbc314e95511ee8b5b5df40b23d5d1a90b79e0d850a2bfdd22ef9b5a351548", + m: "d67557daf52499ba18824ec6a54ca7560808c98c5f99d129d7e5bb07b2ebe5ed", + signature: + "4a3f0b3f7479cba1ec9e02e5eaf7df19ef89baa383b38b5ca8aaa7b00987520432110dd7da5d18b569950d87720226888ab66423f75bb930dfb1669fd0ac461b", + recoveryId: 1, + }, + { + d: "d2c7aed20b7bc91e493a9b19960a506b7a2fa97660acfa239e72665bf218e616", + m: "81996324cd1ac1b079527e39b58cf30a60f430ea758e269a2f27c24674a7f9d4", + signature: + "1bb4865b0b41babab2eb4d3f48ebe95d3209f2eb029173b7c75caa91c4e7ef307b060ecde27526e4a99e6755124543bdd29ef5967711125a75e4925c72cd879b", + recoveryId: 1, + }, + { + d: "04524200c6834118c652b1750ce516e6af7f86ab440ca33b62bd19e4dbaa79f2", + m: "8efd8dc8a27194c450c5bc4516da786609c0935d69b14ba5bd1c2a565d027f6c", + signature: + "578bf6d11a63380f25d374d089e72f303d9622576333d0627252e27cccbe0e5a45dca211c4bb9d83f1e82c1ad49fc81cb4f347bd42a31bb2543bc40163401497", + recoveryId: 1, + }, + { + d: "51ccc5c7907bb217198aab2cd6e0c0a7888d408a5ba1a7affc3b901145214372", + m: "4ea28c04d493839106eaba1c475f8bb964a00fe6adf0323c0b87c9b571263650", + signature: + "c2e42c31325a4303b475d4f3c20a712db46686f5c19aeb235f51644eb8317c3f7f3730b994a437b310f86b06ced2e3b298187db8c132d500092bf3e6fc6a3cc3", + recoveryId: 0, + }, + { + d: "fc3b140b74a6880696c28cd49bf95a832824941d7fe07fd200f9709efe1f03bc", + m: "9d5a1f7741eccb4f0e4f464cacb8b7392327380a759ab40a5e4d91dfcf9b8c0e", + signature: + "68e6b1947185a204d516f191b003bde7aaaf08ffb350935ec0a04c02f77147ff41b226d89f001817685a7343f528feacac80694d443282f25b5328b79b47f6ac", + recoveryId: 1, + }, + { + d: "626c08f7440d9a17023ebbf3b4cc4f37aeaccff81628e5b0f332bb01bc3cac73", + m: "2d4271d93eadc1d47c967ad7cf15c746e762b03ba0fc3965c9e5cb8b4523176b", + signature: + "138df9761371b9029f8b94e681c84309167e45cdfe08fb90fbb20d11792089a94e286039c948263fa56374b8dc37edd61b086ba3bfb1fddc2023c1b506af43d7", + recoveryId: 1, + }, + { + d: "ef6b768bb8e95df6b08039647994cbeeaf0246ef8cc4414b739e37689540fe72", + m: "cab0563be44e28141a6fe7ab2a8cb9b81085d7c8fc8e37942f59f6472fdca2d3", + signature: + "094c1f383ac4268ca6cb50fa12de7b94904c03f13f027b559c3e80fb90571970633544827dd12138bbfbd5a394222ce25ccc881f3161341434995a98439c34a9", + recoveryId: 0, + }, + { + d: "f3cfc75108769bdf55fc879ee9a56481ce7266028cbee8204b29d9f4cbb7515e", + m: "2c6edfa019814e950684ce5a3a3ed0bf1cc6882f37bf66668a18fce5f068c972", + signature: + "ac28aeee87a8ba5a8148177217119a9cf1755c78c0259341933b374f7ef1f73950aa438b5987f0be5a2016564fda1160342c2f43ab7b332418b44697ef2f1f94", + recoveryId: 0, + }, + { + d: "a4fc6142a0defd0cfde7f9533a2061f8dd5d57a7ea97b1009ab029c3c566b3b8", + m: "5564a06a8384693b09dc30e34098460e2a96d7e15336baef95f02a0a8b908a80", + signature: + "500dfab312c37b2b723dd8eb0ad709e3e1e1681a40cb1582c9e633960f795da9416db7b883f0473795916ac90cd5cab663140ea2075c56e1ad89ba88786d24eb", + recoveryId: 1, + }, + { + d: "e52f94f9918d52ead5f5d5764860b0f1677bf62474e44e17e1eaf1f6af793ab9", + m: "3ca5ac87651f2958cd5a2f19e8556e436f600bf8af2b15417383ee75bd832fc9", + signature: + "ba5de3fc424e0554cd1ed15eed900497333479024825b495460b16c45c584ac33786386687c0af6de87a928a212c90a52c6ece4e02a81e1657a89b060c978d64", + recoveryId: 0, + }, + { + d: "3d053756837d7202cb275458f67f19c8cccaae303e003d73e86886250fe4ef16", + m: "ad4e4cbfaadeae361c4e53a913bae02568efc5230e5ffbd30ea93612fa4ac579", + signature: + "f89698b5bdf29c92a99c5e87c53787e3323d01f3f3f39954f186d8c0d5b005d61f4ef8b535bfe7b9bc52f397e465f4f317d21a353232f2ec11e6009a27c40ce1", + recoveryId: 0, + }, + { + d: "804d95c194899fc72d51a31e4a674c2e319658c6d3b9fd9807eaa5431afd3a64", + m: "36591dcc52dcddd0f957e7d077823e5212aeb907f934d6a3fd22cb1667afdd5a", + signature: + "6c3c23faf125156e538c00b15e8aa348693cc9b526ab4f0035e2eae08cf2e3ac626493cd16c039929752a9c1175217750ecc76e576396e48e3dee19bf34fc420", + recoveryId: 0, + }, + { + d: "3ae50205db1fca1f0535f23ff6e07bebd68a6ad3aceef21e4fbb1c9308f63cdf", + m: "cfda7a1f361b8e8cec1433b858ca589c695b05b47502bfbd8e8c8401f60291e5", + signature: + "86fd059333eaf7453033fb237bf258e56283876c5b3902817490c7c556c55b1f215b4dbc421b5185de42db86335b33d19ad577e60e02b52a06caf978dfb7e511", + recoveryId: 0, + }, + { + d: "e1dbf2d2a27a93daea87028645df711f8f7a0d7d74e5ad42f1339547d2956045", + m: "1a1081c7f6caa5af5be73f3c5f1316a3893862586ce916f88f9c9d8a228e48db", + signature: + "d372911a5487d66547af9153c477a5dc3bd08e4d7f37dbb84224d01e7034ddfe1de3fdf32a85aad65a5c8e269b9d9460a1e658bec707128cbd8b82c84d7dd8f5", + recoveryId: 1, + }, + { + d: "319f86a6777dd03a62e5fe0f80580626ea7a6060cd35d695ef92181dcfbc9705", + m: "1ec5ee161bdc56c40fde223b2b6a4526c5fb4465eef03c05d20fbd221ab5f845", + signature: + "534750ce27e809e33676fca34eccc541f957910cad0a66fa8dd218df0051e4d400b7563cab8344189279c3c808731eb9fc28233bb3dfa6576644d92d74c9fded", + recoveryId: 1, + }, + { + d: "7abfda970ce1bd8e30225bdda304e14a432f96f059bf1887d8d9af504e248c22", + m: "08b97961dbe69c2c38641bc49f4c32b25f413c11c30fc961aa656832edc4246a", + signature: + "21a80e0fd94bfd97158194b4e17a02783c03f86e08b2b15608cb540958516cf37f0970e321296d0bc1063dc5875539b416f5ae34fdb3f4d19dc3ce379b39819e", + recoveryId: 0, + }, + { + d: "145a5446748f6a759cb4832cee4b93d367322833352b1e7e98d323e784501929", + m: "bfdfece751f9f862f95f726b524088e9789f7722dcc4ba4075872e16f9f08572", + signature: + "b586c1988d10ac202ee4e1cb4e88259dc296de62caeb9b4246cb6e60d765d6e8388ed9ff329a8db6919a457924e43edd963a7bec0d5de4a8c3af7aa133e33593", + recoveryId: 1, + }, + { + d: "9a78b4e64b6b9397cfd2574cd8f2fae70bea60cb1452b33cd4240ee9a4a131ca", + m: "f313778ec66ed9bd1ae3cbe0fc9e62914a56b735ed5a7711d324fe3a50d8e9cc", + signature: + "da1f19697f4f7e86e0ef891396fda4b9db65ce98f08054a2100c8fb63e1b3d7a62a941f17196d30698a0e3d59cb9b57b1e978af973bb308f71bb3a4c47121c7b", + recoveryId: 1, + }, + { + d: "51cf63816a434649a0689f1850f9e5977c3229e96abb0a33c49b55eae7782e56", + m: "0cce3ba3b93ab797b914e67d8968f04d47bb1a7260a96915de53854bd1868ad9", + signature: + "7d067d4154538c0f933d8ab5924aae1a847ea0c72c467588563c8a85a13af51a59b8e9a9d7d82ea315bd15220fd7a0ff8d3e0afdd057c1713579bf0ed56bff53", + recoveryId: 1, + }, + { + d: "ada2f47d058ff6d29ad143bc8ee27c39c92da62c73523859601e97f0bb7485a2", + m: "b688291a2dbe6f689a34986a0389454000151f11c10e45276a0de5baa42e51c6", + signature: + "4961d889e2efafc265f4c1f9165461a3fb1afaee62be8e5c9c0b9a8402f2fb8d21de681b3a03f898943123243bdb9bea54043fb11934af5f7436198b7099fcfa", + recoveryId: 0, + }, + { + d: "98bedf4f2fdb9c88a491216b216e7806a8700af05c59353b8076580e2cdd0515", + m: "113f81e63e737e2bdf7e38fac713bf00807c0cc298bd6f9d10a563706a06e06f", + signature: + "bb3af6f46254d5b5b467f8441c3ff4482ceae5fcbda864fccef91098f06d08bc1eec2f7f42ec14284b481869233a8a0f4b1ddfa98f4aff1f88accba964ca1db1", + recoveryId: 1, + }, + { + d: "bc22e73eb76c0d8ae089cfbcf1cbfbd2b7f16d6c807432c9ad9ce5927aba1ca1", + m: "cf93169634403073067284b1df0f01ac1bfd0dec5156c51ad654c906030e0f96", + signature: + "1282000589416210ecb9002f3e696ac297552ca423192c7b7389485f223adf7f7d8118e9aeb9d667fd9647a26c4c95ac5a58dda7a89bf206fcfcaa5defb154bb", + recoveryId: 0, + }, + { + d: "3e7ec6e9f853a38988b2d04621ac1944a984552f564165146cf0f448107ebd88", + m: "03d6d0f74bfdc779dabeba462d8d2fa9defc9f1d3a5abf3b95bcc15696c044a9", + signature: + "4dc2c286f76597cb624686cfeeb4afc3e67fcc54efac7d985977b6e045fa8c2511153b04cb807d1f75d58e080b4296db4164a87fae9f5bd27d310d0ae8b8fed1", + recoveryId: 1, + }, + { + d: "8cd41b3c4bb326712b5306de74d074c9ab1adf58c7ccf693a014f52eccc45d54", + m: "d829d88636732ffb467bef66f34c8795c0436f561bf2f3c04762b27bfce1732f", + signature: + "ee5d03f49896ff787e3c1a7809a6fc7764d52eb0b904804087e0a0a256fc86084eeaccf916c8a810d2e15ef7fb99e3c7a4dc91fb84b569bb6bda0a9774c6f514", + recoveryId: 1, + }, + { + d: "3af549f0ad12ac7e4d48d1a170db6d94da60db07e10526a463bcefc6373c7bd3", + m: "cc905235077db1baf86b159d17c99a82b94ba6ed803f2b91e17050527a9f336c", + signature: + "66566b7746af3ee91713b20a8fc19cf32156c3fb24723225a093af74ee36f092758f0d14899fd2131c4d4744e4d5798609d0d8109aabd26eeec33100dc76b0d7", + recoveryId: 1, + }, + { + d: "65f2cf18804332508f7ccb724dd1d43747ae2f9e2753c4dd2c175cfc25278d9f", + m: "1fc9f015e82da0f15b78511bdc89a562bfbbc33cd223f40d80cd3218ef4e7305", + signature: + "01325564d95396560fa2d2298b52fa5181c2ab07956adfb835848afe7fe0ea2b371793e8ca610961cf3319c49cdf802517afe2bf7ecc29d87796a6a87b6fb5ad", + recoveryId: 1, + }, + { + d: "6be9b9326f3027e5c192748958f3e71c8102d32720fd2cd5f8ed8701159c7552", + m: "e1aa84fe7f21ec782971c4dc404ad1b2ba53d3f776c9735ac7736f1d3ed81842", + signature: + "8d57d9024e41efc819ed539586bdea691a0513de3a2be559460656e1c8cbe9d042f19e92676cd360fa38af88728be6d5c7503c0a5c2fdc3bb5d4f5a850c59640", + recoveryId: 1, + }, + { + d: "4102216bd6e3d777c1a88d45d2545fc58654879cbcdcabc0675b636941780b34", + m: "15b68485e082500156f763a58263d9fa490c6c5b0b427fa3ad87372f6c64c875", + signature: + "976af21e49c4f659a4351efdd4bd105961b4c41f964faba59bc1f7b84b040c631b19c7d5b181f073a21a1926d93e2fbe43e111a3ba117e7e9de360b50b562a02", + recoveryId: 0, + }, + { + d: "d736528b8c0e39c1b5904162ca32903deffd14c8aaf1d0e7e15681c5163a1da9", + m: "2fe4bf36ea6b9a9a2b23ba0154bd745c3401b8a63092166f1a8c91f4109e150c", + signature: + "e8c99d18b89d60e6efde54c2a91e21c20e695d6d0c7685eff21193d2ef697f742f04130f309b44b42a380b8889a265937e49f4d8fcf3a31f8a365d1e2e4c2ba0", + recoveryId: 1, + }, + { + d: "fe19b62f7ad05f25c58c42991b03c2d1b959108f1336151792cdfcf47903b651", + m: "f53d32003cacb20b162b6fd32f3da329b465d117cbbf589b7404c85e118e388a", + signature: + "3a305d98c453074cf565cb6142f1e74f17e5ee340168778cb580d0804dd9711d564685fb33b4fa42965f505eae3dd744c72b932d74ac12dd938360dc5257576e", + recoveryId: 0, + }, + { + d: "4f67630b458ce96d2e42a5b61f1dfe6fca3965e83ee294642d81ef0c0571dc5e", + m: "0b1a5d781df15cd6d5e9b9b86173d7cee14fa0724b2209b295f173545ca66679", + signature: + "53dcabb6ef2e238b32e03e71472db11d213333bd627fc524fe595cad4082e51d547e45371c3dc48f714a306731adccb0609a0a6505bd1eaba42b2d85de54294f", + recoveryId: 0, + }, + { + d: "138ec4d54c3a66111685cefa01369b9b18901bbd80aa8156e2053026e5f159ad", + m: "a060004d75472f2b87a13ee0ce9525937b93e0c4829c4ad4a2f51699af6c9740", + signature: + "d402160fe0266cfba28a078cf5bf175da08ac2f1f0edc36a6d1426f4af6532023effdc95b8ee6c37ee53d9b7b0339d0e8ab31dbd02b7ed590d93e5b5f645b7ca", + recoveryId: 1, + }, + { + d: "4eb6229422012aa27b4652b6df12fedb8a1ffee3550603fcb1b9287997de9deb", + m: "8d4d55d38cb4e9b8c0d72213f25e6239ded401b0239d5f4ac7236629bb5a66b0", + signature: + "a075d5a27071adfffb2f1cf3d68644ab5896d70feb2971a884514e761ac041514998d06c3e08f1e84b9256bcbd0717bb8d4c925e39e5aadf54da0e47d22832dd", + recoveryId: 1, + }, + { + d: "c83751767fd086be1f70db9f510c1ef21f1ae10ec20a717b7f261693ba7ed9cd", + m: "75c8b77c4b6df6924a6810c3d69954c32b295be14ee3e64a7e0cb7b04f584f83", + signature: + "04148f9676c120574bef7b3b5e34b24002a3ebcfeb812e376062faa6ddd6c4422ae4ed3c53a8accd7b80d1401a6eb81fcf9372e485899162bba9c7dfb44a19cb", + recoveryId: 0, + }, + { + d: "47083249061e9c6a8a5b2aa24782686eb43ce376e1f4397f66b8015cf5f34724", + m: "a26fbb86b6076b0d7a0700e0720733f2c2fe86f9ba0f1fa03aa97e6c1532954c", + signature: + "b74b555c454bf398e8fa67235201014db6b40845e589ad35ec0f93d15e9e85d70697cf5b9a47901c2cca8fe21be390f2c882fc2dd01fe88cc5f170843b6ea97b", + recoveryId: 1, + }, + { + d: "a0eb03bffccfb85698d859b6c80f08e69b1acf76e21f611b8355ac408e8d0a57", + m: "1c9fd8c2d133f4aa5f526ba89d9e8a518f26ea35f964765faf05895b77725c76", + signature: + "f99ab8e49bb22f74f636cf7713d3e91bdaefdd062a9490c8ff3fbc77c9200a9b70b5c69b97206aa4717b6aebc5faf450e5e13f1a70b991ec15a2fb7217035c12", + recoveryId: 0, + }, + { + d: "15525964767274dc685b2b6d5130328ef4b94c6cb3746a16cc0c24be0f309de4", + m: "ba63346a14f7df3cad9bf2bf8da25292e869d2c1a552ea72e4325fa29e9be5b0", + signature: + "58b44d9ed458d0a83176bdae66ce66a00343f4d87aa7d4a8b44f3f701957dcb044507ba41eae2eb8e55fb3d4f0dfe7d088f8bc6676e4dbdb0a3f25b3be68831f", + recoveryId: 1, + }, + { + d: "e94f208bc45194bc551237717e34440c96744470352682cd23ac336d327e6f86", + m: "203ff66753c6d536bcf752eb78ed25aa869cd4ba5e5728cafe34658f5f8867fa", + signature: + "b15b6f9b0b794a6953c02a45a6ddb1f066a0713276672bdc2a688d05a34fbef800377fa637679e059fb2fbe8084b1f3d91e4fa78668457bff1c4ebe3f6744288", + recoveryId: 0, + }, + { + d: "063b2bca100c776077203b503d185a94fe28588bdabfe2afc5eb1151ef56cdae", + m: "a212e462c1d3e6937a45cd1eccbbaf90c9c7617ceae9c63af9c0192ce6f6779c", + signature: + "669478a2c454a752c39a8458fa85c95f44c36d081ded5d72f7a55ec4da8bef484df9fbf9303f590122917f01e74854185e844dd1b2af65c3e5b5db661e0fcabf", + recoveryId: 1, + }, + { + d: "651af14f4c5232aa1eecb98185cd7e480d58f6b3dc6778c237a8c1ed989f7146", + m: "64acfec1d34e7763a6ac080dcb70fe223f961d76679e294b32e28b9b4da716b7", + signature: + "5bdcf767ed1275db972bb9536549169f96af31c9df1af4fbea9e15b1d76eab5538e042d75499652f037a8bc66b5a972aa7ad1d85f6e152021cd2e7b24c280fae", + recoveryId: 1, + }, + { + d: "f148098c9cd47896d5a2c30557adf4147386dd7b788afe2a7d6d1707f1b291d9", + m: "fe65d054a7c6b1f14c5f04ae091c9f4211b42f69a2ab91911807bbdd28ab7f9f", + signature: + "6ac8304c0ac235338c07c5bc249cebcbfa9f952160f24d2213946fdcf1632c0c6ec3b56c477330950f417e306e1a33329242f2ddacdf23f8926d94347cee2bb9", + recoveryId: 0, + }, + { + d: "3c9b13035c4a135937da1a32974cc34783542b997f2021b2f033675663b23f2f", + m: "548e4e854b5534864c3e6efc64605ca9d7458f1f5fb713910f9937f577c957f6", + signature: + "488082d5caec182ec2b819782cd6d280696933f53aa906813ec2693e75ff1892665fd168be4c89523270f6761fe235dada76229e687f233715bfc3b919ab7510", + recoveryId: 1, + }, + { + d: "6ea41ac11a78f1c1ba74256f43e26aad12e1612256702a1ca88cf65e53f33ffd", + m: "952cca438ac7d58c169ffaf3076ac3c068f05437338967227222a8c332479739", + signature: + "f59742404a75d1f2ca51a0ced7179b7a1de80d9834e0f7d446457e27d02d18942f08d06aa2d346e1c40778245484acb63ff1838b47b31f2221552335fba0812f", + recoveryId: 1, + }, + { + d: "45022d910d9468675416051959e68d21f3715e670b97c3c012099ef5d3b0a402", + m: "4a3bc0f80ec17c231bfd384ca2ce855d83eb20054817f1e5f8b6af5e9f781d5c", + signature: + "1f6c50a55950ae8e9307e0c777f820b10a4f66441453af817ed71654161797831b0a07f479cc2182dd891902b06335db3d8542a94274395cb7b1b504ff54cbfd", + recoveryId: 0, + }, + { + d: "2a0d113e3293eb774782fd5135961acd96104dd0f0a73f35c725b4d6c1664f95", + m: "b1ebfd049c6540eafc0f4855d91485c2d7dff9e36c819b7e5ed71d05c4f0ac85", + signature: + "a76081604bb58a94da4fb7e7ece0a55070b6fefc0b38c9a7abe814e21e1390f34fc425a62734432f79290ff12346af70d010645f6caf30e212383d2a8d9b9af2", + recoveryId: 0, + }, + { + d: "104dc0728b1fddc191a1af34c629557af47ced973b9af6508b824a1c0f333563", + m: "e523b6951e4728347fb95ebfe423abe3d8f65e0da5266c7ef2cd8e6f044a43c2", + signature: + "c9365a5c8b14f364d9706401e5085bb44d04b520f16c729dae97ba85ef5a7f2e089b7daeb44cd84daf9978144ab1e008ef3446f01ca2417247e3f1aa3f3e078e", + recoveryId: 1, + }, + { + d: "f027b6d609e5a991d5dc80da0d378d648845b68daffbc990731af60ae5b66bc4", + m: "6a86dbb5efd4d8d7c6aa93d05b09862d25223c28284be682bf0b050b99be217f", + signature: + "8acdf01e3d36af8ec3ce41d7cf67b280f16c39548b6009ebf4fc32b474c426731f678e713be188df04e82368a57dbfdba48c88beb615119c68a53fa19cfc0582", + recoveryId: 1, + }, + { + d: "4063c471b1a3fcca8bc256ad9da354456a3f4b4fec4fc7d255322f6a45494783", + m: "3a59eeb8d58ce769a7e096adaf5068da7895c5f6dd6bb130b7662ddea8708b4d", + signature: + "39400f1766c0223bb0ef8b77c112605473cb445c4896a25ea8258e3caa00b97d517bcd4ad01be13056da1ce65cf732c843f7402056ab09129c6d127056696a46", + recoveryId: 1, + }, + { + d: "dfe9d5aceecacc5e1b19b6e24c9bb788a4973a3fdb7d7382be343481641a678c", + m: "da1736c7349b398633a82c38d4f3be5bfa1641a321c6f8401f820f63332d0404", + signature: + "160ce38c47b27715e34f0498b62330e12edb33abbed0068a06145c54d638f85f59389395c7593cc92fd0bb7965aaf42ec0345f668bff26b0b7e29da1e2c2f4f3", + recoveryId: 1, + }, + { + d: "b08076c7036e6133dda516807d23bb365aa246d5109f311d16157f5e707d8edb", + m: "77bfce89b6829ab1417b2f31f4625a535bd6b9db821058636226cea941384e66", + signature: + "8078c0a2c205b44b54b06aa3ef1d0a2ba93e0d313d6b97e05f88db2492dfd9506795c84ba7168b774e8144d740ab71e85519dfdc3d6bb18cb100a8ea70a755ee", + recoveryId: 0, + }, + { + d: "61f928d9f518f7c5a3a6ef4763a9b4663119f258bd604ee3f972057add4ceaf8", + m: "082046d4f8b85e701256bb1b8f7e863baa216d2215f951ac0aa16792d4b63641", + signature: + "5029b6ae7f4879a9ccdcadf8b0f1bccd1ad8fc14decfd4e7a581c61d4d87e1f768e96957e39657277c20414db6afc862ed077a105eb6b41ce9032a16ea1a2522", + recoveryId: 1, + }, + { + d: "b72a43dd5d89ba464479c8f18a5bb217cdcf88bf0417f6d8a71353c20af83b11", + m: "92023c4354c668efa18b7e92f7adf618a6cf49cf16401e0ab13ee5a64859188c", + signature: + "f535d1f4a2e3f768711f6fcc2422327c4967cbc0ae0f37e559c9cea9db579dfb32372f020125967b9c28166dd4f43ce4cabe7ed53ac042d8ed613677ce8c0cc0", + recoveryId: 0, + }, + { + d: "725371e74ec211636f11fc2727ac980cc7e4fba257fc9b5f723cc6cebb82a4cf", + m: "2c3ef216ea560fe33fd19b511f9c81206b8e26269072a4e0490f66c177084739", + signature: + "1c03a52ca368f6b8d76aa8bb02b3fc4e127eb5e0779f4b52b0153873e45ce11a2b9a6dd1fe4d691fd0e7b2b14ebc5269a24bb4694aeaa4bbd15e4cd9626bdf80", + recoveryId: 0, + }, + { + d: "0cec8b7f411b87f4699d14fa568512ca1d7e4b20220529f3aa8c6c822836cce2", + m: "fdb614f5d67af46e66a6a5ac8591b7c5d94966b8b277b96018295c1c673471f1", + signature: + "2baacaeb90e1f3688985fab00418abe8d1b9cb5adac4d362f99a3c936b78b769659b7cb4e62dad9e38481b6bb58264516a8d659e91ccca9e3a430c8c0ee93042", + recoveryId: 0, + }, + { + d: "53b57984244639f5064034c2b8fbd6539176317713b85a396c117b5bfd59aba4", + m: "3fc535b3d1cbc6c5a2b76065b4fa11b50d2351148255ae916c86659d6dd3e68b", + signature: + "dc2a1de41919a86ce4e74b8e388f859be9e5fd96b319b9a7455ab39caf40139479afec0abf8b98ba83ec6a6ca20b6420b1dbdcf42ee0793ba456f30e769b4e25", + recoveryId: 0, + }, + { + d: "9deca9cbe6b617346a3feb3434a9afb655e1d7db92c6e80acaf6771461a5e00a", + m: "7730a0269138301061c2bc6c4588cabff478e5ed0031c7dba160303e13a8229d", + signature: + "d6a18862630770d2e1163a27fb40a57f1bd13cee755685d10334c15da6aa8fc25c4e0776cfd992eded41b8869d8ed94a5bd92c66adafce5a4c42983b97ac569a", + recoveryId: 0, + }, + { + d: "9a269da2e124b30f46151ccb98539efc116a272ef38efda342ce4b70b15cea62", + m: "222a5b79ceee8bde9a0b6f6d1b3a914de1cb48008a277fd31ea569a12994747f", + signature: + "9178f7cc78f10d5c2cf8824f5e81931874cc0c4a655dc8a59c2390fa7e75f26d42ee19220cf128df792687deb1691851a3d366944dc9b5577d221d1ae2c77881", + recoveryId: 0, + }, + { + d: "a1b3d32c98df2921707e775e93d93d4442170afb8d096cc90a0c9825ec5210fa", + m: "187fa11af320a2a000f69a72355f5a3791662ba56c4c51700de6e1a9b1aaec04", + signature: + "93b77ce6d6db8cb8a22c1433678668496856890ef25756920bfb7174091c4c2a38ec6f57f9276489c89b9ddf65cbdf5096b519fe59768a78609d8d1eb6dcc7f5", + recoveryId: 0, + }, + { + d: "10c61fea4d977bdefed0bea3bfa604fd35eacb8001d30f62337beaf697b72c86", + m: "081eabc115741febea0cf644fd99ac939b77e185cdc0c6e2f18337bc14a2f026", + signature: + "00e175d3359e1e0a8032229454d8315c3bd3483b3287c62c67bf0d170b86c8cc48e7fc1ebed0f1b3fe9faa9a89d7104afbc567db0cd463ded8895ece421cbe2a", + recoveryId: 0, + }, + { + d: "3dbbd338d10bf84a262c093c734097689020439615f6e362ae8f7fa9679cec4e", + m: "11a8f5fd6319884dfa0b3e43cc57fd851517400bcffa5a3dcd33cebeb88a47bf", + signature: + "f86a03b381f83dd297d64835101d2b61f9b4ed9dd493f168e20d3d1e3c1cab3b5c3afdda06862580c08b1af0b5f40f2c8758b7c7aee1d8688fa5a96244d8e015", + recoveryId: 0, + }, + { + d: "85ca9592e4627b7a4ff43cd1e58da9633799657966e4985542851188621feaad", + m: "4bf8124c656d400d9284d4efe02ee511e79a8bbc1f6136f8497825dfe33466ec", + signature: + "9d5084aaa9cfb26565cfc5869f6336eaa8458cc413e098026f6045df6754ecbf46789ef7f04c15422eaec68aa46fe275e22aa29c6197db258ef6f4df45a18a01", + recoveryId: 1, + }, + { + d: "1ee10d938eeee3f3a1032026d018e51b4dfd2471427efec0a92968080f659995", + m: "a20ae4b3fb9f1a2aa661824207b547e8eb0f153b15a20e1a0c9a439ed6c58874", + signature: + "db1e92455af11221c799fbfc6922ead8fdb449996279fb198510abde2b3b59dd6adac108e1349016d9703a754e1020d068174641eb90ad1f82cc1a28b7b33251", + recoveryId: 0, + }, + { + d: "a414ac94ee236e83ddae4a3730fef7f6ce52834062f59d6b5f9bc5489ae54dcc", + m: "c9f0b25ad8d646242d0413dd975fd871a1a9a23e37cc35cc1925fc64ced6993e", + signature: + "36d553e7379ff1305e29806ac1efae007b206b82d24760e63fc12b895c16c166773d0a3f946cd21a51f4626e5e6a1539dc31747bb5e1c4ba10acb7b083cec0f4", + recoveryId: 0, + }, + { + d: "79cac0409879bfcb0d850423d579dafbd54e02b73be30953face7b6685140987", + m: "a0ef05f7408d70b8c4e627a1b6c0afef546ea81db69ed8cc6419b2a3edd29e82", + signature: + "21fa244ec7bcc2d5b816c2a211ed8a9169f7b5fdb8b98631bc6a1a27545af57c0d1f5eced5ae53713aac3f124c37c2aaf92da1ed6265fb449c7adefdc837a23b", + recoveryId: 0, + }, + { + d: "d1868729ece8530c7186754669698e83e317073085eb0d79c4420fea3154526d", + m: "282c223f672f776fce47f934acc0219b70b6de00ed596bc31ddfb27cf11ee392", + signature: + "f3a8792ff9ec59ef10d6c24c42ec1f948b67df394aab29cf7df3104304621c0f1a6aa7dea1d9c6d616c425a34115ae1a242d9bc94f20b1f08276bf352a958c21", + recoveryId: 0, + }, + { + d: "df9354363503934f6ef147be873c63e00172c5c450b2553371ca73081b98f4a8", + m: "fb6aea003722b484adc6bf976e0509b59768b39813d1b58b7383c0555e984f45", + signature: + "d16589b9eb79b6b915fb9eb21d024f483b264d4bf1d3778d4a2515f74bac9ce7703b03a9d4542c597bc3dc97bb9369ff73a939faab19bbb942b7c11e0bbe7579", + recoveryId: 0, + }, + { + d: "66784747b5cefb5e615ad45bd33519826660a06ec266821ec4ba55fed35d4b87", + m: "df6b72b811f4f93c4cfb6c1288cb856264656470e9ed94af0a169e6249efa122", + signature: + "d50fc052ebf45660815ff9cdc694266abce34c313d52c92251dd28705182ef6d5502f832ff4c5b305acc63db5a62ce40a2d8940e2410de8b1c81fa386b436f9c", + recoveryId: 0, + }, + { + d: "0591da7687245b48d40007aa293850f0daddb5919d997d312140b91e0e8bf042", + m: "cbb89481fa87a507cd088174b64ce02499476b361412d4ca4a6dda04578fd180", + signature: + "cb815b14b030d95482959043b03d7dfea965a34400067359bf1c7fb2b6d7123d7ddd4c10b9abc8606480268a190b0f63ba20d887ea148569b3c2f503359ebc29", + recoveryId: 1, + }, + { + d: "c4b11037142dba5bef9fa398de16e2da32f1ddb58f76ad0bbab3cde42c97bb80", + m: "9964395065e440bbfa62fe9715fef3a25a8e2fd5e8a4e6f7b93ee55ce4910587", + signature: + "22b56d0c58140dfec085a331edf3a5bac81573c17fa95e3aef34f4eaea6ca5d87e0c1b35f26698701e5763e531e15932ab3d7c3bc01e176a314743ec92b92eef", + recoveryId: 1, + }, + { + d: "9d2f48ebfe256a1862d64db464d0ebf0c986ab52f4eeafc883413b9051b0ed0c", + m: "b759646454d3734d4616f6e38f5b46aaf2a2e901eac4f9ab35f407dc75d40803", + signature: + "83fe351db1f27fd644f9a91167b38257a03330057ee55e58b68cc7ef663097160dacb90921aa142c55374dc0e232ac95b61b7b02183c1b7c7e048321cc22d5f7", + recoveryId: 1, + }, + { + d: "d041d3300177ca4936876c2f15a832a138eb222313bf091cdaad9378a58b1d76", + m: "c2db64b6aa189ccb74293fd0915b52d96776203a9a329f590117b64b9a331834", + signature: + "be7adae7f0bc32366ed06516f8cad3dee0a89d207afeee86cb8726f14bb9d5031b300eb2ad2dd82ddf1e5eadb39c7d19d558669d56fe320ad9fa2e06c3f17a56", + recoveryId: 1, + }, + { + d: "9b41fb5101cdf34f45bb62c6ddf6cd825528a8738f8fbe86815f8e066e8599ac", + m: "9556ddb3a627c5b4e3f6296f830fa665fd8875714a18cef958664558ad76f249", + signature: + "af2f8afa9bc2986ba4d323765de2332685943c98c358e655db9bd41c0cb787d36f3dfb07181d4de4942dd443ecc99a99c1ed5f890773ac929104647a2e45ed3b", + recoveryId: 0, + }, + { + d: "ac7652f34046629975a0df7ef4da4b73d995d136a134e568d0456bb6b686fbb6", + m: "6c60e157d96144001f983c74999aabfa7df1af7e04690a28c90b33808d7e1552", + signature: + "5cda3c47da87999191b784a5ed6493419e0d2efe8c589417ad2160f456a11ce941cf1b79817331727595a92b2d511e26528c1431f124e4762233a1ecc9e5e241", + recoveryId: 0, + }, + { + d: "92e7bff16f3afe293db6fb5b70546b176d970deb87db84d344be738fc3d1a7e4", + m: "a6b776842e8e6257a79ccae1b67f8f1b364fc1210780e5564ceaeb9346f8123c", + signature: + "1e271e005050b852b6c002267d0133f21dbd038e0fd7e17ed7e0f4901613162b48fcf7c4c283dbd1a8f8e98606cc26e1bac90b952bdeaa644283e2de26e8955d", + recoveryId: 0, + }, + { + d: "52cfc993535a57daed51f1910837c92fb00b2f3a54a39f66b94bc12f5eda6237", + m: "4d8b6e616de661886e9679628edc4e5cd54a197bc78098e094442cf664a62046", + signature: + "2799c6f4e8582149d4b1c209e62bda108b1e733b92f9f66b3fea0087c672d45f58c01d31d5be20bb067610358f4b1b73de7c6ad10682cc4602e8caa6e781a66a", + recoveryId: 0, + }, + { + d: "0de8021f7b262d423d98048bc31fa7abc4db7bc0207719914f71b48fe070fb8b", + m: "3655910cb5830e3c52302ee994a0d4279db67b823edf8089435a5c1afd8babd1", + signature: + "4a8c405e9dbe0a876239f32932c9349cde8bdd89f753bdad0d963ec228adaeac556193fcefb021dc4bf869a78d9af72a350aefacfd78f1f288ce2c6b69558155", + recoveryId: 1, + }, + { + d: "74261d63e761da3b6434d415cfef3d7848d0d8b46e9c8f1156ef054325fbe4b2", + m: "983bcc23d5dc12e75847180d47cc2aee6e772a0d9a82a331cb856584b0b63cc2", + signature: + "81c97fcaa1650c80a117e059617e0d658b4454bbd571de4f49b088f7428b43c21160829dde0a380770427c35ae1db18e7540e5e260c8cef555b367be5b1f132b", + recoveryId: 0, + }, + { + d: "90e0e1b4a6caa9c0b7fdcb207a8b005f1da276ac9975170a8e0cc5ae14719c86", + m: "c7a61cec55b2a0f53ecedb0c7e193e439387908b8782b0212d7998331425d9ee", + signature: + "948bf517d0196b3cc7bf485e18a0e5be6564140f38c1658ef99e5953c5332047445ed33e36094c5cbc276c8a218ef8cf5d9b5fe3cea46c198232b7907d6ed10c", + recoveryId: 0, + }, + { + d: "bd618e00e674f63300e28b4c6e978cde683a152fcf49e76fa3196b97a09f37a6", + m: "c18eeaf442fa64438926d4c277bb59511f58bfc5844ccf537f86d65afa02e677", + signature: + "42f6209b90805f8db6d3d945ed58c80e4c6021c3bf1855ee65ef866bdbc3f71f1cd08f0d3528b3d8ff73da4a005237a0121e6990c29d010865b5d038e78e867a", + recoveryId: 1, + }, + { + d: "dac5641c638b8725dade3e980dc107bbc1a2d023d9a3e71f8a6cb91df0343fe0", + m: "993bf2ce70c1f883e8215aa02f7ef9518c3c02045d81cb5e7eceaa69c75d3814", + signature: + "a72f2f631bb04ef9e6bba5e484b5f9338e72176b350a414f1c0bc5c303ab3ada3d899f6efad0486b58671957e62e0dcdc5483c479dc004578739ae7e8e611806", + recoveryId: 1, + }, + { + d: "1e2c1c77db275a14c092d919f16063c5b147936ac3a4af978ca5394ce7675ad5", + m: "0820b180c4e3b35437d04dc52830a5cff1af6b41885909e76b5b449fcb5c8f29", + signature: + "6276e5d3bf267a0cc7b8488f027637fc88bc3df6d9df2b2e9df9f4255a3722377e725a452e2c7583910e4f3ce1be92876c3e0bba286fbb82aa460c91b0a4dcc5", + recoveryId: 0, + }, + { + d: "13577e47028b7ab99b66e58bfb24d4f091ea7b26c17599b683877bf7e6b58265", + m: "e4971eb8cafda0840550c5051952db7910f4dcb7665ccd9e78deca594d2b5b1f", + signature: + "0c36be1e96dfd1406c3b0414559b761454b28f0ab673af76c8f6bdf13cd4bcbe520bc7166d743934102a43b7b20e0c843bc8fbc15ca950e3d5c61c6b27becd75", + recoveryId: 1, + }, + { + d: "4d582e95dff52ab7fe713293c5c1ea98375b1d9a772be5547153ab37981e3b28", + m: "9e11e1a1e1430c91040fe4abe48efaabbb19ea4de1c1e440751dfc03d47aa35a", + signature: + "403efa3593f2f4643a206855f94818eb1f0148d4e6c6c59634981ea801ca95fd52b3351bb8cb8aad387c908f9fc7dbaff7ef810db8d02906cc5a13cd1876e78d", + recoveryId: 1, + }, + { + d: "9f1610692982b81fe637a05d2d382099336f498cade96be8d45e9e498f31039a", + m: "bd5a85bd0f2f4fb3cdae543274923db34ecd50f5ea77100d3bbb1783f20a3346", + signature: + "bd74aa3bdc7c98f65c1bf11f25bd7b46f86ed23ec3737e0d3e5b289a59811f7b27ebd1dfc7152a57c8ce2d334427b1b623f2585c31cd6cbb3e24c1ab0c16b9bc", + recoveryId: 1, + }, + { + d: "fce86df9799b00152246e6b0f1e5d600622639d680a1b74461af201507e2501a", + m: "84f9b722f603312977cbbbac3dd83adde88eef290e0696eebcc8599ac009452d", + signature: + "4ebb9ddcb97b03d302fd3ae4f33ce8d060c45cfc9df32292a398133f2afd764f1ae66b5b3c7579db18890f54474af245f564186cd73a70a8f27ab0c8646836d6", + recoveryId: 0, + }, + { + d: "fd86f3b2be15052f88dc6eba39710d529e877c86f2170e5121738e403c3cb0ee", + m: "caaeddaff897130096f7bb9afd8560e6ec4c7cdc1958b88cf7f1d0cb08cae148", + signature: + "c53ea68c4d1f30640b8f366549280dc08f2535658113c0f5dd6edea90aed6f8605733ccf0a3d3fddf1319039354ef82a1ff55d4e3df6cf4bda3feb9b6189f509", + recoveryId: 0, + }, + { + d: "2048b9248ebcad2e02038801067fdee584feadfcc82f4d942a856980d66ba40f", + m: "ab35c1de80c84e70f124dddae8c9ede5968b16b2075887778bd7e751e2098a56", + signature: + "cc8b76e64a1f5fe129246ed864b1e01ea2806c3e9c46a98dd945fd6fc33945ea26fac493280c12e064a209835dc7c39781432912baabaa66b1b5465253ac5623", + recoveryId: 1, + }, + { + d: "362e42ae694a8c832e473ff6cf01da390db351299ee54d3e4f3e9e44bc4c8800", + m: "41cd0c544b365a36a8d6521af8bac6f1e5e7e204955e24a94290f77a52e5be38", + signature: + "d85e9c4a864bdb6ea611af94d8b58a369510ecc8ce903a336ea860cd0ed07b68263e9f080304b43b3fd93843c61323ad41a7d3776c60dac9ffd7a57dea7096c4", + recoveryId: 1, + }, + { + d: "42d1626faf570b236d4460380ed46c1f275e4ab5f8f4244c560b4ed2df9dc2a6", + m: "4f3116210d8186d8d8926930e847473d768d4b8930e13b0026483514bc66d762", + signature: + "1815c7dbe43814ff6ac10a0c8fbf2e292cb6f8398878bc9e3ca97c97cd46b5a36d710ccc90480871bb2be46eb05d5aca6019a320584a1934e1696a46918bcb84", + recoveryId: 0, + }, + { + d: "d5397104d1d46c8ff1726fe60a3f5c9002704b0207f6b04bf80373859baae472", + m: "83d8b89a42933adce78c039beb4b9c736d4c4aa9476454744b66ac7ed56634e0", + signature: + "24703d7211337f966f614cfdfdeeeb4b1c9f64cdc30d70240e90c26ece17a09e1e59aa1f3091132ceb3a0067cd21c2011110ba6b733cdae644d8c8bbaf73224c", + recoveryId: 1, + }, + { + d: "27fce52bef4fdfcf2aec57acad5e776f451c7ebca0decab411e15f2dab34d8b5", + m: "27b928cf3df7183581b678e5d6ac7ba91df3d0873ecb06a8c2472ffe3faf7156", + signature: + "636c5c2742badebf1d276235d7d5e241f2736303ffcffa255b14a95484e63d5b28b293b678179c5fba85f6042b714b1c6f91c09cf8b2235b01c1cd3f42157faf", + recoveryId: 0, + }, + { + d: "ccd4960cd8deb78db1bb17503f5775816aae970c84df5b9df5a933b89c3da00e", + m: "2c4926e944584c94b9547f1692a8c9f3d142f494dbfd47cedff12bea089fa160", + signature: + "335046efbe64297bdfd4c9cb963d17b0b3c306cb0d29640a32acd27335528ca553bbd4dcd2259b41fd288944cca92efb1ceb3f635e09c70381f9174abad793c6", + recoveryId: 0, + }, + { + d: "e85702c7a1551248bd3b986113cd2db2185867234ae68a95e389c4f7f5e3c5e2", + m: "f8a931c9aed7afc246469df7fdc1f54da31bf0f116ebcd81aed1682a3bf8cd4c", + signature: + "a494d169e0bde517e8f2382ea713dbe9eeed3f6aeba3b8bde3f4f2048af506f639bda6cd7f98526ce967ecb87704692fc174fe5be769dad303e884afac2d1733", + recoveryId: 1, + }, + { + d: "2c69913a99cde458c74aa8915d95d31cad05ae227ccdaa4e4320464355f7ed52", + m: "462cc4f6c8cbc48c05d01b64b12cc1c3fe5176cb5091c9709ad5ba5beb1b3b6a", + signature: + "d1fe19827f4223d12c2d8a7244cb782e16537a3e3d8f909badadf30a1d0a190d24d5af8d60687ac8171bf705dc63b9d7c6aedb73fe16618d9b18fb87b50e0061", + recoveryId: 0, + }, + { + d: "2fe5bea3c1f03cedbed24c4aaa4b1ecdd6f5ad94dfb6202687289922bc0128b7", + m: "903764641a02d050f88b113f9686ea683d930de97b8210cf47443e5de1bf4a92", + signature: + "5f3b5c45da2dad598030acf1826ad4a6f858decd5725f01207a234365af748f65a6311da06ce146b68c8cbe459d9538cc254d7475c6bab434108857ef524f7f2", + recoveryId: 0, + }, + { + d: "9dd705d9374344040ed7ea8641101df7b7a0b4b604ba74779c3494d09ecb2e7d", + m: "c3fa29205c6e905d3a22099c1b26cf1afbf8d5696e6646b1077e3d0f82ba71d1", + signature: + "91262ad381cbfdb0468da40be2ff1bc0774054c41b779f172d3e6d4935cac21077206377036d94a7f6e917bd511f8a4244c55d91128ddb3ade664c1acd9e82fd", + recoveryId: 0, + }, + { + d: "43588e7a985b1edb1af71da82d5a98448b0bdddd2ded89b01808becbfddc654f", + m: "f2476898fac16fa9fe4f9a5306610f02d93c72583e776f9eb528b5628c71dc34", + signature: + "c06b51efb9d3a7caa98994c7b4af9fd9efbe291c9515a0dcfe40fce9aa872e9e2759460bc446de54e0702bfcfc9f38bdf61ff5a4673358b8823af05fd93a9e17", + recoveryId: 0, + }, + { + d: "a5541f44449da5538f416c7098d50b001116d5ef8bf8fb285044aa84db949922", + m: "c61531aec58a4aade42cf32ecb8eb8a44a1993c1a04551a18899eee02f6e8bec", + signature: + "691520a538ee70041aab4cd91f146140c0c399dc6ce6d955f3e3df4181b05a9553629b33c1c2ac5ecdc3c770d013707993dcd6456deb5c0067935e2908659687", + recoveryId: 1, + }, + { + d: "dc0ff2c519266a40e0eefb415b4e2c4107e79fec1b17ba2ee409a963c9d9fc0f", + m: "b21b1fc4c3e9fa9b65dc544981aaca361ca24c856771d579e66f83e0aef7d84a", + signature: + "1263ee246b10d5159eff9d7f8f6bcaa18e08139d27f955a887c555292a5ec650515eecfa9530856e34950f5502072f49f51ae9a5b2f3720ca529df42f8a3bed7", + recoveryId: 1, + }, + { + d: "40ed745ab3c1ebc54ee4b2a14d22f8ca7dc439b6061de7a5126f37d6ce039ddf", + m: "28f8b901bac41b66156a1e9ea3438aa3563ab6512c1da00775acb5f8a6709211", + signature: + "e20cf7b1f53a1de5604d24998ee729067adf4e74319a130c611721d10601457253138d128398124ab953f6631acab82e9fd3ccfbe862e31af7faf19ca1b1b2db", + recoveryId: 1, + }, + { + d: "616ec3d2c9337f5b4e95a86c088ab94e41c42f9873ac823748e601fd7758d067", + m: "4a0e9671bee32065ce1c9ab12548104c89fcca3ed735a2dee161016a038aa51e", + signature: + "9935491b68c5d218b3adeb9bbb71151afd759393de3f832262197e8a95288a2729ec29c2b77ae1747743cb1158056c0943941d6539d7588c39bb8910ba90fa2a", + recoveryId: 0, + }, + { + d: "515acd7bcee67688dbee56f664e562a2a040bb06d6bd72d518ae18a9042f1528", + m: "cde397edc79aa920a915aab395be69b879ee937e3d19332b81a640f8abf0cabd", + signature: + "9e2dc125ca6105cc5f0847d501431f9b3f822dd47198a4e6f927e34b51415f0636c401ee5d54d8481b6b0aaf9a5e213d807462d4acb1dd8bd17529fdc4f8ab8c", + recoveryId: 0, + }, + { + d: "5c7bb6145f4dd78910caee6297ac3c3a537f6b94eb7f19fd0792d8fcae0549d1", + m: "c2c66697282809e3afcb82a20d1f68c5d7e6194ad2712dbdf759121172b82837", + signature: + "162254f8797e46611880145fb0c623116487cf206bacf34cc3f9a40f489a18e810973f9fa1f111ce7bda637c55fedb55d13086e9489a72956af5b473e4666224", + recoveryId: 1, + }, + { + d: "d62c3bc9728d6fd77f6656ac55c11414c7b1d55311ef29f4f42cbcb24a8177b1", + m: "a09d672856370ca728fdf8d0210cbb007c6d4e73c0929426a2bdae595c507728", + signature: + "5cd84ac8c661cd50d17c5bbf6b2f09930ded4ef7f2e6884a357cadd88bf9568d48d5f30c9077840d33276c69cd919903d6d82c6c1032366ceddc60648d11cb8b", + recoveryId: 0, + }, + { + d: "6ce925f2daf9552f1aa3cdd923e432e195e5b6c2b72c6ee10e91a932aa754707", + m: "bf47558703a6b6c56fe2ab85a89c4ae31db0c054b38d057bc9de58ce9ecbb76a", + signature: + "2f23fe618e3b75d643136f455abdf5ed4a28f3c30c703565f865425ef0baa4e773509b4fbbb6134878ec73bf273ef22e8fbfdad0df01c85423c14b89a3dc8c09", + recoveryId: 0, + }, + { + d: "6a18c200ca47bcb97cf83c5c1a9e664b553f971abed250c78ee5f1d8acb114ee", + m: "31f75184adbd816db017676be271e70e9ff42edf6d13c8f463bd61b3f9e3de45", + signature: + "d92ce09347dea4f63f501382f9b2c2a7409242c8e2b3ef20c887ec50d71010cc6d4451516ff50ee8df152a8e05f72cd3749d72fb3a8b6ce09fe66e07d824a1cc", + recoveryId: 1, + }, + { + d: "548441911db850f48dab5e8a323b93a0f18cac4f3824d342d6398e0db85bef37", + m: "dad10644c94f978ebab4e64825cc2b0c54c626e461d0c9c40127ee41bdc25438", + signature: + "05457bea4bb1e752055962dfacf86705996027401002a1bb8660b54d8b8dfc97464f00cbfe7a9035cf0e5f3b69016ce4764f681795f3f51566c9464380c5a7d8", + recoveryId: 1, + }, + { + d: "33080429676ea34466caa239b8ce24bf58a58b7d8d3c2bc2975488967d71a894", + m: "79f13b9c690712217d8a3bcc0aab07998b04078b9520b557e7a235c384d7fd77", + signature: + "5e00c57729565006fe25ddac852a3788ae8485d5e546c326128f62c10e8efe084ad6310c0beb7212aa2d8ad487b04d7fa3b404e4a8bf2cde89be40e0e5961a55", + recoveryId: 0, + }, + { + d: "d3805bfb9e992a6d14f9ab203b6e1e8e7aac464708945b81d2c8368d1acf7775", + m: "ee6fb5ccd217f44ca46e708ed4678653a89dbce04f64347b5917dae937bfdd01", + signature: + "9a72739110ddb44f8f6cc28521e9ede35a4e6f2fdd8d393363f674e255a65b363db83efa0cfee7262c99be4b900b91eb5002cf668ba02e026a548f8f032404d0", + recoveryId: 0, + }, + { + d: "61554e785603d4a75488516e9dd229a9c37b9b13f88554d13df94cc94a8cbce0", + m: "1b32f2c82f53b13220191b0c66b634a2803a920efe8332022e0cd425d3f36b57", + signature: + "e28029df9f5eeef40dc5e02fc0ea8eb1bb3bf642f64d3c9b201235faa02b04d62dfa4ad5c83bd9340011f72b1c12fac6c952fd5f063dd626c4ac25801d5f6e37", + recoveryId: 0, + }, + { + d: "c346199ff4d91f7dd8fcc6f600ef6e70dafc1cb868d2f9cb67e076d572937f39", + m: "1344d43730833478bc896f60e4d4f088a173e71fb98a7bb27b5d5d9347ca5095", + signature: + "78a249a58a19f2c11e04b129c5007e311c976fec3926810513f7e89a6513714432966355bb80df1d47e2459b571d451d00b1a38ba2daa140903e5bb6022e3e4b", + recoveryId: 1, + }, + { + d: "2a96dbb188d7a9d6244225a5e42e6926559fdab49b339fba727f831ed3e5a92f", + m: "6788448ca03cfc78720aa1818e9abba796243d2f9bb9af5877abae4a6c7b4509", + signature: + "15e7e1143b3852768d06e417c6f07bb9479d57a15dfdc990c859bb891d775f8f4bd1c8d11bfc66b978f1ab955cf7a9cfb87faba80aecc9e4d9f6f25ed08bcf02", + recoveryId: 0, + }, + { + d: "0cbe695bb3766fb15a2a7d645039ebfcca91629d1615e17578a42376fcaa8739", + m: "f9bc5e20829c605ae231aea8bf3207b180d42e7b34602ebeb85e1f3faa5a6bd0", + signature: + "7d3fb45ebb6e5e9b75ca19b9ac28dc50aa1cc4667d8d7eff9d2f70cd05fd74f05f8135c816439960dbcc06e6324116cd04aae997b7c3d7edd160fafcaeb34e9c", + recoveryId: 0, + }, + { + d: "7362a9fc2d9eedbe326c9362fd71ceb179059f3eb2610e678e46a8519c1c6cb3", + m: "4cc03798e0cec2bb38e2a722044afe7722b630b843f17895ab257557308ebe2d", + signature: + "b2afb1ddc6c81c096725d08ae4261d2570638f6bcfa970f4da337b200d2b692a2ae1c7c9dc7a654f8683768ed4fb26e990fe843cdf6eb17b8640c870a4c67502", + recoveryId: 0, + }, + { + d: "0c1abc1de390a16739934524e947553100d11d7e8e80a947dc29665e9e391906", + m: "b053d899b906c0a6ca0322afa38a13cece34149332365c01a7c8d54a386eca55", + signature: + "658d7780f3527ab0a6ce100cd2e2e78b83daa28da273fbdfc83918da5290a3b328324bb91d3a979b1d11d452bea9703c93f3c051d93c46cdb8b757c0e8adb181", + recoveryId: 1, + }, + { + d: "575a0da9e6944d80921ebe0599bee84adcd3a30253adce913eaee3b178494dfc", + m: "3de86a81169541c76da490a5a9883c3cfecb1af5ce292cd24337c9f9e7af957f", + signature: + "571e0dc6b3f9d460a1c3d22ab0affad33e50273a55d58508465c6a96f19e3ea46cbf8e2eaa064fa4f474324317f35e998461979ca0b68ca4a4c9c5cbde56a5de", + recoveryId: 0, + }, + { + d: "34001b7b7b8fe5b10bd2ba8b7f99b2d97930037ca10b7bd516814071501f3bb4", + m: "464163f3458ac370ad6490dc8809776e2f690bcc208ec233d646bc24455f40b8", + signature: + "916a6a53e40e6f1193dde407230ff96cb8a49b26826055f085c9ea4f148125075680f6a7e365ec857c56c3b6aa50aebc3e83d01f3482c9609d7e698295b74458", + recoveryId: 0, + }, + { + d: "9fcf0fb1fb0868e5c7d005b35b16b1dbc0ebf4615b92da1daf6871800ad033e8", + m: "a98397eb1abf15e6e9fb6264db3a03286b874edd500e5e8b515c47a2f05f4b43", + signature: + "98d2292af35411a25c16e327c782110c7a059d3549c773477ab7fbfe759447640f6b2926169dc65d156dd1e4c836117937423a812f3c915c696e367145ed64e2", + recoveryId: 1, + }, + { + d: "1391b326ec4fa15881819651a069fd4678b015136f77bf60d79e0bc5c1133b05", + m: "78f54df198478ee71683269066655183a0a9575af741352b880d1033b05feec2", + signature: + "1159e3f0ee38480c5c97b0c0bae474937bd71f30d2491e535021470fe84e77e81a394f6a358533d5e2cbd8a1d30914a8b8135c9f2ba2c2120bcbdb98b17035d8", + recoveryId: 0, + }, + { + d: "a3f6dff2cb9cb9710cf8ef2b96931cf259fe4824a23ece4c10bdb1303574b095", + m: "8f847866007fb83815b1832460e5a441f444269ae08455016b950562bf42a78a", + signature: + "2ec6e30fc1bd26588c0730da6982996e991bf0cd029192e70fc92a9dce353a8434ccc90339f5d93b86f8da6ec9d889db06f1deb30c5365a5889cd6321c286f97", + recoveryId: 1, + }, + { + d: "8db2eb4badc6a1853a6e4199234979117d176b4af0e769b9d63fac8da5404579", + m: "e9e0a94912023fe8f89bd094fa09552e86da50ee4262f3c0b0922f706db675ac", + signature: + "d08910c174756eb33731638bee634dac10cbfe3c9083f5f9a4c662deffed1d5d39983b90ef551340df24822a7bc6f6d8544d38e9a7965172a45113ed1320d101", + recoveryId: 0, + }, + { + d: "8a3c0fdf331c7ef5b0148781732235fd721ba27dfa6e47582b3f6b1f7a411f95", + m: "92846d0224a53f9cbf42e48a4cb4927c30a63691c6dcf7a7bcb93ed8638de1ed", + signature: + "2fd7e9fdf41ac3af12226af471e3927332b2bf9c4b72dd5c675b9361815fafc47ea7711adbd733d826047c1dd77b50ee6ec2695e2c6cda89c07a257efa7b81c7", + recoveryId: 0, + }, + { + d: "2c9915b69d57abd647357b3680d44a1a92c68745f538ce1bb6142998603c723a", + m: "8a106bd60eb5875352cb876dcd1ba0d24767c3cf0771e3a682038a8092567e1d", + signature: + "0b35a8fe6ec513bc86765a57c5e5c085f8b83cd9ebe43fa3abfcf10c50cf52077cc05f853396d3dbfaeeb76359f635975ad4c03f7985ba7a605c646243b126dc", + recoveryId: 1, + }, + { + d: "38dd97e76bddf3c82cda4be6c690b7ae3898b144cf1fea9407651ecc7c01d523", + m: "84346aab4a069c169c214f44f2145f8de39032cbca45fc25f386bdf3394bfade", + signature: + "0181d7dd5a154060abb122a3607f05dc19ad3b49f6f6c4b346c4755025c9279a5473a8ad2619f42c51bc48202bf15314a703f3ad30f7920aa0f0c01696b2b1da", + recoveryId: 0, + }, + { + d: "2904ca5830a426a3c029c4424bb0d69111f623c26cb6d53156ca4bc445ee362b", + m: "c43ee8042a20b8bd4d04c950df4039775236684ea528dc6d754fdd9163eb0f8a", + signature: + "b32cb3d4f7589d25f496bdd61a0553242b68cb8cc678a2fc8d69e3d5b3ee11b5734737cdf44e2ecf4723dd42a18a3958daf1485d4fed39385d6da5116affa271", + recoveryId: 0, + }, + { + d: "48d3e05c507be021f6fd642b1048b418b33b4304d324468bfe85f6c35e4db771", + m: "cde9624eacc78a24dddde22e4b55c030b9c4e88be7d554c13434a9266155e787", + signature: + "cbbc351817b3e68716c4c8c3836052e76117fc799b4e9109dbb5a73608a054ee27eff4cb7573cef0a709ef9a1964898a5749d5b063e7cc0259a8dfa063c74a9f", + recoveryId: 0, + }, + { + d: "9d9356684fcced44913e6e3da5c2c5791983f95742339d2f74da1724f9eb479e", + m: "29a48e5e4bbf9261a2f79826e44efd08bc656fc1dc63690145ee2c32e415d3f0", + signature: + "be9c2c832990b5eadcb53dae58955fa4a1766149d0b817a9a289621d812d459a40339fcc3c16d83921fac2d99225c3e3f5e20972b2b83999fe0954e3c8e4860e", + recoveryId: 0, + }, + { + d: "9ab3d50be80d2daddbcff60c5059179815ed7c132e5c03fdcc72a9e38ab0abd8", + m: "d02138c276d274b24a25c99bd0086c95c5d0e43d4b945ed40a8a2618e2a91ce8", + signature: + "f8baa9a5dc67b3f5a9d51715c96e397661efe821a4517249e1fa972a8a52d2d24cfb9cbe9f75c67c97c1df2e5f0abe225a147af4a5d969145eefc1c32f6acb05", + recoveryId: 1, + }, + { + d: "da83767f488045c4a284c57fceeb1da35a13ae6cd59fa634ed2d94bec73b665e", + m: "2588686de881b07813994d7aeac08c2174237b2de6ea79b698c89f82ec884b31", + signature: + "3bfc05343e1b93dfd03cf64002cec22530667ee7f38ac6668bdd9eb29a8046a77d9750f19a4f54831036c3db73e6435d7327564f4aec4d7066c3797342e14473", + recoveryId: 1, + }, + { + d: "bce7911efcf0899a8a42db87db0f8cec0041085a4d49670d1ae3c7548a24bf9b", + m: "a8981be73f10320a0357303c35e9857755612e950e9d8d25753e315ec918f3df", + signature: + "b0a3e61eed38d87a332a51c8438e240bf2284fc708099a688032892021f1d0e53ce975d335586da8b91255fc7c1fdf3945aa16279cf67b10f546661d53539d8d", + recoveryId: 1, + }, + { + d: "613fbaa73109c301b8197ecb03197fa7b10b2d2a81c81d974bc4aa5fc505ad7a", + m: "2c1160bc2e52cde1fc7ed77f619793557a5ebc661608c94615acbf4c7d6fd9f1", + signature: + "5bf863103cc963eceee678550b244ae3ec7ab2487dbdf2219d2166aef59476fc7fcc358ce7b90b8782cffdb2e45478c2b29de93d3c9f896d1753e2c49995219b", + recoveryId: 1, + }, + { + d: "503c064fd6e8c4f316df7339199f79c285ac72967dced6287a90189c1036612d", + m: "a5851f89fd9e0a8a6fb4cca2e8244238cd8d6e28fa8158851a911166c440aaee", + signature: + "f39bcdb21f1650bf1b12388e671490bc776e87998e6facade031cfca062bfe546690d5497e0fc27c12aaebb5b9219b8a2354aacf8f9e1851d23b752df8228002", + recoveryId: 0, + }, + { + d: "51532c5790bf8a8a41ee76a460f4c4ad0cf6a6f69317583273c8000c2d975bbb", + m: "570ecf4787e8284772a1cb28eafdb965816b520a7e9d9af0e2ed4391f23794f5", + signature: + "6678552b4fad6a2afe81405b6bef24c8505e69ef795c6902ba4237390f3d9cd97bdaf641fcdb24657c909f752f669dbb677a68f6bcaf00a6d5a7ba8b9879ec36", + recoveryId: 0, + }, + { + d: "16e33ac1c0788bf9d5d8ae84995f6d3015af29f9bae3e2934741012d2199c932", + m: "de663706cb212bfaf2b9396dc1208a886f99307e294f86ca09de6c7e20d83355", + signature: + "a7fbc36f534ede7f6f8e3e4ce4a018b35a5689329e495ea341282729e48cd55a79f810301050f2182148ab62ac09a3419c16d95f9c1876062b3c2eb2d1cd04df", + recoveryId: 0, + }, + { + d: "08d3befb4376537d5f8708f41aec22a457ee5b7d764dcc5ce0c02aa4e6ba2805", + m: "a8fa4cc2e975bf439037b38e872140078851ed28e912b37950b50c804184052d", + signature: + "87e7b22b8d6506b167e06c395b3f639274b6db10a38d3305a64a4c2d8ba2ee211e1bcce31bad39fb9de93146aadd66f9874e0e4cd07b05bf65359fba016a6483", + recoveryId: 1, + }, + { + d: "0a9adc7c8ff66926d2451a8005cde680c090f62668a711d6105af03dc2f425b8", + m: "b62bb5d6462017bb929737af4aba142d0df01cf3264c437e5c335b2b38b20ddf", + signature: + "a1bc5a035788d91757e32a373828f0a127dfbbe0c251173970d044b09e86c54c07bb857e247d941369a3923d9b483e132cdba00d8cc3f08f498feb79b33d9963", + recoveryId: 1, + }, + { + d: "70da95178b6c93302628f867aa85ed25c3c4c829afcafd8620b6f6dbd2ed9b99", + m: "f6ea14496f234c617fb6909f35d6b225dfc0249fab92e47eb4233f1564e1195e", + signature: + "63e44c9a48c72d9256538efc39b604eeb9b3943b116204f18652ff2f34763f850adefde40c026c0afb45ccda0abc267e768765b6dad76f5eada582696c6785d7", + recoveryId: 0, + }, + { + d: "c5c8cb2692735d20cf0a468c7c28b5d89954da540cace13cb7c37b329842c33d", + m: "c3e797a2602961e25a749a77970979999aeccf6453f40da73bccdf6ad7a95706", + signature: + "4fe2559c87887c20572a313c3049df63814f3803a2cc956d3ee68ae06ba7c7bb2b6d19c9f325eddeae8f8489acee06bd92edfa61f119a33cc8533e0b1096209a", + recoveryId: 0, + }, + { + d: "6cea49d2946946f493380faf023dd734e8c6d1bf779779a6aca6eeab8f9bd8f0", + m: "4b5c24c9c97903e5c5e88589b0288db24c3619bffc8469d9a01a3f19eef53f24", + signature: + "bf2fd678bb0eedd99e2aa4557dd7eeaa86659b2b9a368cfda5d5472a75c970f0631f3b9e6b21e9f9b3145d2a550158789328b35882e5769ef5d26b15c204f629", + recoveryId: 1, + }, + { + d: "b61a0f612e7525b21e16dcd85ad12e0c713b098771112b52699ad4325a7df9de", + m: "584cf2b6bf99022838dfe7463a36315337c885bb36252711b3f32c8e41748f0f", + signature: + "81e5dc8d9832363797741796f9d76bcb96b26ddd48dac74d0edc577d3d023628093c60b526b1a51b99565956e5d9234f00828e3d9bd076737fde49dc8b05321a", + recoveryId: 1, + }, + { + d: "12eb020dddc7b41d7244b04981183e58e293ba54fe3e7190a850115f2afe6df6", + m: "5e5a2ab39387f8db028e505c74f981ec384941545285b6516163cd2d9ae33358", + signature: + "4eca1c4562a3b6ac7c43914d8ec7017f8e67e78cfc2289543e4b94b2e69cc2e15ce6eb674fff2b20adaaa1a4ab217c913e2c98585757ad653933ac624f29ccb2", + recoveryId: 1, + }, + { + d: "31fdc25a290e40a15b8acb67067711921c4f46f29ddef89b075f89b2c6ec3ac7", + m: "89b709cadf8fc185910f3107f7c47927188f16f4525e8886e40e99a9f8e2211f", + signature: + "090e1b882218ec68b3f0ca9a9369135ccbf48b5915c05ede0169931aba0d9be147c0c73923f806a981db903c9d594048ba645b88a9e89e4f4fc642a555b9d45b", + recoveryId: 0, + }, + { + d: "47df31753e5db1db1a04513c000328d81007cbc9af6d328ae6b6acae02343c69", + m: "235c1d402d5f36619d93b7bf82da697e17a6597af1386dfa2d3e5303603040d4", + signature: + "f98d6053ab566c86d44835234eeb4210ce960c2d1ac0e107faf3c7afba5671767ff983f565623519ee8306455a59633137a471fe3365ff216fb14b1bd3453f2f", + recoveryId: 1, + }, + { + d: "0985adbec207a500836fe4728b835bc3608a589dce599d0d02bf996a3f83e56a", + m: "85cc1dbdf5cb872b3f8a309dda3a4ab664655a47f4e0c411e47f6d5e72002e71", + signature: + "d354a342846fbbd22ff1f9ed297710ecf6028e48e1f4afb4ec432e3d6b19732c06e48310ee997bcc0da988b1949c1b4ba984c7a4942138dee91b4440f457b739", + recoveryId: 0, + }, + { + d: "eae6a8ee86a45d950116fac7f7a63a07d9368fd091bff4d7e194c6f9510005c2", + m: "f620287e4b4ca62f16df9abb1fd436e6b1784691118202f139e92f3a76be32be", + signature: + "0e3b9a55b6e7f0e5424f73d30674c0308b146f0c6d93dca0b6b3c38a56c798445185ec2abcd418177c604f48de400e9ef3236434618985c6fd9529560f020459", + recoveryId: 1, + }, + { + d: "874595ec01e4cc1a9fd191caad335a932a0f605d61121a6b2c72525a23e3e0f0", + m: "51498c10852cb9846e2130abde821fe27b794e9c068360ee7077f42a9840a21a", + signature: + "a51d4f850b3870c9a242acacf0c7095bb157c7b5b55dfaa375da7426e0f2ab2a42a7107841274c258abc64350d82fd57577dd2089e6a3edd8f480ebbaae1460f", + recoveryId: 0, + }, + { + d: "4fd3cf3ac6813e3dc6946995af54ec0d8abc7fa905c54f0a6857b21f81dd97b7", + m: "24f1504831bdc1979ae9b4c0e1cb09405b9764c2f5b12545abc1c54053bffd65", + signature: + "4302a5c5505856bf087973bd7c644fb88a892ccf1e77343dd117a849ef1db29200024cd5588e6c79939ccd5f3f575020f6b25afed883a9f0140cdbc9d9642b44", + recoveryId: 1, + }, + { + d: "a2e3d846d86fc0ca5b8233ae22651fd291645144b925566530c783a902da5a77", + m: "7cb8a3fa51edd6da0737efe5468e95a0516234174638becf7b85b92cf22657e5", + signature: + "568b8e85c32591d5b1b98f2c57e30d67a1d06713b0facca47ec35f1edf7fd74239fd30ec02cac40af4930499b92cc3aae96b352c761ab3fa0a94e9b968d6d2dc", + recoveryId: 0, + }, + { + d: "5069bc43b5ea0fd6b5592ebb2f42ecfb724fd49d3f614c4aa325f699834d9cca", + m: "45463df0feb8c1d430378885f55af319dfeb8a91ea6d6437bfd872915c7ed0c7", + signature: + "ae3fa025f861499329fb8564fb89e9f24360675d1c64ebfc31eb28e70e344d22053d89b9ba58c5b52226db4dbbe55581a45d0799cf5785204b694343132d758d", + recoveryId: 1, + }, + { + d: "2dd44a5fad11c15923b559a9e3703bb563b4537615f066f7e28115ddb4d6c69f", + m: "98cd3987aca3b90b1ebf4aaf7da8bde84f089541d23752d10fdf71b1327400ce", + signature: + "b59dc6c4de42a6b10a254d17d7815aa502a7f71f7df585df2e6a2a9b2852239653c50718bbcef1f3b896c55aaea6a11eb80d109f9b5ab3fa7a8250b6484e43a4", + recoveryId: 1, + }, + ], +}; diff --git a/packages/signers/kadena/tests/generate.test.ts b/packages/signers/kadena/tests/generate.test.ts new file mode 100644 index 000000000..1d279611b --- /dev/null +++ b/packages/signers/kadena/tests/generate.test.ts @@ -0,0 +1,26 @@ +import { expect } from "chai"; +import Signer from "../src"; + +describe("Ethreum address generate", () => { + const MNEMONIC = + "awake book subject inch gentle blur grant damage process float month clown"; + it("should generate bicoin addresses correctly", async () => { + const bitcoinSigner = new Signer(); + let keypair = await bitcoinSigner.generate(MNEMONIC, "m/44'/0'/0'/0/0"); + expect(keypair.address).equals( + "0x03472412900c9f4ce53b0aa251e269979ba4f28912d8029b7556cb8397b14db45a" + ); + keypair = await bitcoinSigner.generate(MNEMONIC, "m/44'/0'/0'/0/1"); + expect(keypair.address).equals( + "0x0344fc4582db2073485156fd17a58f933bebabfc6ba67d0b1ed656acbfdd1e0ee9" + ); + keypair = await bitcoinSigner.generate(MNEMONIC, "m/49'/0'/0'/0/3"); + expect(keypair.address).equals( + "0x02a2f83bc8a62a71679b957806901fbea35edb936165ebfd5184305d2d17a74d25" + ); + keypair = await bitcoinSigner.generate(MNEMONIC, "m/49'/0'/0'/0/12"); + expect(keypair.address).equals( + "0x035f9ee3234dc049f65825073db81af3f9a120d8b2d86602d405ac60c7f406a8e4" + ); + }); +}); diff --git a/packages/signers/kadena/tsconfig.json b/packages/signers/kadena/tsconfig.json new file mode 100644 index 000000000..6da8e1f23 --- /dev/null +++ b/packages/signers/kadena/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "./tsconfig.paths.json", + "compilerOptions": { + "lib": ["ESNext", "dom"], + "moduleResolution": "node", + "noUnusedLocals": true, + "noUnusedParameters": true, + "removeComments": true, + "sourceMap": true, + "target": "es5", + "module": "commonjs", + "outDir": "dist", + "resolveJsonModule": true, + "esModuleInterop": true, + "declaration": true + }, + "include": ["src/**/*.ts", "tests/**/*.ts"], + "exclude": [ + "node_modules/**/*", + "_warmup/**/*", + ".vscode/**/*", + "tests/**/*" + ], + "ts-node": { + "require": ["tsconfig-paths/register"], + "files": true + } +} diff --git a/packages/signers/kadena/tsconfig.paths.json b/packages/signers/kadena/tsconfig.paths.json new file mode 100644 index 000000000..6451834c2 --- /dev/null +++ b/packages/signers/kadena/tsconfig.paths.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@src/*": ["src/*"] + } + } +} diff --git a/yarn.lock b/yarn.lock index 8ed6971d0..ae3a3b205 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2426,6 +2426,7 @@ __metadata: dependencies: "@enkryptcom/signer-bitcoin": "workspace:^" "@enkryptcom/signer-ethereum": "workspace:^" + "@enkryptcom/signer-kadena": "workspace:^" "@enkryptcom/signer-polkadot": "workspace:^" "@enkryptcom/storage": "workspace:^" "@enkryptcom/types": "workspace:^" @@ -2593,6 +2594,37 @@ __metadata: languageName: unknown linkType: soft +"@enkryptcom/signer-kadena@workspace:^, @enkryptcom/signer-kadena@workspace:packages/signers/kadena": + version: 0.0.0-use.local + resolution: "@enkryptcom/signer-kadena@workspace:packages/signers/kadena" + dependencies: + "@enkryptcom/types": "workspace:^" + "@enkryptcom/utils": "workspace:^" + "@types/chai": ^4.3.5 + "@types/hdkey": ^2.0.1 + "@types/mocha": ^10.0.1 + "@types/node": ^20.5.7 + "@typescript-eslint/eslint-plugin": ^5.62.0 + "@typescript-eslint/parser": ^5.62.0 + cardano-crypto-kadena.js: ^6.0.1 + chai: ^4.3.8 + eslint: ^8.48.0 + eslint-config-airbnb-base: ^15.0.0 + eslint-config-prettier: ^8.10.0 + eslint-import-resolver-alias: ^1.1.2 + eslint-plugin-import: ^2.28.1 + eslint-plugin-module-resolver: ^1.5.0 + mocha: ^9.2.2 + prettier: ^2.8.8 + ts-mocha: ^9.0.2 + ts-node: ^10.9.1 + tsconfig-paths: ^3.14.2 + tsup: ^6.7.0 + typescript: ^4.9.5 + typescript-eslint: 0.0.1-alpha.0 + languageName: unknown + linkType: soft + "@enkryptcom/signer-polkadot@workspace:^, @enkryptcom/signer-polkadot@workspace:packages/signers/polkadot": version: 0.0.0-use.local resolution: "@enkryptcom/signer-polkadot@workspace:packages/signers/polkadot" @@ -9486,6 +9518,21 @@ __metadata: languageName: node linkType: hard +"borc@npm:^2.1.1": + version: 2.1.2 + resolution: "borc@npm:2.1.2" + dependencies: + bignumber.js: ^9.0.0 + buffer: ^5.5.0 + commander: ^2.15.0 + ieee754: ^1.1.13 + iso-url: ~0.4.7 + json-text-sequence: ~0.1.0 + readable-stream: ^3.6.0 + checksum: 1914720baf2dd980edc82a957d1901b8cc80746c0482892fe747558c47c452127a1359104f01b3df9510ae8bb7954273c52796329f8f1445ca04415e05c8e9e2 + languageName: node + linkType: hard + "borsh@npm:^0.7.0": version: 0.7.0 resolution: "borsh@npm:0.7.0" @@ -10020,6 +10067,19 @@ __metadata: languageName: node linkType: hard +"cardano-crypto-kadena.js@npm:^6.0.1": + version: 6.0.1 + resolution: "cardano-crypto-kadena.js@npm:6.0.1" + dependencies: + bech32: ^1.1.4 + bip39: ^3.0.2 + borc: ^2.1.1 + buffer: ^6.0.3 + pbkdf2: ^3.0.17 + checksum: 27fa4362942947a5c077f0f6d7859a68a25bf065549904c0eca4b3a0327e38376c56caf97b7a32d2544ce689ad851dfa61f2fda4d25a5f4148d6071d84c92deb + languageName: node + linkType: hard + "case-sensitive-paths-webpack-plugin@npm:^2.3.0": version: 2.4.0 resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" @@ -10550,7 +10610,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.20.0, commander@npm:^2.20.3": +"commander@npm:^2.15.0, commander@npm:^2.20.0, commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e @@ -11550,6 +11610,13 @@ __metadata: languageName: node linkType: hard +"delimit-stream@npm:0.1.0": + version: 0.1.0 + resolution: "delimit-stream@npm:0.1.0" + checksum: 78e71f488950546f763a3f27bd68ec74de00432a27da55cf6804bee5e614efb2248144ac16b8dc8d757561d91442784328eeb410e63d7438af2407226585b4f7 + languageName: node + linkType: hard + "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -15452,6 +15519,13 @@ __metadata: languageName: node linkType: hard +"iso-url@npm:~0.4.7": + version: 0.4.7 + resolution: "iso-url@npm:0.4.7" + checksum: c42ae615b462fec55ea7b480548fc76ef69af26103fcbb12a305dd929a4c18c6b22e29c666b0601280e552f56b0f144eab0b28b9a6fbb12ec58dc7c8ae053124 + languageName: node + linkType: hard + "isobject@npm:^3.0.1": version: 3.0.1 resolution: "isobject@npm:3.0.1" @@ -15850,6 +15924,15 @@ __metadata: languageName: node linkType: hard +"json-text-sequence@npm:~0.1.0": + version: 0.1.1 + resolution: "json-text-sequence@npm:0.1.1" + dependencies: + delimit-stream: 0.1.0 + checksum: 3d413b3d2b1b9a48b12221cae86f4f247ef400ab98fa65981a5e9c0d62a289d318aeeb0b7657b3d5df5a146d7533601f5d75297b0319175797e023088fd1c8e4 + languageName: node + linkType: hard + "json5@npm:^1.0.1, json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" From 84581d5a2fdbafadd9ad8fb44950c9777a802dcd Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Fri, 8 Sep 2023 11:18:27 -0300 Subject: [PATCH 003/375] Adding Kadena SignerType --- packages/types/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 953c5b3dd..aa6303360 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -47,6 +47,7 @@ enum SignerType { sr25519 = "sr25519", // polkadot secp256k1 = "secp256k1", // ethereum secp256k1btc = "secp256k1-btc", // bitcoin + ed25519kda = "ed25519-kda", // kadena } interface KeyRecordAdd { From b7ac1ccb36ec94d3dc150d95c8dabcd86f42b853 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Fri, 8 Sep 2023 11:45:29 -0300 Subject: [PATCH 004/375] Added icon to account and link to block explorer --- .../src/providers/kadena/libs/blockies.ts | 114 ++++++++++++++++++ .../src/providers/kadena/networks/kadena.ts | 7 +- .../providers/kadena/types/kadena-network.ts | 13 +- 3 files changed, 127 insertions(+), 7 deletions(-) create mode 100644 packages/extension/src/providers/kadena/libs/blockies.ts diff --git a/packages/extension/src/providers/kadena/libs/blockies.ts b/packages/extension/src/providers/kadena/libs/blockies.ts new file mode 100644 index 000000000..953475487 --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/blockies.ts @@ -0,0 +1,114 @@ +const randseed = new Array(4); // Xorshift: [x, y, z, w] 32 bit values + +function seedrand(seed: string) { + for (let i = 0; i < randseed.length; i++) { + randseed[i] = 0; + } + for (let j = 0; j < seed.length; j++) { + randseed[j % 4] = + (randseed[j % 4] << 5) - randseed[j % 4] + seed.charCodeAt(j); + } +} + +function rand() { + // based on Java's String.hashCode(), expanded to 4 32bit values + const t = randseed[0] ^ (randseed[0] << 11); + + randseed[0] = randseed[1]; + randseed[1] = randseed[2]; + randseed[2] = randseed[3]; + randseed[3] = randseed[3] ^ (randseed[3] >> 19) ^ t ^ (t >> 8); + + return (randseed[3] >>> 0) / ((1 << 31) >>> 0); +} + +function createColor() { + // saturation is the whole color spectrum + const h = Math.floor(rand() * 360); + // saturation goes from 40 to 100, it avoids greyish colors + const s = rand() * 60 + 40 + "%"; + // lightness can be anything from 0 to 100, but probabilities are a bell curve around 50% + const l = (rand() + rand() + rand() + rand()) * 25 + "%"; + + const color = "hsl(" + h + "," + s + "," + l + ")"; + return color; +} + +function createImageData(size: number): number[] { + const width = size; // Only support square icons for now + const height = size; + + const dataWidth = Math.ceil(width / 2); + const mirrorWidth = width - dataWidth; + + const data = []; + for (let y = 0; y < height; y++) { + let row = []; + for (let x = 0; x < dataWidth; x++) { + // this makes foreground and background color to have a 43% (1/2.3) probability + // spot color has 13% chance + row[x] = Math.floor(rand() * 2.3); + } + const r = row.slice(0, mirrorWidth); + r.reverse(); + row = row.concat(r); + + for (let i = 0; i < row.length; i++) { + data.push(row[i]); + } + } + + return data; +} + +function createCanvas( + imageData: number[], + color: string, + scale: number, + bgcolor: string, + spotcolor: string +): HTMLCanvasElement { + const width = Math.sqrt(imageData.length); + const c = document.createElement("canvas"); + c.width = c.height = width * scale; + const cc = c.getContext("2d"); + if (cc) { + cc.fillStyle = bgcolor; + cc.fillRect(0, 0, c.width, c.height); + cc.fillStyle = color; + + for (let i = 0; i < imageData.length; i++) { + const row = Math.floor(i / width); + const col = i % width; + cc.fillStyle = imageData[i] === 1 ? color : spotcolor; + if (imageData[i]) { + cc.fillRect(col * scale, row * scale, scale, scale); + } + } + } + return c; +} + +type options = { + size?: number; + scale?: number; + color?: string; + bgcolor?: string; + spotcolor?: string; +}; + +const createIcon = (address: string, opts?: options): string => { + opts = opts || {}; + const size = opts.size || 8; + const scale = opts.scale || 4; + const seed = address.toLowerCase(); + seedrand(seed); + const color = opts.color || createColor(); + const bgcolor = opts.bgcolor || createColor(); + const spotcolor = opts.spotcolor || createColor(); + const imageData = createImageData(size); + const canvas = createCanvas(imageData, color, scale, bgcolor, spotcolor); + return canvas.toDataURL(); +}; + +export default createIcon; diff --git a/packages/extension/src/providers/kadena/networks/kadena.ts b/packages/extension/src/providers/kadena/networks/kadena.ts index 1c3ce0aba..b88feb564 100644 --- a/packages/extension/src/providers/kadena/networks/kadena.ts +++ b/packages/extension/src/providers/kadena/networks/kadena.ts @@ -5,15 +5,16 @@ const kadenaOptions: KadenaNetworkOptions = { name: NetworkNames.Kadena, name_long: "Kadena", homePage: "https://kadena.io/", - blockExplorerTX: "https://polkadot.subscan.io/extrinsic/[[txHash]]", - blockExplorerAddr: "https://polkadot.subscan.io/account/[[address]]", + blockExplorerTX: "https://explorer.chainweb.com/mainnet/tx/[[txHash]]", + blockExplorerAddr: + "https://explorer.chainweb.com/mainnet/account/[[address]]?token=coin", isTestNetwork: false, currencyName: "KDA", currencyNameLong: "Kadena", icon: require("./icons/kadena-kda-logo.svg"), decimals: 18, prefix: 0, - node: "wss://rpc.polkadot.io/", + node: "https://us-e1.chainweb.com/", coingeckoID: "kadena", coingeckoPlatform: CoingeckoPlatform.Kadena, }; diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index dea3552b3..2004812db 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -5,6 +5,8 @@ import { AssetsType, ProviderName } from "@/types/provider"; import { CoingeckoPlatform, NetworkNames, SignerType } from "@enkryptcom/types"; import KadenaAPI from "@/providers/kadena/libs/api"; +import createIcon from "../libs/blockies"; + export interface KadenaNetworkOptions { name: NetworkNames; name_long: string; @@ -31,7 +33,7 @@ export class KadenaNetwork extends BaseNetwork { const baseOptions: BaseNetworkOptions = { basePath: "//", - identicon: () => "", + identicon: createIcon, signer: [SignerType.ed25519kda], displayAddress: (address: string) => address, provider: ProviderName.kadena, @@ -43,14 +45,17 @@ export class KadenaNetwork extends BaseNetwork { } public getAllTokens(address: string): Promise { - throw new Error("Method not implemented."); + console.log("KadenaNetwork::getAllTokens", address); + return Promise.resolve([]); } public getAllTokenInfo(address: string): Promise { - throw new Error("Method not implemented."); + console.log("KadenaNetwork::getAllTokenInfo", address); + return Promise.resolve([]); } public getAllActivity(address: string): Promise { - throw new Error("Method not implemented."); + console.log("KadenaNetwork::getAllActivity", address); + return Promise.resolve([]); } } From 9f92e32c9c9e70f7d2439530c8d51ca19ec661d0 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Fri, 8 Sep 2023 11:10:59 -0400 Subject: [PATCH 005/375] WIP - Update kadena network to show testnet block explorer --- packages/extension/src/providers/kadena/networks/kadena.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/providers/kadena/networks/kadena.ts b/packages/extension/src/providers/kadena/networks/kadena.ts index b88feb564..62f74b84c 100644 --- a/packages/extension/src/providers/kadena/networks/kadena.ts +++ b/packages/extension/src/providers/kadena/networks/kadena.ts @@ -5,9 +5,10 @@ const kadenaOptions: KadenaNetworkOptions = { name: NetworkNames.Kadena, name_long: "Kadena", homePage: "https://kadena.io/", - blockExplorerTX: "https://explorer.chainweb.com/mainnet/tx/[[txHash]]", + //https://explorer.chainweb.com/testnet/account/92a1c888ce9cdf77523934a1dfa697e161450500019dc0e44593aa1f7be7b720?token=coin + blockExplorerTX: "https://explorer.chainweb.com/testnet/tx/[[txHash]]", blockExplorerAddr: - "https://explorer.chainweb.com/mainnet/account/[[address]]?token=coin", + "https://explorer.chainweb.com/testnet/account/[[address]]?token=coin", isTestNetwork: false, currencyName: "KDA", currencyNameLong: "Kadena", From f0379354ae1911024fda44d764b38583c67b8a36 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Fri, 8 Sep 2023 11:21:14 -0400 Subject: [PATCH 006/375] Add getBalance for Kadena network --- packages/extension/package.json | 1 + .../src/providers/kadena/libs/api.ts | 42 +- .../src/providers/kadena/networks/kadena.ts | 2 +- packages/extension/tsconfig.json | 3 +- yarn.lock | 682 +++++++++++++++++- 5 files changed, 704 insertions(+), 26 deletions(-) diff --git a/packages/extension/package.json b/packages/extension/package.json index 84c61a140..f2be0af37 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -54,6 +54,7 @@ "memoize-one": "^6.0.0", "moment": "^2.29.4", "nanoevents": "^7.0.1", + "pact-lang-api": "^4.3.6", "pinia": "^2.1.6", "qrcode.vue": "^3.4.1", "switch-ts": "^1.1.1", diff --git a/packages/extension/src/providers/kadena/libs/api.ts b/packages/extension/src/providers/kadena/libs/api.ts index 27f5f5e6c..f1bf6804e 100644 --- a/packages/extension/src/providers/kadena/libs/api.ts +++ b/packages/extension/src/providers/kadena/libs/api.ts @@ -9,10 +9,17 @@ class API implements ProviderAPIInterface { node: string; decimals: number; name: string; + NETWORK_ID = "testnet04"; + CHAIN_ID = "1"; + API_HOST = `https://api.testnet.chainweb.com/chainweb/0.0/${this.NETWORK_ID}/chain/${this.CHAIN_ID}/pact`; + KEY_PAIR = { + publicKey: "", + secretKey: "", + }; constructor(node: string) { this.node = node; - this.decimals = 18; + this.decimals = 7; this.name = "Kadena"; } @@ -20,9 +27,8 @@ class API implements ProviderAPIInterface { return this; } - init(): Promise { - throw new Error("Method not implemented."); - } + // eslint-disable-next-line @typescript-eslint/no-empty-function + async init(): Promise {} getTransactionStatus( hash: string @@ -31,7 +37,33 @@ class API implements ProviderAPIInterface { } async getBalance(address: string): Promise { - return "0"; + const balance = await this.getBalanceAPI(address); + const balanceToString = balance.result.error + ? "0".padEnd(7, "0") + : balance.result.data + .toString() + .replace(".", "") + .padEnd(7 + balance.result.data, "0"); + return balanceToString; + } + + async getBalanceAPI(account: string) { + const Pact = require("pact-lang-api"); + const cmd = { + networkId: this.NETWORK_ID, + pactCode: `(coin.get-balance "${account}")`, + envData: {}, + meta: { + creationTime: Math.round(new Date().getTime() / 1000), + ttl: 600, + gasLimit: 600, + chainId: this.CHAIN_ID, + gasPrice: 0.0000001, + sender: this.KEY_PAIR.publicKey, + }, + }; + + return await Pact.fetch.local(cmd, this.API_HOST); } } diff --git a/packages/extension/src/providers/kadena/networks/kadena.ts b/packages/extension/src/providers/kadena/networks/kadena.ts index 62f74b84c..edd49ec3f 100644 --- a/packages/extension/src/providers/kadena/networks/kadena.ts +++ b/packages/extension/src/providers/kadena/networks/kadena.ts @@ -13,7 +13,7 @@ const kadenaOptions: KadenaNetworkOptions = { currencyName: "KDA", currencyNameLong: "Kadena", icon: require("./icons/kadena-kda-logo.svg"), - decimals: 18, + decimals: 7, prefix: 0, node: "https://us-e1.chainweb.com/", coingeckoID: "kadena", diff --git a/packages/extension/tsconfig.json b/packages/extension/tsconfig.json index e51b6667a..643d5c615 100644 --- a/packages/extension/tsconfig.json +++ b/packages/extension/tsconfig.json @@ -17,7 +17,8 @@ "@/*": ["./src/*"], "@action/*": ["./src/ui/action/*"] }, - "lib": ["esnext", "dom", "dom.iterable", "scripthost"] + "lib": ["esnext", "dom", "dom.iterable", "scripthost"], + "allowJs": true }, "include": ["src/**/*.ts", "src/**/*.vue", "tests/**/*.ts"], "exclude": ["node_modules"] diff --git a/yarn.lock b/yarn.lock index ae3a3b205..b772b01f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2349,6 +2349,7 @@ __metadata: mocha: ^10.2.0 moment: ^2.29.4 nanoevents: ^7.0.1 + pact-lang-api: ^4.3.6 path-browserify: ^1.0.1 pinia: ^2.1.6 prettier: ^2.8.8 @@ -8249,7 +8250,7 @@ __metadata: languageName: node linkType: hard -"JSONStream@npm:^1.3.5": +"JSONStream@npm:^1.0.3, JSONStream@npm:^1.3.5": version: 1.3.5 resolution: "JSONStream@npm:1.3.5" dependencies: @@ -8303,6 +8304,24 @@ __metadata: languageName: node linkType: hard +"acorn-node@npm:^1.2.0, acorn-node@npm:^1.3.0, acorn-node@npm:^1.5.2, acorn-node@npm:^1.8.2": + version: 1.8.2 + resolution: "acorn-node@npm:1.8.2" + dependencies: + acorn: ^7.0.0 + acorn-walk: ^7.0.0 + xtend: ^4.0.2 + checksum: 02e1564a1ccf8bd1fcefcd01235398af4a9effaf032c5397994ddd275590a72894cb3e26e4b82579ccdda1e48ade7486aef61e771ddae3563ca452b927f443d8 + languageName: node + linkType: hard + +"acorn-walk@npm:^7.0.0": + version: 7.2.0 + resolution: "acorn-walk@npm:7.2.0" + checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f + languageName: node + linkType: hard + "acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" @@ -8310,6 +8329,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^7.0.0": + version: 7.4.1 + resolution: "acorn@npm:7.4.1" + bin: + acorn: bin/acorn + checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407 + languageName: node + linkType: hard + "acorn@npm:^8.0.4, acorn@npm:^8.0.5, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.9.0": version: 8.10.0 resolution: "acorn@npm:8.10.0" @@ -8766,6 +8794,16 @@ __metadata: languageName: node linkType: hard +"assert@npm:^1.4.0": + version: 1.5.1 + resolution: "assert@npm:1.5.1" + dependencies: + object.assign: ^4.1.4 + util: ^0.10.4 + checksum: bfc539da97545f9b2989395d6b85be40b70649ce57464f3cc6e61f4975fb097ba0689c386f95bdb4c3ab867931e40a565c9e193ae3c02263a8e92acb17c9dc93 + languageName: node + linkType: hard + "assert@npm:^2.0.0": version: 2.0.0 resolution: "assert@npm:2.0.0" @@ -9039,6 +9077,13 @@ __metadata: languageName: node linkType: hard +"base64-url@npm:^2.3.3": + version: 2.3.3 + resolution: "base64-url@npm:2.3.3" + checksum: 3b231b4b5e82ae8834a1616a53b6eb5666e5604072bc0d631826be28ce0c8181cc1fbbb96591a3060777bff3c6000c70068c4f89ee29145e24011b0531cc5353 + languageName: node + linkType: hard + "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -9390,7 +9435,7 @@ __metadata: languageName: node linkType: hard -"blakejs@npm:^1.1.0, blakejs@npm:^1.1.1, blakejs@npm:^1.2.1": +"blakejs@npm:^1.0.1, blakejs@npm:^1.1.0, blakejs@npm:^1.1.1, blakejs@npm:^1.2.1": version: 1.2.1 resolution: "blakejs@npm:1.2.1" checksum: d699ba116cfa21d0b01d12014a03e484dd76d483133e6dc9eb415aa70a119f08beb3bcefb8c71840106a00b542cba77383f8be60cd1f0d4589cb8afb922eefbe @@ -9579,6 +9624,31 @@ __metadata: languageName: node linkType: hard +"browser-pack@npm:^6.0.1": + version: 6.1.0 + resolution: "browser-pack@npm:6.1.0" + dependencies: + JSONStream: ^1.0.3 + combine-source-map: ~0.8.0 + defined: ^1.0.0 + safe-buffer: ^5.1.1 + through2: ^2.0.0 + umd: ^3.0.0 + bin: + browser-pack: bin/cmd.js + checksum: 9e5993d3eefb7c56a68cfc8810e59a2920481f93bdcb0a53e07b322f273f697cfeb3a2302aa7fc0f725d29be0e8cc629561f463f2c8b06e2958497869d42cc53 + languageName: node + linkType: hard + +"browser-resolve@npm:^2.0.0": + version: 2.0.0 + resolution: "browser-resolve@npm:2.0.0" + dependencies: + resolve: ^1.17.0 + checksum: 69225e73b555bd6d2a08fb93c7342cfcf3b5058b975099c52649cd5c3cec84c2066c5385084d190faedfb849684d9dabe10129f0cd401d1883572f2e6650f440 + languageName: node + linkType: hard + "browser-stdout@npm:1.3.1": version: 1.3.1 resolution: "browser-stdout@npm:1.3.1" @@ -9650,6 +9720,73 @@ __metadata: languageName: node linkType: hard +"browserify-zlib@npm:~0.2.0": + version: 0.2.0 + resolution: "browserify-zlib@npm:0.2.0" + dependencies: + pako: ~1.0.5 + checksum: 5cd9d6a665190fedb4a97dfbad8dabc8698d8a507298a03f42c734e96d58ca35d3c7d4085e283440bbca1cd1938cff85031728079bedb3345310c58ab1ec92d6 + languageName: node + linkType: hard + +"browserify@npm:^16.5.1": + version: 16.5.2 + resolution: "browserify@npm:16.5.2" + dependencies: + JSONStream: ^1.0.3 + assert: ^1.4.0 + browser-pack: ^6.0.1 + browser-resolve: ^2.0.0 + browserify-zlib: ~0.2.0 + buffer: ~5.2.1 + cached-path-relative: ^1.0.0 + concat-stream: ^1.6.0 + console-browserify: ^1.1.0 + constants-browserify: ~1.0.0 + crypto-browserify: ^3.0.0 + defined: ^1.0.0 + deps-sort: ^2.0.0 + domain-browser: ^1.2.0 + duplexer2: ~0.1.2 + events: ^2.0.0 + glob: ^7.1.0 + has: ^1.0.0 + htmlescape: ^1.1.0 + https-browserify: ^1.0.0 + inherits: ~2.0.1 + insert-module-globals: ^7.0.0 + labeled-stream-splicer: ^2.0.0 + mkdirp-classic: ^0.5.2 + module-deps: ^6.2.3 + os-browserify: ~0.3.0 + parents: ^1.0.1 + path-browserify: ~0.0.0 + process: ~0.11.0 + punycode: ^1.3.2 + querystring-es3: ~0.2.0 + read-only-stream: ^2.0.0 + readable-stream: ^2.0.2 + resolve: ^1.1.4 + shasum: ^1.0.0 + shell-quote: ^1.6.1 + stream-browserify: ^2.0.0 + stream-http: ^3.0.0 + string_decoder: ^1.1.1 + subarg: ^1.0.0 + syntax-error: ^1.1.1 + through2: ^2.0.0 + timers-browserify: ^1.0.1 + tty-browserify: 0.0.1 + url: ~0.11.0 + util: ~0.10.1 + vm-browserify: ^1.0.0 + xtend: ^4.0.0 + bin: + browserify: bin/cmd.js + checksum: 75dacf5c82355146b49a2febb3bf9f7898893931973cf901849791827e44782afcb562be7bc3a893d9022ae528fd6fccdf24fc8812cb5aa1b081bb7ce34c46b5 + languageName: node + linkType: hard + "browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.16.3, browserslist@npm:^4.16.6, browserslist@npm:^4.17.5, browserslist@npm:^4.20.2": version: 4.20.2 resolution: "browserslist@npm:4.20.2" @@ -9812,6 +9949,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:~5.2.1": + version: 5.2.1 + resolution: "buffer@npm:5.2.1" + dependencies: + base64-js: ^1.0.2 + ieee754: ^1.1.4 + checksum: aa3f25bb88d313b8317b436677b46e9e32db64ae397dd5a9d1f867da132985b857c71deaa36cc37666fdb955d8d0f66abeae9460aa7d9b2dca36a9da2f50d05e + languageName: node + linkType: hard + "bufferutil@npm:^4.0.1": version: 4.0.6 resolution: "bufferutil@npm:4.0.6" @@ -9965,6 +10112,13 @@ __metadata: languageName: node linkType: hard +"cached-path-relative@npm:^1.0.0, cached-path-relative@npm:^1.0.2": + version: 1.1.0 + resolution: "cached-path-relative@npm:1.1.0" + checksum: 2f1d63c2301feda575039b945811e54b2dc851b49e94aa366d2916fece745fe4f4490a28a68bd0afe79c2fe336bebf62cbdfa2ad75b178d33b074089114d402d + languageName: node + linkType: hard + "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -10137,6 +10291,18 @@ __metadata: languageName: node linkType: hard +"chainweb@npm:^2.0.4": + version: 2.0.4 + resolution: "chainweb@npm:2.0.4" + dependencies: + base64-url: ^2.3.3 + eventsource: ^1.1.0 + node-fetch: ^2.6.1 + p-retry: ^4.5.0 + checksum: bd396ca1abb4610cb385118201a33922d26b66cce3d5346e40fc9df2b41fda9ea14b704e6e60a98db65f5515527420d9bbea466c1acf550df7e3100ce24704bf + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.3.2, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -10594,6 +10760,18 @@ __metadata: languageName: node linkType: hard +"combine-source-map@npm:^0.8.0, combine-source-map@npm:~0.8.0": + version: 0.8.0 + resolution: "combine-source-map@npm:0.8.0" + dependencies: + convert-source-map: ~1.1.0 + inline-source-map: ~0.6.0 + lodash.memoize: ~3.0.3 + source-map: ~0.5.3 + checksum: 26b3064a4e58400e04089acbf5c8741c47db079706bb2fcd79a7768f99d68de9baf1eb48081cdfbc568e308633105af2aeaf52c73e388619ba1f56463fb73a2e + languageName: node + linkType: hard + "combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" @@ -10686,6 +10864,18 @@ __metadata: languageName: node linkType: hard +"concat-stream@npm:^1.6.0, concat-stream@npm:^1.6.1, concat-stream@npm:~1.6.0": + version: 1.6.2 + resolution: "concat-stream@npm:1.6.2" + dependencies: + buffer-from: ^1.0.0 + inherits: ^2.0.3 + readable-stream: ^2.2.2 + typedarray: ^0.0.6 + checksum: 1ef77032cb4459dcd5187bd710d6fc962b067b64ec6a505810de3d2b8cc0605638551b42f8ec91edf6fcd26141b32ef19ad749239b58fae3aba99187adc32285 + languageName: node + linkType: hard + "concurrently@npm:^7.6.0": version: 7.6.0 resolution: "concurrently@npm:7.6.0" @@ -10720,6 +10910,13 @@ __metadata: languageName: node linkType: hard +"console-browserify@npm:^1.1.0": + version: 1.2.0 + resolution: "console-browserify@npm:1.2.0" + checksum: 226591eeff8ed68e451dffb924c1fb750c654d54b9059b3b261d360f369d1f8f70650adecf2c7136656236a4bfeb55c39281b5d8a55d792ebbb99efd3d848d52 + languageName: node + linkType: hard + "console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -10746,6 +10943,13 @@ __metadata: languageName: node linkType: hard +"constants-browserify@npm:~1.0.0": + version: 1.0.0 + resolution: "constants-browserify@npm:1.0.0" + checksum: f7ac8c6d0b6e4e0c77340a1d47a3574e25abd580bfd99ad707b26ff7618596cf1a5e5ce9caf44715e9e01d4a5d12cb3b4edaf1176f34c19adb2874815a56e64f + languageName: node + linkType: hard + "content-disposition@npm:0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -10814,6 +11018,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:~1.1.0": + version: 1.1.3 + resolution: "convert-source-map@npm:1.1.3" + checksum: 0ed6bdecd330fd05941b417b63ebc9001b438f6d6681cd9a068617c3d4b649794dc35c95ba239d0a01f0b9499912b9e0d0d1b7c612e3669c57c65ce4bbc8fdd8 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -11123,7 +11334,7 @@ __metadata: languageName: node linkType: hard -"crypto-browserify@npm:3.12.0, crypto-browserify@npm:^3.12.0": +"crypto-browserify@npm:3.12.0, crypto-browserify@npm:^3.0.0, crypto-browserify@npm:^3.12.0": version: 3.12.0 resolution: "crypto-browserify@npm:3.12.0" dependencies: @@ -11368,6 +11579,13 @@ __metadata: languageName: node linkType: hard +"dash-ast@npm:^1.0.0": + version: 1.0.0 + resolution: "dash-ast@npm:1.0.0" + checksum: db59e5e275d8159fb3b84bcd2936470c3fecb626f6486c179a28afad141cd95a578faaa3695ad6106153ca861da99a3d891fda37757b49afab773b3a46c638e6 + languageName: node + linkType: hard + "dashdash@npm:^1.12.0": version: 1.14.1 resolution: "dashdash@npm:1.14.1" @@ -11589,6 +11807,13 @@ __metadata: languageName: node linkType: hard +"defined@npm:^1.0.0": + version: 1.0.1 + resolution: "defined@npm:1.0.1" + checksum: b1a852300bdb57f297289b55eafdd0c517afaa3ec8190e78fce91b9d8d0c0369d4505ecbdacfd3d98372e664f4a267d9bd793938d4a8c76209c9d9516fbe2101 + languageName: node + linkType: hard + "delay@npm:^5.0.0": version: 5.0.0 resolution: "delay@npm:5.0.0" @@ -11631,6 +11856,20 @@ __metadata: languageName: node linkType: hard +"deps-sort@npm:^2.0.0": + version: 2.0.1 + resolution: "deps-sort@npm:2.0.1" + dependencies: + JSONStream: ^1.0.3 + shasum-object: ^1.0.0 + subarg: ^1.0.0 + through2: ^2.0.0 + bin: + deps-sort: bin/cmd.js + checksum: 1cbaad500aa1592d7497321faf39c7bb7b86ed0930b1efd0c54efdf68433fc53d8bc844bb220723c7861b397ba886495ebdab2cb0fbf13262d1342d98a88622b + languageName: node + linkType: hard + "des.js@npm:^1.0.0": version: 1.0.1 resolution: "des.js@npm:1.0.1" @@ -11676,6 +11915,19 @@ __metadata: languageName: node linkType: hard +"detective@npm:^5.2.0": + version: 5.2.1 + resolution: "detective@npm:5.2.1" + dependencies: + acorn-node: ^1.8.2 + defined: ^1.0.0 + minimist: ^1.2.6 + bin: + detective: bin/detective.js + checksum: dc4601bbc6be850edb3c2dab7a0eaf5a6169a15ad201679c66d40ea1986df816eeaecd590047f15b0780285f3eeea13b82dca0d4c52a47e744a571e326a72dc9 + languageName: node + linkType: hard + "devmoji@npm:^2.3.0": version: 2.3.0 resolution: "devmoji@npm:2.3.0" @@ -11816,6 +12068,13 @@ __metadata: languageName: node linkType: hard +"domain-browser@npm:^1.2.0": + version: 1.2.0 + resolution: "domain-browser@npm:1.2.0" + checksum: 8f1235c7f49326fb762f4675795246a6295e7dd566b4697abec24afdba2460daa7dfbd1a73d31efbf5606b3b7deadb06ce47cf06f0a476e706153d62a4ff2b90 + languageName: node + linkType: hard + "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" @@ -11916,6 +12175,15 @@ __metadata: languageName: node linkType: hard +"duplexer2@npm:^0.1.2, duplexer2@npm:~0.1.0, duplexer2@npm:~0.1.2": + version: 0.1.4 + resolution: "duplexer2@npm:0.1.4" + dependencies: + readable-stream: ^2.0.2 + checksum: 744961f03c7f54313f90555ac20284a3fb7bf22fdff6538f041a86c22499560eb6eac9d30ab5768054137cb40e6b18b40f621094e0261d7d8c35a37b7a5ad241 + languageName: node + linkType: hard + "duplexer3@npm:^0.1.4": version: 0.1.4 resolution: "duplexer3@npm:0.1.4" @@ -13217,6 +13485,13 @@ __metadata: languageName: node linkType: hard +"events@npm:^2.0.0": + version: 2.1.0 + resolution: "events@npm:2.1.0" + checksum: 8756c4f40a57ffdaa60f1e285beb1fcf2873a26ef713879b927ed648b2833cbbbcdbf93460a3af407af55677e89c044ac9c3c5639a7b3ce38f4dfec2fa4d039e + languageName: node + linkType: hard + "events@npm:^3.1.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" @@ -13224,7 +13499,7 @@ __metadata: languageName: node linkType: hard -"eventsource@npm:^1.1.1": +"eventsource@npm:^1.1.0, eventsource@npm:^1.1.1": version: 1.1.2 resolution: "eventsource@npm:1.1.2" checksum: fe8f2ac3c70b1b63ee3cef5c0a28680cb00b5747bfda1d9835695fab3ed602be41c5c799b1fc997b34b02633573fead25b12b036bdf5212f23a6aa9f59212e9b @@ -13931,6 +14206,13 @@ __metadata: languageName: node linkType: hard +"get-assigned-identifiers@npm:^1.2.0": + version: 1.2.0 + resolution: "get-assigned-identifiers@npm:1.2.0" + checksum: 5ea831c744a645ebd56fff818c80ffc583995c2ca3958236c7cfaac670242300e4f08498a9bbafd3ecbe30027d58ed50e7fa6268ecfe4b8e5c888ea7275cb56c + languageName: node + linkType: hard + "get-caller-file@npm:^1.0.1": version: 1.0.3 resolution: "get-caller-file@npm:1.0.3" @@ -14097,6 +14379,20 @@ __metadata: languageName: node linkType: hard +"glob@npm:^7.1.0": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + "glob@npm:^9.2.0": version: 9.3.0 resolution: "glob@npm:9.3.0" @@ -14396,7 +14692,7 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": +"has@npm:^1.0.0, has@npm:^1.0.3": version: 1.0.3 resolution: "has@npm:1.0.3" dependencies: @@ -14601,6 +14897,13 @@ __metadata: languageName: node linkType: hard +"htmlescape@npm:^1.1.0": + version: 1.1.1 + resolution: "htmlescape@npm:1.1.1" + checksum: c59a915ae6ae076b5720243c8c594fd8c76e927d511ed5f205e4d586f47d521478d7148dc7fbe3d4a0cfc30abcc2dd215b30255903c09ed04eb38bca44367c5d + languageName: node + linkType: hard + "htmlparser2@npm:^6.1.0": version: 6.1.0 resolution: "htmlparser2@npm:6.1.0" @@ -14908,7 +15211,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.1, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -14936,6 +15239,35 @@ __metadata: languageName: node linkType: hard +"inline-source-map@npm:~0.6.0": + version: 0.6.2 + resolution: "inline-source-map@npm:0.6.2" + dependencies: + source-map: ~0.5.3 + checksum: 1f7fa2ad1764d03a0a525d5c47993f9e3d0445f29c2e2413d2878deecb6ecb1e6f9137a6207e3db8dc129565bde15de88c1ba2665407e753e7f3ec768ca29262 + languageName: node + linkType: hard + +"insert-module-globals@npm:^7.0.0": + version: 7.2.1 + resolution: "insert-module-globals@npm:7.2.1" + dependencies: + JSONStream: ^1.0.3 + acorn-node: ^1.5.2 + combine-source-map: ^0.8.0 + concat-stream: ^1.6.1 + is-buffer: ^1.1.0 + path-is-absolute: ^1.0.1 + process: ~0.11.0 + through2: ^2.0.0 + undeclared-identifiers: ^1.1.2 + xtend: ^4.0.0 + bin: + insert-module-globals: bin/cmd.js + checksum: c44de7e802186e3207e24beadd71a5bb834700456a9e6f5c8fbb415b6f8356aff44df806e32bf9131143c53348d873fb050ea2b8f3c4cac762922e191b6bef15 + languageName: node + linkType: hard + "int64-buffer@npm:^1.0.1": version: 1.0.1 resolution: "int64-buffer@npm:1.0.1" @@ -15087,6 +15419,13 @@ __metadata: languageName: node linkType: hard +"is-buffer@npm:^1.1.0": + version: 1.1.6 + resolution: "is-buffer@npm:1.1.6" + checksum: 4a186d995d8bbf9153b4bd9ff9fd04ae75068fe695d29025d25e592d9488911eeece84eefbd8fa41b8ddcc0711058a71d4c466dcf6f1f6e1d83830052d8ca707 + languageName: node + linkType: hard + "is-buffer@npm:~2.0.3": version: 2.0.5 resolution: "is-buffer@npm:2.0.5" @@ -15917,6 +16256,15 @@ __metadata: languageName: node linkType: hard +"json-stable-stringify@npm:~0.0.0": + version: 0.0.1 + resolution: "json-stable-stringify@npm:0.0.1" + dependencies: + jsonify: ~0.0.0 + checksum: 3a148d4c32bf65c61ceba1a10ffe3e91b8f106135cc203ab464cfe7792e545426294beb60711406a4ef62c001c20c916efc600e44e3ce66d1927bb7f781f8201 + languageName: node + linkType: hard + "json-stringify-safe@npm:^5.0.1, json-stringify-safe@npm:~5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" @@ -16002,7 +16350,7 @@ __metadata: languageName: node linkType: hard -"jsonify@npm:^0.0.1": +"jsonify@npm:^0.0.1, jsonify@npm:~0.0.0": version: 0.0.1 resolution: "jsonify@npm:0.0.1" checksum: 027287e1c0294fce15f18c0ff990cfc2318e7f01fb76515f784d5cd0784abfec6fc5c2355c3a2f2cb0ad7f4aa2f5b74ebbfe4e80476c35b2d13cabdb572e1134 @@ -16137,6 +16485,16 @@ __metadata: languageName: node linkType: hard +"labeled-stream-splicer@npm:^2.0.0": + version: 2.0.2 + resolution: "labeled-stream-splicer@npm:2.0.2" + dependencies: + inherits: ^2.0.1 + stream-splicer: ^2.0.0 + checksum: 4f7097b7666cd6d110f2a700f2905f703aa2a6d21c76fb390fcf441f436b269f5b1ad813178af4406cf6ddf01f3ac24435b3ff8fe2d9678664c147bf92f056b3 + languageName: node + linkType: hard + "launch-editor-middleware@npm:^2.2.1": version: 2.3.0 resolution: "launch-editor-middleware@npm:2.3.0" @@ -16432,6 +16790,13 @@ __metadata: languageName: node linkType: hard +"lodash.memoize@npm:~3.0.3": + version: 3.0.4 + resolution: "lodash.memoize@npm:3.0.4" + checksum: fc52e0916b896fa79d6b85fbeaa0e44a381b70f1fcab7acab10188aaeeb2107e21b9b992bff560f405696e0a6e3bb5c08af18955d628a1e8ab6b11df14ff6172 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -17077,7 +17442,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -17106,6 +17471,13 @@ __metadata: languageName: node linkType: hard +"minimist@npm:^1.1.0": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.6 resolution: "minimist@npm:1.2.6" @@ -17209,6 +17581,13 @@ __metadata: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + languageName: node + linkType: hard + "mkdirp-promise@npm:^5.0.1": version: 5.0.1 resolution: "mkdirp-promise@npm:5.0.1" @@ -17371,6 +17750,31 @@ __metadata: languageName: node linkType: hard +"module-deps@npm:^6.2.3": + version: 6.2.3 + resolution: "module-deps@npm:6.2.3" + dependencies: + JSONStream: ^1.0.3 + browser-resolve: ^2.0.0 + cached-path-relative: ^1.0.2 + concat-stream: ~1.6.0 + defined: ^1.0.0 + detective: ^5.2.0 + duplexer2: ^0.1.2 + inherits: ^2.0.1 + parents: ^1.0.0 + readable-stream: ^2.0.2 + resolve: ^1.4.0 + stream-combiner2: ^1.1.1 + subarg: ^1.0.0 + through2: ^2.0.0 + xtend: ^4.0.0 + bin: + module-deps: bin/cmd.js + checksum: cccead8f81b77ec621c29c4407978ce50de6f15c7152b54e81b65ff043d4254fd40071e53a3989a36066ff0d3ce9ae9e65f81aed79b3b5397024dbc8be5d68c7 + languageName: node + linkType: hard + "moment@npm:^2.29.4": version: 2.29.4 resolution: "moment@npm:2.29.4" @@ -17671,7 +18075,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:2, node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": +"node-fetch@npm:2, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.6, node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -18187,6 +18591,13 @@ __metadata: languageName: node linkType: hard +"os-browserify@npm:~0.3.0": + version: 0.3.0 + resolution: "os-browserify@npm:0.3.0" + checksum: 16e37ba3c0e6a4c63443c7b55799ce4066d59104143cb637ecb9fce586d5da319cdca786ba1c867abbe3890d2cbf37953f2d51eea85e20dd6c4570d6c54bfebf + languageName: node + linkType: hard + "os-locale@npm:^1.4.0": version: 1.4.0 resolution: "os-locale@npm:1.4.0" @@ -18313,7 +18724,20 @@ __metadata: languageName: node linkType: hard -"pako@npm:^1.0.4": +"pact-lang-api@npm:^4.3.6": + version: 4.3.6 + resolution: "pact-lang-api@npm:4.3.6" + dependencies: + blakejs: ^1.0.1 + browserify: ^16.5.1 + chainweb: ^2.0.4 + node-fetch: ^2.6.6 + tweetnacl: ^0.14.5 + checksum: 935e0201b1b236152ccde6a8c1c93821cbe5f77874375ab3527674f8ea81b975fd0941a3b6d11f244d816b681135d6331552da7a83d11293fb448f29fb36a11c + languageName: node + linkType: hard + +"pako@npm:^1.0.4, pako@npm:~1.0.5": version: 1.0.11 resolution: "pako@npm:1.0.11" checksum: 1be2bfa1f807608c7538afa15d6f25baa523c30ec870a3228a89579e474a4d992f4293859524e46d5d87fd30fa17c5edf34dbef0671251d9749820b488660b16 @@ -18355,6 +18779,15 @@ __metadata: languageName: node linkType: hard +"parents@npm:^1.0.0, parents@npm:^1.0.1": + version: 1.0.1 + resolution: "parents@npm:1.0.1" + dependencies: + path-platform: ~0.11.15 + checksum: 094fc817d5e8d94e9f9d38c2618a2822f2960b7a268183a36326c5d1cf6ff32f97b1158b0f9b32ab126573996dfe6db104feda6d26e8531d762d178ef4488fc8 + languageName: node + linkType: hard + "parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": version: 5.1.6 resolution: "parse-asn1@npm:5.1.6" @@ -18493,6 +18926,13 @@ __metadata: languageName: node linkType: hard +"path-browserify@npm:~0.0.0": + version: 0.0.1 + resolution: "path-browserify@npm:0.0.1" + checksum: ae8dcd45d0d3cfbaf595af4f206bf3ed82d77f72b4877ae7e77328079e1468c84f9386754bb417d994d5a19bf47882fd253565c18441cd5c5c90ae5187599e35 + languageName: node + linkType: hard + "path-case@npm:^2.1.0": version: 2.1.1 resolution: "path-case@npm:2.1.1" @@ -18525,7 +18965,7 @@ __metadata: languageName: node linkType: hard -"path-is-absolute@npm:^1.0.0": +"path-is-absolute@npm:^1.0.0, path-is-absolute@npm:^1.0.1": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 @@ -18553,6 +18993,13 @@ __metadata: languageName: node linkType: hard +"path-platform@npm:~0.11.15": + version: 0.11.15 + resolution: "path-platform@npm:0.11.15" + checksum: 239f2eae720531ff5a48837de68f94ebd7cf6cd2bf295b39beb97c5bafc34a34a683b62f9f5ad5ca5e78d71d7d44c29e7c56373c1c8473ab128a4e648bb898f0 + languageName: node + linkType: hard + "path-scurry@npm:^1.6.1": version: 1.6.1 resolution: "path-scurry@npm:1.6.1" @@ -19239,7 +19686,7 @@ __metadata: languageName: node linkType: hard -"process@npm:^0.11.10": +"process@npm:^0.11.10, process@npm:~0.11.0": version: 0.11.10 resolution: "process@npm:0.11.10" checksum: bfcce49814f7d172a6e6a14d5fa3ac92cc3d0c3b9feb1279774708a719e19acd673995226351a082a9ae99978254e320ccda4240ddc474ba31a76c79491ca7c3 @@ -19479,7 +19926,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.4.1": +"punycode@npm:^1.3.2, punycode@npm:^1.4.1": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 @@ -19572,6 +20019,13 @@ __metadata: languageName: node linkType: hard +"querystring-es3@npm:~0.2.0": + version: 0.2.1 + resolution: "querystring-es3@npm:0.2.1" + checksum: 691e8d6b8b157e7cd49ae8e83fcf86de39ab3ba948c25abaa94fba84c0986c641aa2f597770848c64abce290ed17a39c9df6df737dfa7e87c3b63acc7d225d61 + languageName: node + linkType: hard + "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -19701,6 +20155,15 @@ __metadata: languageName: node linkType: hard +"read-only-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "read-only-stream@npm:2.0.0" + dependencies: + readable-stream: ^2.0.2 + checksum: aa48979d1f0e8a83522e60698cf3375dca7b284dd066758ded7c3539613ac08275f94dfe0503d2bdfe964ef3cb65facb87a4b3a8250e5a7e89d07af4451019d8 + languageName: node + linkType: hard + "read-pkg-up@npm:^1.0.1": version: 1.0.1 resolution: "read-pkg-up@npm:1.0.1" @@ -19771,6 +20234,21 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^2.0.2, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.3 + isarray: ~1.0.0 + process-nextick-args: ~2.0.0 + safe-buffer: ~5.1.1 + string_decoder: ~1.1.1 + util-deprecate: ~1.0.1 + checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -20038,6 +20516,19 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.1.4, resolve@npm:^1.4.0": + version: 1.22.4 + resolution: "resolve@npm:1.22.4" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 23f25174c2736ce24c6d918910e0d1f89b6b38fefa07a995dff864acd7863d59a7f049e691f93b4b2ee29696303390d921552b6d1b841ed4a8101f517e1d0124 + languageName: node + linkType: hard + "resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.17.0, resolve@npm:^1.19.0, resolve@npm:^1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" @@ -20051,6 +20542,19 @@ __metadata: languageName: node linkType: hard +"resolve@patch:resolve@^1.1.4#~builtin, resolve@patch:resolve@^1.4.0#~builtin": + version: 1.22.4 + resolution: "resolve@patch:resolve@npm%3A1.22.4#~builtin::version=1.22.4&hash=c3c19d" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c45f2545fdc4d21883861b032789e20aa67a2f2692f68da320cc84d5724cd02f2923766c5354b3210897e88f1a7b3d6d2c7c22faeead8eed7078e4c783a444bc + languageName: node + linkType: hard + "resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" @@ -20746,7 +21250,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:2, sha.js@npm:^2.3.6, sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": +"sha.js@npm:2, sha.js@npm:^2.3.6, sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8, sha.js@npm:~2.4.4": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -20776,6 +21280,25 @@ __metadata: languageName: node linkType: hard +"shasum-object@npm:^1.0.0": + version: 1.0.0 + resolution: "shasum-object@npm:1.0.0" + dependencies: + fast-safe-stringify: ^2.0.7 + checksum: fc3531b7ae6ca1cc76138bec54896ee61ff4e7cc62e37ebd47963c8c92f867c6232332e21437dbca60c9109e077b38ece631b59b045e10e0502949363e337895 + languageName: node + linkType: hard + +"shasum@npm:^1.0.0": + version: 1.0.2 + resolution: "shasum@npm:1.0.2" + dependencies: + json-stable-stringify: ~0.0.0 + sha.js: ~2.4.4 + checksum: 61d908825cb4c7a40aa098a5b1a6f8baa782dee38f996fbb0b86358b92a424a6467c5f6e1cadf42567f4283ff640dbf2dbc321e5ab293ca3d4d50657c3908bec + languageName: node + linkType: hard + "shebang-command@npm:^1.2.0": version: 1.2.0 resolution: "shebang-command@npm:1.2.0" @@ -21044,7 +21567,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.5.0": +"source-map@npm:^0.5.0, source-map@npm:~0.5.3": version: 0.5.7 resolution: "source-map@npm:0.5.7" checksum: 5dc2043b93d2f194142c7f38f74a24670cd7a0063acdaf4bf01d2964b402257ae843c2a8fa822ad5b71013b5fcafa55af7421383da919752f22ff488bc553f4d @@ -21317,6 +21840,16 @@ __metadata: languageName: node linkType: hard +"stream-browserify@npm:^2.0.0": + version: 2.0.2 + resolution: "stream-browserify@npm:2.0.2" + dependencies: + inherits: ~2.0.1 + readable-stream: ^2.0.2 + checksum: 8de7bcab5582e9a931ae1a4768be7efe8fa4b0b95fd368d16d8cf3e494b897d6b0a7238626de5d71686e53bddf417fd59d106cfa3af0ec055f61a8d1f8fc77b3 + languageName: node + linkType: hard + "stream-browserify@npm:^3.0.0": version: 3.0.0 resolution: "stream-browserify@npm:3.0.0" @@ -21327,6 +21860,16 @@ __metadata: languageName: node linkType: hard +"stream-combiner2@npm:^1.1.1": + version: 1.1.1 + resolution: "stream-combiner2@npm:1.1.1" + dependencies: + duplexer2: ~0.1.0 + readable-stream: ^2.0.2 + checksum: dd32d179fa8926619c65471a7396fc638ec8866616c0b8747c4e05563ccdb0b694dd4e83cd799f1c52789c965a40a88195942b82b8cea2ee7a5536f1954060f9 + languageName: node + linkType: hard + "stream-combiner@npm:~0.0.4": version: 0.0.4 resolution: "stream-combiner@npm:0.0.4" @@ -21336,7 +21879,7 @@ __metadata: languageName: node linkType: hard -"stream-http@npm:^3.2.0": +"stream-http@npm:^3.0.0, stream-http@npm:^3.2.0": version: 3.2.0 resolution: "stream-http@npm:3.2.0" dependencies: @@ -21348,6 +21891,16 @@ __metadata: languageName: node linkType: hard +"stream-splicer@npm:^2.0.0": + version: 2.0.1 + resolution: "stream-splicer@npm:2.0.1" + dependencies: + inherits: ^2.0.1 + readable-stream: ^2.0.2 + checksum: 7bb3563961450e69183baa04272e042bdd7df44f6d75bf1cce0d6a628efd2d4b0a0d2a290bed0674ea7719c87e6cf6bf7406ca1d17413abf1484430d36d65580 + languageName: node + linkType: hard + "strict-uri-encode@npm:^1.0.0": version: 1.1.0 resolution: "strict-uri-encode@npm:1.1.0" @@ -21580,6 +22133,15 @@ __metadata: languageName: node linkType: hard +"subarg@npm:^1.0.0": + version: 1.0.0 + resolution: "subarg@npm:1.0.0" + dependencies: + minimist: ^1.1.0 + checksum: 8359df72e9a2d03c35702ba58e49cac04daae8f27dff26837e12687c7d10cb800a036fd33fdc5eb0e8c24fb25d804f657fe8bde18dd3dd6ec7dab8eff7aac27e + languageName: node + linkType: hard + "sucrase@npm:^3.20.3": version: 3.21.0 resolution: "sucrase@npm:3.21.0" @@ -21742,6 +22304,15 @@ __metadata: languageName: node linkType: hard +"syntax-error@npm:^1.1.1": + version: 1.4.0 + resolution: "syntax-error@npm:1.4.0" + dependencies: + acorn-node: ^1.2.0 + checksum: c1c3f048fed1948865fda5e79e11b02addb32da323c9c9fb214d3a933f9fda668e55c848f7c4082514ea4f1cf3dcfab0c7b9c762bfad1306271753c0fcc4b14f + languageName: node + linkType: hard + "systeminformation@npm:^5.21.1": version: 5.21.1 resolution: "systeminformation@npm:5.21.1" @@ -21899,6 +22470,16 @@ __metadata: languageName: node linkType: hard +"through2@npm:^2.0.0": + version: 2.0.5 + resolution: "through2@npm:2.0.5" + dependencies: + readable-stream: ~2.3.6 + xtend: ~4.0.1 + checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 + languageName: node + linkType: hard + "through2@npm:^4.0.0": version: 4.0.2 resolution: "through2@npm:4.0.2" @@ -21929,6 +22510,15 @@ __metadata: languageName: node linkType: hard +"timers-browserify@npm:^1.0.1": + version: 1.4.2 + resolution: "timers-browserify@npm:1.4.2" + dependencies: + process: ~0.11.0 + checksum: b7437e228684d8e6e193580d363ffdcd752396c0d1013503f50e412aa86e920248a8627450ad40557443e07ef6b9b602ffc940b3ba06db23774a7ab507e1911d + languageName: node + linkType: hard + "tiny-secp256k1@npm:1.1.6, tiny-secp256k1@npm:^1.1.1, tiny-secp256k1@npm:^1.1.3, tiny-secp256k1@npm:^1.1.6": version: 1.1.6 resolution: "tiny-secp256k1@npm:1.1.6" @@ -22326,6 +22916,13 @@ __metadata: languageName: node linkType: hard +"tty-browserify@npm:0.0.1": + version: 0.0.1 + resolution: "tty-browserify@npm:0.0.1" + checksum: 93b745d43fa5a7d2b948fa23be8d313576d1d884b48acd957c07710bac1c0d8ac34c0556ad4c57c73d36e11741763ef66b3fb4fb97b06b7e4d525315a3cd45f5 + languageName: node + linkType: hard + "tunnel-agent@npm:^0.6.0": version: 0.6.0 resolution: "tunnel-agent@npm:0.6.0" @@ -22349,7 +22946,7 @@ __metadata: languageName: node linkType: hard -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": +"tweetnacl@npm:^0.14.3, tweetnacl@npm:^0.14.5, tweetnacl@npm:~0.14.0": version: 0.14.5 resolution: "tweetnacl@npm:0.14.5" checksum: 6061daba1724f59473d99a7bb82e13f211cdf6e31315510ae9656fefd4779851cb927adad90f3b488c8ed77c106adc0421ea8055f6f976ff21b27c5c4e918487 @@ -22508,6 +23105,13 @@ __metadata: languageName: node linkType: hard +"typedarray@npm:^0.0.6": + version: 0.0.6 + resolution: "typedarray@npm:0.0.6" + checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 + languageName: node + linkType: hard + "typeforce@npm:^1.11.3, typeforce@npm:^1.11.5, typeforce@npm:^1.18.0": version: 1.18.0 resolution: "typeforce@npm:1.18.0" @@ -22633,6 +23237,15 @@ __metadata: languageName: node linkType: hard +"umd@npm:^3.0.0": + version: 3.0.3 + resolution: "umd@npm:3.0.3" + bin: + umd: ./bin/cli.js + checksum: 264302acabbc71ef279cfb832d6bb53096a12618e9ef8465b274c5a3fffa5f4da6cf7b8d024fec53a7114742c132bba9f6a6d4d4b5eca2bb55d556d0c57a9f15 + languageName: node + linkType: hard + "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -22645,6 +23258,21 @@ __metadata: languageName: node linkType: hard +"undeclared-identifiers@npm:^1.1.2": + version: 1.1.3 + resolution: "undeclared-identifiers@npm:1.1.3" + dependencies: + acorn-node: ^1.3.0 + dash-ast: ^1.0.0 + get-assigned-identifiers: ^1.2.0 + simple-concat: ^1.0.0 + xtend: ^4.0.1 + bin: + undeclared-identifiers: bin.js + checksum: e1f2a18d7bf735ec2b9ee464a621d8db72768e75e59334d34d1f7085e21558c621cc105dfd4cc7a0a219b91c43b71fbdea0508cdbe3b3396ed96902c6d5d590e + languageName: node + linkType: hard + "undefsafe@npm:^2.0.5": version: 2.0.5 resolution: "undefsafe@npm:2.0.5" @@ -22826,7 +23454,7 @@ __metadata: languageName: node linkType: hard -"url@npm:^0.11.1": +"url@npm:^0.11.1, url@npm:~0.11.0": version: 0.11.1 resolution: "url@npm:0.11.1" dependencies: @@ -22904,6 +23532,15 @@ __metadata: languageName: node linkType: hard +"util@npm:^0.10.4, util@npm:~0.10.1": + version: 0.10.4 + resolution: "util@npm:0.10.4" + dependencies: + inherits: 2.0.3 + checksum: 913f9a90d05a60e91f91af01b8bd37e06bca4cc02d7b49e01089f9d5b78be2fffd61fb1a41b517de7238c5fc7337fa939c62d1fb4eb82e014894c7bee6637aaf + languageName: node + linkType: hard + "util@npm:^0.12.0, util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" @@ -23039,6 +23676,13 @@ __metadata: languageName: node linkType: hard +"vm-browserify@npm:^1.0.0": + version: 1.1.2 + resolution: "vm-browserify@npm:1.1.2" + checksum: 10a1c50aab54ff8b4c9042c15fc64aefccce8d2fb90c0640403242db0ee7fb269f9b102bdb69cfb435d7ef3180d61fd4fb004a043a12709abaf9056cfd7e039d + languageName: node + linkType: hard + "vue-demi@npm:*, vue-demi@npm:>=0.14.5": version: 0.14.5 resolution: "vue-demi@npm:0.14.5" @@ -24617,7 +25261,7 @@ __metadata: languageName: node linkType: hard -"xtend@npm:^4.0.0, xtend@npm:^4.0.2": +"xtend@npm:^4.0.0, xtend@npm:^4.0.1, xtend@npm:^4.0.2, xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a From a1be1848997d9e3879409ddccda44df46447bf6f Mon Sep 17 00:00:00 2001 From: Glaicon Date: Fri, 8 Sep 2023 11:47:30 -0400 Subject: [PATCH 007/375] update kadena network --- .../providers/kadena/types/kadena-network.ts | 65 +++++++++++++++++-- .../src/providers/kadena/types/kda-token.ts | 19 ++++++ packages/extension/src/types/base-token.ts | 3 +- 3 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 packages/extension/src/providers/kadena/types/kda-token.ts diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index 2004812db..a463474e0 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -1,11 +1,21 @@ import { Activity } from "@/types/activity"; import { BaseNetwork, BaseNetworkOptions } from "@/types/base-network"; -import { BaseToken } from "@/types/base-token"; +import { BaseToken, BaseTokenOptions } from "@/types/base-token"; import { AssetsType, ProviderName } from "@/types/provider"; import { CoingeckoPlatform, NetworkNames, SignerType } from "@enkryptcom/types"; import KadenaAPI from "@/providers/kadena/libs/api"; import createIcon from "../libs/blockies"; +import MarketData from "@/libs/market-data"; +import { CoinGeckoTokenMarket } from "@/libs/market-data/types"; +import Sparkline from "@/libs/sparkline"; +import { + formatFloatingPointValue, + formatFiatValue, +} from "@/libs/utils/number-formatter"; +import { fromBase } from "@enkryptcom/utils"; +import BigNumber from "bignumber.js"; +import { KDAToken } from "./kda-token"; export interface KadenaNetworkOptions { name: NetworkNames; @@ -44,14 +54,55 @@ export class KadenaNetwork extends BaseNetwork { super(baseOptions); } - public getAllTokens(address: string): Promise { - console.log("KadenaNetwork::getAllTokens", address); - return Promise.resolve([]); + public async getAllTokens(pubkey: string): Promise { + const assets = await this.getAllTokenInfo(pubkey); + return assets.map((token) => { + const bTokenOptions: BaseTokenOptions = { + decimals: token.decimals, + icon: token.icon, + name: token.name, + symbol: token.symbol, + balance: token.balance, + price: token.value, + coingeckoID: this.coingeckoID, + }; + return new KDAToken(bTokenOptions); + }); } - public getAllTokenInfo(address: string): Promise { - console.log("KadenaNetwork::getAllTokenInfo", address); - return Promise.resolve([]); + public async getAllTokenInfo(pubkey: string): Promise { + const balance = await (await this.api()).getBalance(pubkey); + let marketData: (CoinGeckoTokenMarket | null)[] = []; + if (this.coingeckoID) { + const market = new MarketData(); + marketData = await market.getMarketData([this.coingeckoID]); + } + const userBalance = fromBase(balance, this.decimals); + const usdBalance = new BigNumber(userBalance).times( + marketData.length ? marketData[0]!.current_price : 0 + ); + const nativeAsset: AssetsType = { + balance: balance, + balancef: formatFloatingPointValue(userBalance).value, + balanceUSD: usdBalance.toNumber(), + balanceUSDf: formatFiatValue(usdBalance.toString()).value, + icon: this.icon, + name: this.name_long, + symbol: this.currencyName, + value: marketData.length ? marketData[0]!.current_price.toString() : "0", + valuef: formatFiatValue( + marketData.length ? marketData[0]!.current_price.toString() : "0" + ).value, + contract: "", + decimals: this.decimals, + sparkline: marketData.length + ? new Sparkline(marketData[0]!.sparkline_in_7d.price, 25).dataValues + : "", + priceChangePercentage: marketData.length + ? marketData[0]!.price_change_percentage_7d_in_currency + : 0, + }; + return [nativeAsset]; } public getAllActivity(address: string): Promise { diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts new file mode 100644 index 000000000..3ae6e3022 --- /dev/null +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -0,0 +1,19 @@ +import { BaseToken, BaseTokenOptions } from "@/types/base-token"; +import KadenaAPI from "@/providers/kadena/libs/api"; + +export class KDAToken extends BaseToken { + constructor(options: BaseTokenOptions) { + super(options); + } + + public async getLatestUserBalance( + api: KadenaAPI, + pubkey: string + ): Promise { + return api.getBalance(pubkey); + } + + public async send(): Promise { + throw new Error("EVM-send is not implemented here"); + } +} diff --git a/packages/extension/src/types/base-token.ts b/packages/extension/src/types/base-token.ts index 791c58e56..324b4b4b3 100644 --- a/packages/extension/src/types/base-token.ts +++ b/packages/extension/src/types/base-token.ts @@ -3,6 +3,7 @@ import MarketData from "@/libs/market-data"; import { ApiPromise } from "@polkadot/api"; import BitcoinAPI from "@/providers/bitcoin/libs/api"; import { BN } from "ethereumjs-util"; +import KadenaAPI from "@/providers/kadena/libs/api"; export type TransferType = "keepAlive" | "all" | "allKeepAlive" | "transfer"; @@ -59,7 +60,7 @@ export abstract class BaseToken { } public abstract getLatestUserBalance( - api: EvmAPI | ApiPromise | BitcoinAPI, + api: EvmAPI | ApiPromise | BitcoinAPI | KadenaAPI, address: string ): Promise; From d285a38b0c7e118c670fea38d7fae170d26b0e5a Mon Sep 17 00:00:00 2001 From: Glaicon Date: Fri, 8 Sep 2023 12:32:32 -0400 Subject: [PATCH 008/375] Add getAllActivity to kadena network --- .../kadena/libs/activity-handlers/index.ts | 3 + .../providers/kadena/configs.ts | 7 ++ .../providers/kadena/index.ts | 65 +++++++++++++++++++ .../src/providers/kadena/networks/kadena.ts | 3 + .../providers/kadena/types/kadena-network.ts | 12 +++- 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 packages/extension/src/providers/kadena/libs/activity-handlers/index.ts create mode 100644 packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts create mode 100644 packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/index.ts new file mode 100644 index 000000000..6212f5ac8 --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/index.ts @@ -0,0 +1,3 @@ +import kadenaScanActivity from "./providers/kadena"; + +export { kadenaScanActivity }; diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts new file mode 100644 index 000000000..fa97e484c --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts @@ -0,0 +1,7 @@ +import { NetworkNames } from "@enkryptcom/types"; + +const NetworkEndpoints = { + [NetworkNames.Kadena]: "https://estats.testnet.chainweb.com/", +}; + +export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts new file mode 100644 index 000000000..69b22c401 --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts @@ -0,0 +1,65 @@ +import cacheFetch from "@/libs/cache-fetch"; +import MarketData from "@/libs/market-data"; +import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; +import { BaseNetwork } from "@/types/base-network"; +import { NetworkEndpoints } from "./configs"; +const TTL = 30; +const getAddressActivity = async ( + address: string, + endpoint: string +): Promise => { + return cacheFetch( + { + // https://estats.testnet.chainweb.com/txs/account/c9205406b2c5a7598760aa42d4d4453c5dcd06c2aedb86c000ad68b433fc0bdf?limit=20&token=coin + url: `${endpoint}txs/account/${address}?limit=20&token=coin`, + }, + TTL + ).then((res) => { + // if (res.message !== "Success") return []; + return res ? res : []; + }); +}; +export default async ( + network: BaseNetwork, + address: string +): Promise => { + const enpoint = + NetworkEndpoints[network.name as keyof typeof NetworkEndpoints]; + const activities = await getAddressActivity(address, enpoint); + let price = "0"; + if (network.coingeckoID) { + const marketData = new MarketData(); + await marketData + .getTokenPrice(network.coingeckoID) + .then((mdata) => (price = mdata || "0")); + } + return activities.map((activity: any) => { + const amountInt = parseInt( + activity.amount.substring(0, activity.amount.indexOf(".")) + ); + const balanceToString = activity.amount + .toString() + .replace(".", "") + .padEnd(7 + amountInt, "0"); + return { + from: activity.fromAccount, + to: activity.toAccount, + isIncoming: activity.fromAccount !== address, + network: network.name, + rawInfo: activity, + status: ActivityStatus.success, + timestamp: new Date(activity.blockTime).getTime(), + value: balanceToString, + transactionHash: activity.requestKey, + type: ActivityType.transaction, + token: { + decimals: network.decimals, + icon: network.icon, + name: network.currencyNameLong, + symbol: + activity.token !== "coin" ? activity.token : network.currencyName, + price: price, + }, + }; + }); +}; diff --git a/packages/extension/src/providers/kadena/networks/kadena.ts b/packages/extension/src/providers/kadena/networks/kadena.ts index edd49ec3f..f6aa4577b 100644 --- a/packages/extension/src/providers/kadena/networks/kadena.ts +++ b/packages/extension/src/providers/kadena/networks/kadena.ts @@ -1,5 +1,7 @@ import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; import { KadenaNetwork, KadenaNetworkOptions } from "../types/kadena-network"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import { kadenaScanActivity } from "../libs/activity-handlers"; const kadenaOptions: KadenaNetworkOptions = { name: NetworkNames.Kadena, @@ -18,6 +20,7 @@ const kadenaOptions: KadenaNetworkOptions = { node: "https://us-e1.chainweb.com/", coingeckoID: "kadena", coingeckoPlatform: CoingeckoPlatform.Kadena, + activityHandler: wrapActivityHandler(kadenaScanActivity), }; const kadena = new KadenaNetwork(kadenaOptions); diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index a463474e0..b45f7cb88 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -32,9 +32,17 @@ export interface KadenaNetworkOptions { node: string; coingeckoID?: string; coingeckoPlatform?: CoingeckoPlatform; + activityHandler: ( + network: BaseNetwork, + address: string + ) => Promise; } export class KadenaNetwork extends BaseNetwork { + private activityHandler: ( + network: BaseNetwork, + address: string + ) => Promise; constructor(options: KadenaNetworkOptions) { const api = async () => { const api = new KadenaAPI(options.node); @@ -52,6 +60,7 @@ export class KadenaNetwork extends BaseNetwork { }; super(baseOptions); + this.activityHandler = options.activityHandler; } public async getAllTokens(pubkey: string): Promise { @@ -106,7 +115,6 @@ export class KadenaNetwork extends BaseNetwork { } public getAllActivity(address: string): Promise { - console.log("KadenaNetwork::getAllActivity", address); - return Promise.resolve([]); + return this.activityHandler(this, address); } } From 229ba6ff0b7c4021e3dadcae15dcfe0fa73fae14 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Fri, 8 Sep 2023 17:53:00 -0300 Subject: [PATCH 009/375] Adding Kadena testnet network --- .../providers/kadena/configs.ts | 3 +- .../providers/kadena/index.ts | 15 ++++-- .../src/providers/kadena/libs/api.ts | 47 ++++++++++++------- .../src/providers/kadena/networks/index.ts | 2 + .../kadena/networks/kadena-testnet.ts | 31 ++++++++++++ .../src/providers/kadena/networks/kadena.ts | 11 +++-- .../src/providers/kadena/types/index.ts | 5 ++ .../providers/kadena/types/kadena-network.ts | 4 +- packages/types/src/networks.ts | 1 + 9 files changed, 92 insertions(+), 27 deletions(-) create mode 100644 packages/extension/src/providers/kadena/networks/kadena-testnet.ts diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts index fa97e484c..173f3036d 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts @@ -1,7 +1,8 @@ import { NetworkNames } from "@enkryptcom/types"; const NetworkEndpoints = { - [NetworkNames.Kadena]: "https://estats.testnet.chainweb.com/", + [NetworkNames.Kadena]: "https://estats.chainweb.com/", + [NetworkNames.KadenaTestnet]: "https://estats.testnet.chainweb.com/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts index 69b22c401..97a105643 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts @@ -3,14 +3,15 @@ import MarketData from "@/libs/market-data"; import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; import { BaseNetwork } from "@/types/base-network"; import { NetworkEndpoints } from "./configs"; + const TTL = 30; + const getAddressActivity = async ( address: string, endpoint: string ): Promise => { return cacheFetch( { - // https://estats.testnet.chainweb.com/txs/account/c9205406b2c5a7598760aa42d4d4453c5dcd06c2aedb86c000ad68b433fc0bdf?limit=20&token=coin url: `${endpoint}txs/account/${address}?limit=20&token=coin`, }, TTL @@ -19,6 +20,7 @@ const getAddressActivity = async ( return res ? res : []; }); }; + export default async ( network: BaseNetwork, address: string @@ -26,21 +28,24 @@ export default async ( const enpoint = NetworkEndpoints[network.name as keyof typeof NetworkEndpoints]; const activities = await getAddressActivity(address, enpoint); + let price = "0"; + if (network.coingeckoID) { const marketData = new MarketData(); await marketData .getTokenPrice(network.coingeckoID) .then((mdata) => (price = mdata || "0")); } + return activities.map((activity: any) => { - const amountInt = parseInt( - activity.amount.substring(0, activity.amount.indexOf(".")) - ); + const amount = activity.amount.substring(0, activity.amount.indexOf(".")); + const balanceToString = activity.amount .toString() .replace(".", "") - .padEnd(7 + amountInt, "0"); + .padEnd(7 + amount.toString().length, "0"); + return { from: activity.fromAccount, to: activity.toAccount, diff --git a/packages/extension/src/providers/kadena/libs/api.ts b/packages/extension/src/providers/kadena/libs/api.ts index f1bf6804e..1221e289c 100644 --- a/packages/extension/src/providers/kadena/libs/api.ts +++ b/packages/extension/src/providers/kadena/libs/api.ts @@ -4,23 +4,28 @@ import { BTCRawInfo, } from "@/types/activity"; import { ProviderAPIInterface } from "@/types/provider"; +import { KadenaApiOptions } from "../types"; class API implements ProviderAPIInterface { node: string; decimals: number; name: string; - NETWORK_ID = "testnet04"; - CHAIN_ID = "1"; - API_HOST = `https://api.testnet.chainweb.com/chainweb/0.0/${this.NETWORK_ID}/chain/${this.CHAIN_ID}/pact`; - KEY_PAIR = { + networkId: string; + chainId: string; + apiHost: string; + keyPair = { publicKey: "", secretKey: "", }; - constructor(node: string) { - this.node = node; + constructor(node: string, options: KadenaApiOptions) { this.decimals = 7; this.name = "Kadena"; + + this.node = node; + this.networkId = options.networkId; + this.chainId = options.chainId; + this.apiHost = `${node}/${this.networkId}/chain/${this.chainId}/pact`; } public get api() { @@ -38,32 +43,42 @@ class API implements ProviderAPIInterface { async getBalance(address: string): Promise { const balance = await this.getBalanceAPI(address); - const balanceToString = balance.result.error - ? "0".padEnd(7, "0") - : balance.result.data - .toString() - .replace(".", "") - .padEnd(7 + balance.result.data, "0"); + + if (balance.result.error) { + return "0".padEnd(7, "0"); + } + + const balanceValue = balance.result.data.toString(); + + const balanceInt = balanceValue.substring( + 0, + balance.result.data.toString().indexOf(".") + ); + + const balanceToString = balanceValue + .replace(".", "") + .padEnd(7 + balanceInt.toString().length, "0"); + return balanceToString; } async getBalanceAPI(account: string) { const Pact = require("pact-lang-api"); const cmd = { - networkId: this.NETWORK_ID, + networkId: this.networkId, pactCode: `(coin.get-balance "${account}")`, envData: {}, meta: { creationTime: Math.round(new Date().getTime() / 1000), ttl: 600, gasLimit: 600, - chainId: this.CHAIN_ID, + chainId: this.chainId, gasPrice: 0.0000001, - sender: this.KEY_PAIR.publicKey, + sender: this.keyPair.publicKey, }, }; - return await Pact.fetch.local(cmd, this.API_HOST); + return await Pact.fetch.local(cmd, this.apiHost); } } diff --git a/packages/extension/src/providers/kadena/networks/index.ts b/packages/extension/src/providers/kadena/networks/index.ts index 8f49cb497..42662492e 100644 --- a/packages/extension/src/providers/kadena/networks/index.ts +++ b/packages/extension/src/providers/kadena/networks/index.ts @@ -1,5 +1,7 @@ import kadena from "./kadena"; +import kadenaTestnet from "./kadena-testnet"; export default { kadena, + kadenaTestnet, }; diff --git a/packages/extension/src/providers/kadena/networks/kadena-testnet.ts b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts new file mode 100644 index 000000000..65c688d8d --- /dev/null +++ b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts @@ -0,0 +1,31 @@ +import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; +import { KadenaNetwork, KadenaNetworkOptions } from "../types/kadena-network"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import { kadenaScanActivity } from "../libs/activity-handlers"; + +const kadenaOptions: KadenaNetworkOptions = { + name: NetworkNames.KadenaTestnet, + name_long: "Kadena Testnet", + homePage: "https://kadena.io/", + blockExplorerTX: "https://explorer.chainweb.com/testnet/tx/[[txHash]]", + blockExplorerAddr: + "https://explorer.chainweb.com/testnet/account/[[address]]?token=coin", + isTestNetwork: true, + currencyName: "KDA", + currencyNameLong: "Kadena", + icon: require("./icons/kadena-kda-logo.svg"), + decimals: 7, + prefix: 0, + node: "https://api.testnet.chainweb.com/chainweb/0.0", + kadenaApiOptions: { + networkId: "testnet04", + chainId: "1", + }, + coingeckoID: "kadena", + coingeckoPlatform: CoingeckoPlatform.Kadena, + activityHandler: wrapActivityHandler(kadenaScanActivity), +}; + +const kadenaTestnet = new KadenaNetwork(kadenaOptions); + +export default kadenaTestnet; diff --git a/packages/extension/src/providers/kadena/networks/kadena.ts b/packages/extension/src/providers/kadena/networks/kadena.ts index f6aa4577b..9539699fd 100644 --- a/packages/extension/src/providers/kadena/networks/kadena.ts +++ b/packages/extension/src/providers/kadena/networks/kadena.ts @@ -7,17 +7,20 @@ const kadenaOptions: KadenaNetworkOptions = { name: NetworkNames.Kadena, name_long: "Kadena", homePage: "https://kadena.io/", - //https://explorer.chainweb.com/testnet/account/92a1c888ce9cdf77523934a1dfa697e161450500019dc0e44593aa1f7be7b720?token=coin - blockExplorerTX: "https://explorer.chainweb.com/testnet/tx/[[txHash]]", + blockExplorerTX: "https://explorer.chainweb.com/mainnet/tx/[[txHash]]", blockExplorerAddr: - "https://explorer.chainweb.com/testnet/account/[[address]]?token=coin", + "https://explorer.chainweb.com/mainnet/account/[[address]]?token=coin", isTestNetwork: false, currencyName: "KDA", currencyNameLong: "Kadena", icon: require("./icons/kadena-kda-logo.svg"), decimals: 7, prefix: 0, - node: "https://us-e1.chainweb.com/", + node: "https://api.chainweb.com/chainweb/0.0", + kadenaApiOptions: { + networkId: "mainnet01", + chainId: "1", + }, coingeckoID: "kadena", coingeckoPlatform: CoingeckoPlatform.Kadena, activityHandler: wrapActivityHandler(kadenaScanActivity), diff --git a/packages/extension/src/providers/kadena/types/index.ts b/packages/extension/src/providers/kadena/types/index.ts index 7a7282871..bb2292954 100644 --- a/packages/extension/src/providers/kadena/types/index.ts +++ b/packages/extension/src/providers/kadena/types/index.ts @@ -5,4 +5,9 @@ export const KadenaNetworks = { KDA: NetworkNames.Kadena, }; +export interface KadenaApiOptions { + networkId: string; + chainId: string; +} + export { InjectedProvider }; diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index b45f7cb88..b5a1904ff 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -16,6 +16,7 @@ import { import { fromBase } from "@enkryptcom/utils"; import BigNumber from "bignumber.js"; import { KDAToken } from "./kda-token"; +import { KadenaApiOptions } from "."; export interface KadenaNetworkOptions { name: NetworkNames; @@ -30,6 +31,7 @@ export interface KadenaNetworkOptions { decimals: number; prefix: number; node: string; + kadenaApiOptions: KadenaApiOptions; coingeckoID?: string; coingeckoPlatform?: CoingeckoPlatform; activityHandler: ( @@ -45,7 +47,7 @@ export class KadenaNetwork extends BaseNetwork { ) => Promise; constructor(options: KadenaNetworkOptions) { const api = async () => { - const api = new KadenaAPI(options.node); + const api = new KadenaAPI(options.node, options.kadenaApiOptions); return api; }; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index b390acfbc..bfcd185e3 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -59,6 +59,7 @@ export enum NetworkNames { Base = "BASE", Celo = "CELO", Kadena = "KDA", + KadenaTestnet = "KDATestnet", } export enum CoingeckoPlatform { From d4cff753cfcddc21f6f34ada41ea01961da15488 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Mon, 11 Sep 2023 12:33:25 -0300 Subject: [PATCH 010/375] Code reuse for decimals format; Config for qrcode scheme --- .../providers/kadena/index.ts | 11 ++----- .../src/providers/kadena/libs/api.ts | 29 +++++++------------ .../src/providers/kadena/libs/utils.ts | 7 +++++ .../providers/kadena/types/kadena-network.ts | 10 ++++++- packages/extension/src/types/base-network.ts | 3 ++ packages/extension/src/types/provider.ts | 1 + .../src/ui/action/views/deposit/index.vue | 4 ++- 7 files changed, 36 insertions(+), 29 deletions(-) create mode 100644 packages/extension/src/providers/kadena/libs/utils.ts diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts index 97a105643..2f82991cc 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts @@ -3,6 +3,7 @@ import MarketData from "@/libs/market-data"; import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; import { BaseNetwork } from "@/types/base-network"; import { NetworkEndpoints } from "./configs"; +import { formatDecimals } from "../../../utils"; const TTL = 30; @@ -27,6 +28,7 @@ export default async ( ): Promise => { const enpoint = NetworkEndpoints[network.name as keyof typeof NetworkEndpoints]; + const activities = await getAddressActivity(address, enpoint); let price = "0"; @@ -39,13 +41,6 @@ export default async ( } return activities.map((activity: any) => { - const amount = activity.amount.substring(0, activity.amount.indexOf(".")); - - const balanceToString = activity.amount - .toString() - .replace(".", "") - .padEnd(7 + amount.toString().length, "0"); - return { from: activity.fromAccount, to: activity.toAccount, @@ -54,7 +49,7 @@ export default async ( rawInfo: activity, status: ActivityStatus.success, timestamp: new Date(activity.blockTime).getTime(), - value: balanceToString, + value: formatDecimals(activity.amount, network.decimals), transactionHash: activity.requestKey, type: ActivityType.transaction, token: { diff --git a/packages/extension/src/providers/kadena/libs/api.ts b/packages/extension/src/providers/kadena/libs/api.ts index 1221e289c..3ec7899dd 100644 --- a/packages/extension/src/providers/kadena/libs/api.ts +++ b/packages/extension/src/providers/kadena/libs/api.ts @@ -4,12 +4,12 @@ import { BTCRawInfo, } from "@/types/activity"; import { ProviderAPIInterface } from "@/types/provider"; -import { KadenaApiOptions } from "../types"; +import { KadenaNetworkOptions } from "../types/kadena-network"; +import { formatDecimals } from "./utils"; class API implements ProviderAPIInterface { - node: string; decimals: number; - name: string; + node: string; networkId: string; chainId: string; apiHost: string; @@ -18,13 +18,12 @@ class API implements ProviderAPIInterface { secretKey: "", }; - constructor(node: string, options: KadenaApiOptions) { - this.decimals = 7; - this.name = "Kadena"; + constructor(node: string, options: KadenaNetworkOptions) { + this.decimals = options.decimals; this.node = node; - this.networkId = options.networkId; - this.chainId = options.chainId; + this.networkId = options.kadenaApiOptions.networkId; + this.chainId = options.kadenaApiOptions.chainId; this.apiHost = `${node}/${this.networkId}/chain/${this.chainId}/pact`; } @@ -36,6 +35,7 @@ class API implements ProviderAPIInterface { async init(): Promise {} getTransactionStatus( + // eslint-disable-next-line @typescript-eslint/no-unused-vars hash: string ): Promise { throw new Error("Method not implemented."); @@ -45,21 +45,12 @@ class API implements ProviderAPIInterface { const balance = await this.getBalanceAPI(address); if (balance.result.error) { - return "0".padEnd(7, "0"); + return formatDecimals("0", this.decimals); } const balanceValue = balance.result.data.toString(); - const balanceInt = balanceValue.substring( - 0, - balance.result.data.toString().indexOf(".") - ); - - const balanceToString = balanceValue - .replace(".", "") - .padEnd(7 + balanceInt.toString().length, "0"); - - return balanceToString; + return formatDecimals(balanceValue, this.decimals); } async getBalanceAPI(account: string) { diff --git a/packages/extension/src/providers/kadena/libs/utils.ts b/packages/extension/src/providers/kadena/libs/utils.ts new file mode 100644 index 000000000..2bfe8f52b --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/utils.ts @@ -0,0 +1,7 @@ +const formatDecimals = (value: string, decimals: number): string => { + const intLength = value.substring(0, value.indexOf(".")).length; + + return value.replace(".", "").padEnd(decimals + intLength, "0"); +}; + +export { formatDecimals }; diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index b5a1904ff..3f9bef9cb 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -45,9 +45,10 @@ export class KadenaNetwork extends BaseNetwork { network: BaseNetwork, address: string ) => Promise; + constructor(options: KadenaNetworkOptions) { const api = async () => { - const api = new KadenaAPI(options.node, options.kadenaApiOptions); + const api = new KadenaAPI(options.node, options); return api; }; @@ -57,6 +58,7 @@ export class KadenaNetwork extends BaseNetwork { signer: [SignerType.ed25519kda], displayAddress: (address: string) => address, provider: ProviderName.kadena, + qrcodeScheme: "k", api, ...options, }; @@ -67,6 +69,7 @@ export class KadenaNetwork extends BaseNetwork { public async getAllTokens(pubkey: string): Promise { const assets = await this.getAllTokenInfo(pubkey); + return assets.map((token) => { const bTokenOptions: BaseTokenOptions = { decimals: token.decimals, @@ -77,6 +80,7 @@ export class KadenaNetwork extends BaseNetwork { price: token.value, coingeckoID: this.coingeckoID, }; + return new KDAToken(bTokenOptions); }); } @@ -84,14 +88,17 @@ export class KadenaNetwork extends BaseNetwork { public async getAllTokenInfo(pubkey: string): Promise { const balance = await (await this.api()).getBalance(pubkey); let marketData: (CoinGeckoTokenMarket | null)[] = []; + if (this.coingeckoID) { const market = new MarketData(); marketData = await market.getMarketData([this.coingeckoID]); } + const userBalance = fromBase(balance, this.decimals); const usdBalance = new BigNumber(userBalance).times( marketData.length ? marketData[0]!.current_price : 0 ); + const nativeAsset: AssetsType = { balance: balance, balancef: formatFloatingPointValue(userBalance).value, @@ -113,6 +120,7 @@ export class KadenaNetwork extends BaseNetwork { ? marketData[0]!.price_change_percentage_7d_in_currency : 0, }; + return [nativeAsset]; } diff --git a/packages/extension/src/types/base-network.ts b/packages/extension/src/types/base-network.ts index dfcc2efe3..686dc2d26 100644 --- a/packages/extension/src/types/base-network.ts +++ b/packages/extension/src/types/base-network.ts @@ -23,6 +23,7 @@ export interface BaseNetworkOptions { node: string; displayAddress: (address: string, chainId?: BNLike) => string; provider: ProviderName; + qrcodeScheme?: string; coingeckoID?: string; coingeckoPlatform?: CoingeckoPlatform; identicon: (address: string) => string; @@ -49,6 +50,7 @@ export abstract class BaseNetwork { public node: string; public displayAddress: (address: string, chainId?: BNLike) => string; public provider: ProviderName; + public qrcodeScheme?: string; public coingeckoID: string | undefined; public coingeckoPlatform: CoingeckoPlatform | undefined; public identicon: (address: string) => string; @@ -74,6 +76,7 @@ export abstract class BaseNetwork { this.node = options.node; this.displayAddress = options.displayAddress; this.provider = options.provider; + this.qrcodeScheme = options.qrcodeScheme; this.coingeckoID = options.coingeckoID; this.identicon = options.identicon; this.basePath = options.basePath; diff --git a/packages/extension/src/types/provider.ts b/packages/extension/src/types/provider.ts index 5266e0577..f4d00e838 100644 --- a/packages/extension/src/types/provider.ts +++ b/packages/extension/src/types/provider.ts @@ -159,6 +159,7 @@ export interface NodeType { displayAddress: (address: string) => string; api?: () => Promise; provider: ProviderName; + qrcodeScheme?: string; coingeckoID?: string; NFTHandler?: (network: NodeType, address: string) => Promise; identicon: (address: string, options?: any) => string; diff --git a/packages/extension/src/ui/action/views/deposit/index.vue b/packages/extension/src/ui/action/views/deposit/index.vue index 4585bbf9e..1fc6909e6 100644 --- a/packages/extension/src/ui/action/views/deposit/index.vue +++ b/packages/extension/src/ui/action/views/deposit/index.vue @@ -17,7 +17,9 @@
Date: Mon, 11 Sep 2023 14:33:06 -0300 Subject: [PATCH 011/375] Config for activity TTL --- .../providers/kadena/configs.ts | 7 +++- .../providers/kadena/index.ts | 33 ++++++++++--------- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts index 173f3036d..7d4ee1e11 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/configs.ts @@ -5,4 +5,9 @@ const NetworkEndpoints = { [NetworkNames.KadenaTestnet]: "https://estats.testnet.chainweb.com/", }; -export { NetworkEndpoints }; +const NetworkTtls = { + [NetworkNames.Kadena]: 30000, + [NetworkNames.KadenaTestnet]: 30, +}; + +export { NetworkEndpoints, NetworkTtls }; diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts index 2f82991cc..8303f3af9 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts @@ -2,34 +2,35 @@ import cacheFetch from "@/libs/cache-fetch"; import MarketData from "@/libs/market-data"; import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; import { BaseNetwork } from "@/types/base-network"; -import { NetworkEndpoints } from "./configs"; +import { NetworkEndpoints, NetworkTtls } from "./configs"; import { formatDecimals } from "../../../utils"; -const TTL = 30; - const getAddressActivity = async ( address: string, - endpoint: string + endpoint: string, + ttl: number ): Promise => { - return cacheFetch( - { - url: `${endpoint}txs/account/${address}?limit=20&token=coin`, - }, - TTL - ).then((res) => { - // if (res.message !== "Success") return []; - return res ? res : []; - }); + const url = `${endpoint}txs/account/${address}?limit=20&token=coin`; + + return cacheFetch({ url }, ttl) + .then((res) => { + return res ? res : []; + }) + .catch((error) => { + console.error("Failed to fetch activity:", error); + return []; + }); }; export default async ( network: BaseNetwork, address: string ): Promise => { - const enpoint = - NetworkEndpoints[network.name as keyof typeof NetworkEndpoints]; + const networkName = network.name as keyof typeof NetworkEndpoints; + const enpoint = NetworkEndpoints[networkName]; + const ttl = NetworkTtls[networkName]; - const activities = await getAddressActivity(address, enpoint); + const activities = await getAddressActivity(address, enpoint, ttl); let price = "0"; From 5572ac199c2adf84fd638aa606bcb4ffa6b3f60c Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Tue, 12 Sep 2023 09:13:04 -0300 Subject: [PATCH 012/375] "Add account" feature implementation for Kadena --- .../providers/kadena/types/kadena-network.ts | 2 +- packages/keyring/src/utils.ts | 5 +++ packages/signers/kadena/src/index.ts | 4 +-- .../signers/kadena/tests/generate.test.ts | 32 ++++++++++++------- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index 3f9bef9cb..1da033ca5 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -53,7 +53,7 @@ export class KadenaNetwork extends BaseNetwork { }; const baseOptions: BaseNetworkOptions = { - basePath: "//", + basePath: "k/", identicon: createIcon, signer: [SignerType.ed25519kda], displayAddress: (address: string) => address, diff --git a/packages/keyring/src/utils.ts b/packages/keyring/src/utils.ts index ea18ffa05..acf344860 100644 --- a/packages/keyring/src/utils.ts +++ b/packages/keyring/src/utils.ts @@ -11,5 +11,10 @@ export const pathParser = ( ) { return index === 0 ? "" : `//${--index}`; // polkadotjs extension use "" for 0 index/root } + + if (type === SignerType.ed25519kda) { + return index.toString(); + } + return `${basePath}/${index}`; }; diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index ede1dc69b..495a550fc 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -4,9 +4,9 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto.js"; class Signer implements SignerInterface { - async generate(mnemonic: string): Promise { + async generate(mnemonic: string, derivationPath = ""): Promise { const root = kadenaCrypto.kadenaMnemonicToRootKeypair("", mnemonic.trim()); - const hardIndex = 0x80000000 + 0; + const hardIndex = 0x80000000 + Number(derivationPath); const privPubKey = kadenaCrypto.kadenaGenKeypair("", root, hardIndex); return { diff --git a/packages/signers/kadena/tests/generate.test.ts b/packages/signers/kadena/tests/generate.test.ts index 1d279611b..87943ee12 100644 --- a/packages/signers/kadena/tests/generate.test.ts +++ b/packages/signers/kadena/tests/generate.test.ts @@ -1,26 +1,34 @@ import { expect } from "chai"; import Signer from "../src"; -describe("Ethreum address generate", () => { +describe("Kadena address generate", () => { + // You can check this derived address on: + // https://kadenakeys.io + const MNEMONIC = - "awake book subject inch gentle blur grant damage process float month clown"; - it("should generate bicoin addresses correctly", async () => { - const bitcoinSigner = new Signer(); - let keypair = await bitcoinSigner.generate(MNEMONIC, "m/44'/0'/0'/0/0"); + "clip coffee brain token leader kiss around main finger network avoid west"; + + it("should generate Kadena addresses correctly", async () => { + const kadenaSigner = new Signer(); + + let keypair = await kadenaSigner.generate(MNEMONIC, "0"); expect(keypair.address).equals( - "0x03472412900c9f4ce53b0aa251e269979ba4f28912d8029b7556cb8397b14db45a" + "57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f" ); - keypair = await bitcoinSigner.generate(MNEMONIC, "m/44'/0'/0'/0/1"); + + keypair = await kadenaSigner.generate(MNEMONIC, "1"); expect(keypair.address).equals( - "0x0344fc4582db2073485156fd17a58f933bebabfc6ba67d0b1ed656acbfdd1e0ee9" + "3c77941d21857bd26683154a5efc5c15169f27698fc56906bcf49b4c05e1006b" ); - keypair = await bitcoinSigner.generate(MNEMONIC, "m/49'/0'/0'/0/3"); + + keypair = await kadenaSigner.generate(MNEMONIC, "2"); expect(keypair.address).equals( - "0x02a2f83bc8a62a71679b957806901fbea35edb936165ebfd5184305d2d17a74d25" + "f8dc5d97bc43155b033f813833bcda9ef374b060689648b4c0226f5a1456935a" ); - keypair = await bitcoinSigner.generate(MNEMONIC, "m/49'/0'/0'/0/12"); + + keypair = await kadenaSigner.generate(MNEMONIC, "3"); expect(keypair.address).equals( - "0x035f9ee3234dc049f65825073db81af3f9a120d8b2d86602d405ac60c7f406a8e4" + "df3125da8789dc114be0c953040333e9a1a9afb31e1170ade42be52a6701842e" ); }); }); From 0bc6f2434a4f9c87e97a4870dd1b247bbc041f61 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Tue, 12 Sep 2023 08:56:40 -0400 Subject: [PATCH 013/375] WIP - Add send page --- .../extension/src/providers/kadena/index.ts | 5 +- .../src/providers/kadena/types/kda-token.ts | 26 +- .../ui/custom-views/blind-approvetx.vue | 24 + .../providers/kadena/ui/custom-views/index.ts | 22 + .../kadena/ui/custom-views/mappings/acala.ts | 78 +++ .../kadena/ui/custom-views/mappings/index.ts | 11 + .../ui/custom-views/mappings/polkadot.ts | 10 + .../ui/custom-views/mappings/substrate.ts | 19 + .../ui/custom-views/transfer-approvetx.vue | 77 +++ .../providers/kadena/ui/custom-views/types.ts | 13 + .../src/providers/kadena/ui/index.ts | 7 + .../src/providers/kadena/ui/kda-accounts.vue | 108 ++++ .../providers/kadena/ui/kda-sign-message.vue | 106 ++++ .../kadena/ui/kda-update-metadata.vue | 206 +++++++ .../kadena/ui/kda-verify-transaction.vue | 381 ++++++++++++ .../src/providers/kadena/ui/libs/signer.ts | 88 +++ .../src/providers/kadena/ui/routes/index.ts | 20 + .../src/providers/kadena/ui/routes/names.ts | 10 +- .../components/send-address-input.vue | 175 ++++++ .../components/send-contacts-list.vue | 285 +++++++++ .../components/send-fee-display.vue | 124 ++++ .../components/send-fee-select.vue | 129 ++++ .../components/send-from-contacts-list.vue | 148 +++++ .../components/send-input-amount.vue | 169 ++++++ .../components/send-token-item.vue | 143 +++++ .../components/send-token-list.vue | 136 +++++ .../components/send-token-select.vue | 114 ++++ .../kadena/ui/send-transaction/index.vue | 562 ++++++++++++++++++ .../verify-transaction/index.vue | 357 +++++++++++ .../kadena/ui/styles/verify-transaction.less | 468 +++++++++++++++ .../src/providers/kadena/ui/types/index.ts | 59 ++ .../action/views/send-transaction/index.vue | 2 + .../action/views/verify-transaction/index.vue | 2 + packages/signers/kadena/src/index.ts | 9 +- 34 files changed, 4080 insertions(+), 13 deletions(-) create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/blind-approvetx.vue create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/index.ts create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/mappings/acala.ts create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/mappings/index.ts create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/mappings/polkadot.ts create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/mappings/substrate.ts create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/transfer-approvetx.vue create mode 100644 packages/extension/src/providers/kadena/ui/custom-views/types.ts create mode 100644 packages/extension/src/providers/kadena/ui/index.ts create mode 100644 packages/extension/src/providers/kadena/ui/kda-accounts.vue create mode 100644 packages/extension/src/providers/kadena/ui/kda-sign-message.vue create mode 100644 packages/extension/src/providers/kadena/ui/kda-update-metadata.vue create mode 100644 packages/extension/src/providers/kadena/ui/kda-verify-transaction.vue create mode 100644 packages/extension/src/providers/kadena/ui/libs/signer.ts create mode 100644 packages/extension/src/providers/kadena/ui/routes/index.ts create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-address-input.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-contacts-list.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-display.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-select.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-from-contacts-list.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-list.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-select.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/index.vue create mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue create mode 100644 packages/extension/src/providers/kadena/ui/styles/verify-transaction.less create mode 100644 packages/extension/src/providers/kadena/ui/types/index.ts diff --git a/packages/extension/src/providers/kadena/index.ts b/packages/extension/src/providers/kadena/index.ts index c4ae66163..6c2bc7e53 100644 --- a/packages/extension/src/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/index.ts @@ -47,12 +47,12 @@ class KadenaProvider request(request: ProviderRPCRequest): Promise { return this.requestProvider .request(request) - .then((res) => { + .then((res: any) => { return { result: JSON.stringify(res), }; }) - .catch((e) => { + .catch((e: { message: any }) => { return { error: JSON.stringify(e.message), }; @@ -68,6 +68,7 @@ class KadenaProvider } getUIPath(page: string): string { + debugger; return GetUIPath(page, this.namespace); } } diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index 3ae6e3022..c9a35f9d9 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -1,4 +1,9 @@ -import { BaseToken, BaseTokenOptions } from "@/types/base-token"; +import { + BaseToken, + BaseTokenOptions, + SendOptions, + TransferType, +} from "@/types/base-token"; import KadenaAPI from "@/providers/kadena/libs/api"; export class KDAToken extends BaseToken { @@ -13,7 +18,24 @@ export class KDAToken extends BaseToken { return api.getBalance(pubkey); } - public async send(): Promise { + public async send( + api: any, + to: string, + amount: string, + options: SendOptions + ): Promise { throw new Error("EVM-send is not implemented here"); + // const transferType: TransferType = options ? options.type : "keepAlive"; + + // switch (transferType) { + // case "transfer": + // return (api as ApiPromise).tx.balances.transfer(to, amount); + // case "keepAlive": + // return (api as ApiPromise).tx.balances.transferKeepAlive(to, amount); + // case "all": + // return (api as ApiPromise).tx.balances.transferAll(to, false); + // case "allKeepAlive": + // return (api as ApiPromise).tx.balances.transferAll(to, true); + // } } } diff --git a/packages/extension/src/providers/kadena/ui/custom-views/blind-approvetx.vue b/packages/extension/src/providers/kadena/ui/custom-views/blind-approvetx.vue new file mode 100644 index 000000000..1487386e0 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/blind-approvetx.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/custom-views/index.ts b/packages/extension/src/providers/kadena/ui/custom-views/index.ts new file mode 100644 index 000000000..ced925d75 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/index.ts @@ -0,0 +1,22 @@ +import { Component } from "vue"; +// import { SubstrateNetwork } from "@providers/../../types/substrate-network"; +import { SubstrateNetwork } from "@/providers/polkadot/types/substrate-network"; +import BlindVerifyView from "./blind-approvetx.vue"; +import mapping from "./mappings"; + +export const getViewAndProps = ( + network: SubstrateNetwork, + method: string, + data: any +) => { + if (mapping[network.name_long] && mapping[network.name_long][method]) { + const [view, getProps] = mapping[network.name_long][method]; + const props = getProps(network, data); + + if (props) { + return [view, props]; + } + } + + return [BlindVerifyView, {}] as [Component, any]; +}; diff --git a/packages/extension/src/providers/kadena/ui/custom-views/mappings/acala.ts b/packages/extension/src/providers/kadena/ui/custom-views/mappings/acala.ts new file mode 100644 index 000000000..63896668d --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/mappings/acala.ts @@ -0,0 +1,78 @@ +import { nativeTransfer } from "./substrate"; +import TransferView from "../transfer-approvetx.vue"; +import { SubstrateNetwork } from "@/providers/polkadot/types/substrate-network"; +import { AcalaOrmlAsset } from "@/providers/polkadot/networks/acala/types/acala-orml-asset"; +import { MethodMap, TransferProps } from "../types"; +import { SubstrateNativeToken } from "@/providers/polkadot/types/substrate-native-token"; +import { polkadotEncodeAddress } from "@enkryptcom/utils"; + +const transferCurrency = ( + network: SubstrateNetwork, + args: any +): TransferProps | null => { + const to = args.dest + ? polkadotEncodeAddress(args.dest.Id, network.prefix) ?? null + : null; + const assetType = ( + args.currency_id ? Object.keys(args.currency_id) : [null] + )[0]; + const rawAmount: string | null = args.amount ?? null; + + if (to !== null && assetType !== null && rawAmount !== null) { + const baseToken = network.assets.find((token) => { + const ormlToken = token as AcalaOrmlAsset; + if (!ormlToken.assetType) return false; + + if ( + ormlToken.assetType.toLowerCase() === assetType.toLowerCase() && + ormlToken.lookupValue.toString().toLowerCase() === + args.currency_id[assetType].toString().toLowerCase() + ) + if ((token as AcalaOrmlAsset).assetType) { + return ( + (token as AcalaOrmlAsset).assetType.toLowerCase() === + assetType.toLowerCase() + ); + } else { + return false; + } + }); + + if (baseToken) { + const amount = rawAmount.replaceAll(",", ""); + return { to, token: baseToken, amount }; + } + } + + return null; +}; + +const transferNativeCurrency = ( + network: SubstrateNetwork, + args: any +): TransferProps | null => { + const to = args.dest + ? polkadotEncodeAddress(args.dest.Id, network.prefix) ?? null + : null; + const token = new SubstrateNativeToken({ + decimals: network.decimals, + icon: network.icon, + name: network.currencyNameLong, + symbol: network.name, + }); + const rawAmount: string | null = args.amount ?? null; + + if (to !== null && rawAmount !== null) { + const amount = rawAmount.replaceAll(",", ""); + return { to, token, amount }; + } + return null; +}; + +const methodsToArgs: MethodMap = { + "balances.transferKeepAlive": [TransferView, nativeTransfer], + "currencies.transfer": [TransferView, transferCurrency], + "currencies.transferNativeCurrency": [TransferView, transferNativeCurrency], +}; + +export default methodsToArgs; diff --git a/packages/extension/src/providers/kadena/ui/custom-views/mappings/index.ts b/packages/extension/src/providers/kadena/ui/custom-views/mappings/index.ts new file mode 100644 index 000000000..434c8b61e --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/mappings/index.ts @@ -0,0 +1,11 @@ +import polkadotMap from "./polkadot"; +import acalaMap from "./acala"; +import type { MethodMap } from "../types"; + +const mapping: Record = { + Polkadot: polkadotMap, + Acala: acalaMap, + Karura: acalaMap, +}; + +export default mapping; diff --git a/packages/extension/src/providers/kadena/ui/custom-views/mappings/polkadot.ts b/packages/extension/src/providers/kadena/ui/custom-views/mappings/polkadot.ts new file mode 100644 index 000000000..78de3c51b --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/mappings/polkadot.ts @@ -0,0 +1,10 @@ +import { nativeTransfer } from "./substrate"; +import TransferView from "../transfer-approvetx.vue"; +import { MethodMap } from "../types"; + +const methodsToArgs: MethodMap = { + "balances.transferKeepAlive": [TransferView, nativeTransfer], + "balances.transfer": [TransferView, nativeTransfer], +}; + +export default methodsToArgs; diff --git a/packages/extension/src/providers/kadena/ui/custom-views/mappings/substrate.ts b/packages/extension/src/providers/kadena/ui/custom-views/mappings/substrate.ts new file mode 100644 index 000000000..f6cf902d9 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/mappings/substrate.ts @@ -0,0 +1,19 @@ +// import { SubstrateNativeToken } from "../../../types/substrate-native-token"; +// import { SubstrateNetwork } from "../../../types/substrate-network"; +// "@/providers/polkadot/types/substrate-network"; +import { SubstrateNetwork } from "@/providers/polkadot/types/substrate-network"; +import { SubstrateNativeToken } from "@/providers/polkadot/types/substrate-native-token"; +import { polkadotEncodeAddress } from "@enkryptcom/utils"; + +export const nativeTransfer = (network: SubstrateNetwork, data: any) => { + const to = polkadotEncodeAddress(data.dest["Id"], network.prefix); + const token = new SubstrateNativeToken({ + name: network.currencyNameLong, + symbol: network.name, + coingeckoID: network.coingeckoID, + decimals: network.decimals, + icon: network.icon, + }); + const amount = data.value.replaceAll(",", ""); + return { to, token, amount }; +}; diff --git a/packages/extension/src/providers/kadena/ui/custom-views/transfer-approvetx.vue b/packages/extension/src/providers/kadena/ui/custom-views/transfer-approvetx.vue new file mode 100644 index 000000000..deb9a1e14 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/transfer-approvetx.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/custom-views/types.ts b/packages/extension/src/providers/kadena/ui/custom-views/types.ts new file mode 100644 index 000000000..aaa03e786 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/custom-views/types.ts @@ -0,0 +1,13 @@ +import { BaseToken } from "@/types/base-token"; +import { SubstrateNetwork } from "@/providers/polkadot/types/substrate-network"; + +export interface TransferProps { + to: string; + token: BaseToken; + amount: string; +} + +export type MethodMap = Record< + string, + [any, (network: SubstrateNetwork, args: any) => any] +>; diff --git a/packages/extension/src/providers/kadena/ui/index.ts b/packages/extension/src/providers/kadena/ui/index.ts new file mode 100644 index 000000000..b691dd5d5 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/index.ts @@ -0,0 +1,7 @@ +import { ProviderName, UIExportOptions } from "@/types/provider"; +import getRoutes from "./routes"; +const uiexport: UIExportOptions = { + providerName: ProviderName.kadena, + routes: getRoutes(ProviderName.kadena), +}; +export default uiexport; diff --git a/packages/extension/src/providers/kadena/ui/kda-accounts.vue b/packages/extension/src/providers/kadena/ui/kda-accounts.vue new file mode 100644 index 000000000..e4ee8866f --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/kda-accounts.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/kda-sign-message.vue b/packages/extension/src/providers/kadena/ui/kda-sign-message.vue new file mode 100644 index 000000000..3e4d308af --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/kda-sign-message.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/kda-update-metadata.vue b/packages/extension/src/providers/kadena/ui/kda-update-metadata.vue new file mode 100644 index 000000000..7b953b509 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/kda-update-metadata.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/kda-verify-transaction.vue b/packages/extension/src/providers/kadena/ui/kda-verify-transaction.vue new file mode 100644 index 000000000..8a1a5f54c --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/kda-verify-transaction.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/libs/signer.ts b/packages/extension/src/providers/kadena/ui/libs/signer.ts new file mode 100644 index 000000000..7601dcb39 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/libs/signer.ts @@ -0,0 +1,88 @@ +import { InternalMethods, InternalOnMessageResponse } from "@/types/messenger"; +import { HWwalletType } from "@enkryptcom/types"; +import HWwallet from "@enkryptcom/hw-wallets"; +import { SignerMessageOptions, SignerTransactionOptions } from "../types"; +import { getCustomError } from "@/libs/error"; +import { + payloadSignTransform, + signPayload, +} from "@/providers/polkadot/libs/signing-utils"; +import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; +import { + isAscii, + u8aToBuffer, + u8aUnwrapBytes, + u8aWrapBytes, +} from "@polkadot/util"; +import { bufferToHex } from "ethereumjs-util"; + +const TransactionSigner = ( + options: SignerTransactionOptions +): Promise => { + const { account, network, payload } = options; + if (account.isHardware) { + const hwWallet = new HWwallet(); + return hwWallet + .signTransaction({ + transaction: payload, + networkName: network.name, + pathIndex: account.pathIndex.toString(), + pathType: { + basePath: account.basePath, + path: account.HWOptions!.pathTemplate, + }, + wallet: account.walletType as unknown as HWwalletType, + }) + .then((signature: string) => ({ + result: JSON.stringify(signature), + })) + .catch((e) => { + return Promise.reject({ + error: getCustomError(e.message), + }); + }); + } else { + const signMsg = signPayload(payload); + return sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [signMsg, account], + }).then((res) => { + if (res.error) return res; + + const signed = payloadSignTransform( + JSON.parse(res.result as string), + account.signerType, + true + ); + return { + result: JSON.stringify(signed), + }; + }); + } +}; + +const MessageSigner = ( + options: SignerMessageOptions +): Promise => { + const { account, payload } = options; + if (account.isHardware) { + return Promise.reject({ + error: getCustomError("polkadot-hardware-wallets cant sign raw messages"), + }); + } else { + const bytes = isAscii(payload) + ? u8aToBuffer(u8aUnwrapBytes(payload)) + : payload; + return sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [bufferToHex(u8aToBuffer(u8aWrapBytes(bytes))), account], + }).then((res) => { + if (res.error) return res; + return { + result: res.result, + }; + }); + } +}; + +export { TransactionSigner, MessageSigner }; diff --git a/packages/extension/src/providers/kadena/ui/routes/index.ts b/packages/extension/src/providers/kadena/ui/routes/index.ts new file mode 100644 index 000000000..ba2b02ae8 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/routes/index.ts @@ -0,0 +1,20 @@ +import dotAccounts from "../dot-accounts.vue"; +import dotSignMessage from "../dot-sign-message.vue"; +import dotUpdateMetadata from "../dot-update-metadata.vue"; +import dotVerifyTransaction from "../dot-verify-transaction.vue"; +import dotHWVerify from "../send-transaction/verify-transaction/index.vue"; +import { RouteRecordRaw } from "vue-router"; +import RouteNames from "./names"; +const routes = Object.assign({}, RouteNames); +routes.dotAccounts.component = dotAccounts; +routes.dotTxApprove.component = dotVerifyTransaction; +routes.dotSignMessage.component = dotSignMessage; +routes.dotUpdateMetadata.component = dotUpdateMetadata; +routes.dotHWVerify.component = dotHWVerify; +export default (namespace: string): RouteRecordRaw[] => { + return Object.values(routes).map((route) => { + route.path = `/${namespace}/${route.path}`; + route.name = `${namespace}-${String(route.name)}`; + return route; + }); +}; diff --git a/packages/extension/src/providers/kadena/ui/routes/names.ts b/packages/extension/src/providers/kadena/ui/routes/names.ts index 9904ac414..cc207805b 100644 --- a/packages/extension/src/providers/kadena/ui/routes/names.ts +++ b/packages/extension/src/providers/kadena/ui/routes/names.ts @@ -1,26 +1,26 @@ export default { dotAccounts: { - path: "dot-accounts", + path: "kda-accounts", component: {}, name: "dotAccounts", }, dotTxApprove: { - path: "dot-tx-approve", + path: "kda-tx-approve", component: {}, name: "dotTxApprove", }, dotSignMessage: { - path: "dot-sign-message", + path: "kda-sign-message", component: {}, name: "dotSignMessage", }, dotUpdateMetadata: { - path: "dot-update-metadata", + path: "kda-update-metadata", component: {}, name: "dotUpdateMetadata", }, dotHWVerify: { - path: "dot-hw-verify", + path: "kda-hw-verify", name: "dotHWVerify", component: {}, }, diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-address-input.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-address-input.vue new file mode 100644 index 000000000..6e0a48df6 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-address-input.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-contacts-list.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-contacts-list.vue new file mode 100644 index 000000000..32cead071 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-contacts-list.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-display.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-display.vue new file mode 100644 index 000000000..808b20e92 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-display.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-select.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-select.vue new file mode 100644 index 000000000..48bc83b99 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-fee-select.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-from-contacts-list.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-from-contacts-list.vue new file mode 100644 index 000000000..fa52defff --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-from-contacts-list.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue new file mode 100644 index 000000000..535dcd24e --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue new file mode 100644 index 000000000..65b8ffc66 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-list.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-list.vue new file mode 100644 index 000000000..1cb91a29a --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-list.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-select.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-select.vue new file mode 100644 index 000000000..e64d9a710 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-select.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue new file mode 100644 index 000000000..184786eaa --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -0,0 +1,562 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue new file mode 100644 index 000000000..1f86dfbd7 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue @@ -0,0 +1,357 @@ + + + + + diff --git a/packages/extension/src/providers/kadena/ui/styles/verify-transaction.less b/packages/extension/src/providers/kadena/ui/styles/verify-transaction.less new file mode 100644 index 000000000..549fff172 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/styles/verify-transaction.less @@ -0,0 +1,468 @@ +.provider-verify-transaction { + width: 100%; + height: 100%; + padding-top: 44px; + padding-bottom: 76px; + box-sizing: border-box; + &__logo { + margin-bottom: 8px; + } + &__network { + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + position: absolute; + right: 56px; + top: 54px; + + img { + width: 16px; + height: 16px; + margin-right: 8px; + } + + p { + font-style: normal; + font-weight: 500; + font-size: 12px; + line-height: 16px; + text-align: right; + letter-spacing: 0.5px; + color: @primaryLabel; + margin: 0; + } + } + h2 { + font-style: normal; + font-weight: 700; + font-size: 34px; + line-height: 40px; + letter-spacing: 0.25px; + color: @primaryLabel; + margin: 0 0 16px 0; + word-break: break-all; + } + &__block { + background: @lightBg; + border: 1px solid @gray01; + box-sizing: border-box; + border-radius: 12px; + padding: 10px 16px; + width: 100%; + margin: 0 0 12px 0; + } + &__amount { + display: flex; + justify-content: flex-start; + align-items: flex-start; + flex-direction: row; + + img { + box-shadow: inset 0px 0px 1px rgba(0, 0, 0, 0.16); + width: 32px; + height: 32px; + margin-right: 12px; + border-radius: 100%; + } + + &-info { + h4 { + font-style: normal; + font-weight: 700; + font-size: 24px; + line-height: 32px; + color: @primaryLabel; + margin: 0; + word-break: break-all; + + span { + font-variant: small-caps; + } + } + + p { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @secondaryLabel; + margin: 0; + word-break: break-all; + } + } + } + &__account { + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + + &.from { + margin-bottom: 12px; + } + + img { + width: 32px; + height: 32px; + margin-right: 12px; + border-radius: 100%; + } + &-info { + h4 { + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @primaryLabel; + margin: 0; + word-break: break-all; + } + + h6 { + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + letter-spacing: 0.5px; + color: @secondaryLabel; + margin: 0; + word-break: break-all; + } + + div { + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + + p { + &:first-child { + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + letter-spacing: 0.5px; + color: @secondaryLabel; + margin: 0 8px 0 0; + + span { + font-variant: small-caps; + } + } + + &:last-child { + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + letter-spacing: 0.5px; + color: @tertiaryLabel; + margin: 0; + word-break: break-all; + } + } + } + + &-to { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @primaryLabel; + word-break: break-all; +} + } + } + &__error { + margin: 12px 0 0 0; + border-radius: 10px; + padding: 0 0 0 44px; + position: relative; + box-sizing: border-box; + svg { + position: absolute; + left: 0; + top: 0; + } + p { + font-weight: 400; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @error; + margin: 0; + a { + color: @error; + &:hover { + text-decoration: none; + } + } + } + } + &__info { + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + padding: 6px 0; + margin-bottom: 6px; + img { + width: 32px; + height: 32px; + margin-right: 12px; + } + &-info { + h4 { + font-style: normal; + font-weight: 500; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @primaryLabel; + margin: 0; + word-break: break-all; + } + + p { + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + letter-spacing: 0.5px; + color: @tertiaryLabel; + margin: 0; + word-break: break-all; + } + } + } + &__data { + text-align: center; + padding-top: 4px; + padding-bottom: 20px; + &-link { + border-radius: 6px; + transition: background 300ms ease-in-out; + display: inline-block; + cursor: pointer; + text-decoration: none; + padding: 4px 24px 4px 8px; + position: relative; + font-style: normal; + font-weight: 500; + font-size: 12px; + line-height: 16px; + letter-spacing: 0.8px; + color: @primaryLabel; + + &:hover { + background: rgba(0, 0, 0, 0.04); + } + + svg { + position: absolute; + right: 4px; + top: 4px; + -moz-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + -o-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; + } + + &.open { + svg { + position: absolute; + right: 4px; + top: 4px; + -moz-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -o-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); + } + } + } + + &-text { + padding-top: 12px; + text-align: left; + font-family: 'SF Mono', 'Segoe UI Mono', 'Menlo', 'Consolas'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + letter-spacing: 0.5px; + color: @secondaryLabel; + + p { + font-family: 'SF Mono', 'Segoe UI Mono', 'Menlo', 'Consolas'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + letter-spacing: 0.5px; + color: @secondaryLabel; + margin: 0; + word-break: break-all; + + a { + color: @secondaryLabel; + } + } + + li { + list-style: none; + } + } + } + &__buttons { + display: flex; + justify-content: space-between; + align-items: center; + flex-direction: row; + width: 100%; + box-sizing: border-box; + position: absolute; + left: 0; + bottom: 0; + font-size: 0; + padding: 24px; + box-sizing: border-box; + background-color: @white; + &-cancel { + width: 172px; + } + &-send { + width: 232px; + } + + &.border { + box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.05), + 0px 0px 1px rgba(0, 0, 0, 0.25); + } + } + + &__scroll-area { + position: relative; + margin: auto; + width: calc(~"100% + 16px"); + max-height: 350px; + margin: 0; + padding: 0 16px 0 0 !important; + margin-right: -16px; + box-sizing: border-box; + + &.ps--active-y { + padding-bottom: 0 !important; + } + + & > .ps__rail-y { + right: 0 !important; + } + } + + &__hw { + padding: 2px 0 2px 44px; + position: relative; + + svg { + position: absolute; + left: 0; + top: 50%; + margin-top: -16px; + } + + p { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @secondaryLabel; + margin: 0; + } + } + + &__fee { + height: 40px; + background: @lightBg; + margin: 0 0 12px 0; + box-sizing: border-box; + border: 1px solid @gray01; + box-sizing: border-box; + border-radius: 10px; + width: 100%; + padding: 16px 10px; + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + position: relative; + cursor: pointer; + text-decoration: none; + + &-value { + display: flex; + justify-content: flex-start; + align-items: center; + flex-direction: row; + + &-fiat { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @secondaryLabel; + margin: 0 8px 0 0; + } + + &-crypto { + font-style: normal; + font-weight: 400; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @tertiaryLabel; + margin: 0; + + span { + font-variant: small-caps; + } + } + } + } + + &__error { + margin: 0 0 8px 0; + background: @error01; + border-radius: 10px; + padding: 12px 16px 12px 57px; + position: relative; + box-sizing: border-box; + + svg { + position: absolute; + left: 16px; + top: 50%; + margin-top: -12px; + } + p { + font-weight: 400; + font-size: 14px; + line-height: 20px; + letter-spacing: 0.25px; + color: @error; + margin: 0; + } + } + } \ No newline at end of file diff --git a/packages/extension/src/providers/kadena/ui/types/index.ts b/packages/extension/src/providers/kadena/ui/types/index.ts new file mode 100644 index 000000000..7929241f1 --- /dev/null +++ b/packages/extension/src/providers/kadena/ui/types/index.ts @@ -0,0 +1,59 @@ +import { BaseNetwork } from "@/types/base-network"; +import { ToTokenData } from "@/ui/action/types/token"; +import { EnkryptAccount } from "@enkryptcom/types"; +import { ExtrinsicPayload } from "@polkadot/types/interfaces"; + +export interface CallData { + method?: string; + section?: string; + args?: any; +} + +export interface TxFeeInfo { + nativeValue: string; + fiatValue: string; + nativeSymbol: string; + fiatSymbol: string; +} + +export interface SendTransactionDataType { + from: string; + value: string; + to: string; + data: `0x${string}`; +} + +export interface VerifyTransactionParams { + fromAddress: string; + fromAddressName: string; + toAddress: string; + toToken: ToTokenData; + txFee: TxFeeInfo; + TransactionData: SendTransactionDataType; +} + +export interface SignerTransactionOptions { + payload: ExtrinsicPayload; + network: BaseNetwork; + account: EnkryptAccount; +} + +export interface SignerMessageOptions { + payload: Buffer; + account: EnkryptAccount; +} + +export interface PalletBalancesAccountData { + free: string; + reserved: string; + miscFrozen: string; + feeFrozen: string; +} + +export interface FrameSystemAccountInfo { + nonce: string; + consumers: string; + providers: string; + sufficients: string; + data: PalletBalancesAccountData; +} diff --git a/packages/extension/src/ui/action/views/send-transaction/index.vue b/packages/extension/src/ui/action/views/send-transaction/index.vue index 937c6ab06..080a45df2 100644 --- a/packages/extension/src/ui/action/views/send-transaction/index.vue +++ b/packages/extension/src/ui/action/views/send-transaction/index.vue @@ -6,6 +6,7 @@ import SendTransactionSubstrate from "@/providers/polkadot/ui/send-transaction/index.vue"; import SendTransactionEVM from "@/providers/ethereum/ui/send-transaction/index.vue"; import SendTransactionBTC from "@/providers/bitcoin/ui/send-transaction/index.vue"; +import SendTransactionKadena from "@/providers/kadena/ui/send-transaction/index.vue"; import { useRoute } from "vue-router"; import { ProviderName } from "@/types/provider"; import { getNetworkByName } from "@/libs/utils/networks"; @@ -15,6 +16,7 @@ const sendLayouts: Record = { [ProviderName.ethereum]: SendTransactionEVM, [ProviderName.polkadot]: SendTransactionSubstrate, [ProviderName.bitcoin]: SendTransactionBTC, + [ProviderName.kadena]: SendTransactionKadena, [ProviderName.enkrypt]: null, }; const layout = shallowRef(); diff --git a/packages/extension/src/ui/action/views/verify-transaction/index.vue b/packages/extension/src/ui/action/views/verify-transaction/index.vue index 1ba8ed7c6..4744c7040 100644 --- a/packages/extension/src/ui/action/views/verify-transaction/index.vue +++ b/packages/extension/src/ui/action/views/verify-transaction/index.vue @@ -6,6 +6,7 @@ import VerifyTransactionSubstrate from "@/providers/polkadot/ui/send-transaction/verify-transaction/index.vue"; import VerifyTransactionEVM from "@/providers/ethereum/ui/send-transaction/verify-transaction/index.vue"; import VerifyTransactionBTC from "@/providers/bitcoin/ui/send-transaction/verify-transaction/index.vue"; +import VerifyTransactionKadena from "@/providers/kadena/ui/send-transaction/verify-transaction/index.vue"; import { useRoute } from "vue-router"; import { ProviderName } from "@/types/provider"; import { getNetworkByName } from "@/libs/utils/networks"; @@ -15,6 +16,7 @@ const sendLayouts: Record = { [ProviderName.ethereum]: VerifyTransactionEVM, [ProviderName.polkadot]: VerifyTransactionSubstrate, [ProviderName.bitcoin]: VerifyTransactionBTC, + [ProviderName.kadena]: VerifyTransactionKadena, [ProviderName.enkrypt]: null, }; const layout = shallowRef(); diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index ede1dc69b..00cb11290 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -1,8 +1,9 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; - // eslint-disable-next-line import/extensions import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto.js"; +const Pact = require("pact-lang-api"); + class Signer implements SignerInterface { async generate(mnemonic: string): Promise { const root = kadenaCrypto.kadenaMnemonicToRootKeypair("", mnemonic.trim()); @@ -22,17 +23,17 @@ class Signer implements SignerInterface { publicKey: string ): Promise { console.log(msgHash, sig, publicKey); - return true; + return kadenaCrypto.kadenaVerify(msgHash, publicKey, sig); } async sign(msgHash: string, keyPair: KeyPair): Promise { console.log(msgHash, keyPair); - return ""; + return Pact.crypto.sign(msgHash, keyPair); } bufferToHex(buffer: Iterable): string { return Array.from(new Uint8Array(buffer)) - .map(b => b.toString(16).padStart(2, "0")) + .map((b) => b.toString(16).padStart(2, "0")) .join(""); } } From 1b321ef8c7c9aeeaa2a8d710c88a802139615fea Mon Sep 17 00:00:00 2001 From: Glaicon Date: Wed, 13 Sep 2023 16:32:52 -0400 Subject: [PATCH 014/375] WIP - Send page --- package.json | 3 + .../src/providers/kadena/ui/libs/signer.ts | 77 +- .../kadena/ui/send-transaction/index.vue | 239 +++--- .../verify-transaction/index.vue | 251 ++++--- .../src/providers/kadena/ui/types/index.ts | 2 +- packages/signers/kadena/src/index.ts | 24 +- yarn.lock | 683 +++++++++++++++++- 7 files changed, 1021 insertions(+), 258 deletions(-) diff --git a/package.json b/package.json index 932c323c8..9a8ab90cb 100644 --- a/package.json +++ b/package.json @@ -38,5 +38,8 @@ "node-notifier": "^10.0.1", "nodemon": "^2.0.22", "ultra-runner": "^3.10.5" + }, + "dependencies": { + "@kadena/client": "^1.2.0" } } diff --git a/packages/extension/src/providers/kadena/ui/libs/signer.ts b/packages/extension/src/providers/kadena/ui/libs/signer.ts index 7601dcb39..7ae9fa12a 100644 --- a/packages/extension/src/providers/kadena/ui/libs/signer.ts +++ b/packages/extension/src/providers/kadena/ui/libs/signer.ts @@ -20,45 +20,46 @@ const TransactionSigner = ( options: SignerTransactionOptions ): Promise => { const { account, network, payload } = options; - if (account.isHardware) { - const hwWallet = new HWwallet(); - return hwWallet - .signTransaction({ - transaction: payload, - networkName: network.name, - pathIndex: account.pathIndex.toString(), - pathType: { - basePath: account.basePath, - path: account.HWOptions!.pathTemplate, - }, - wallet: account.walletType as unknown as HWwalletType, - }) - .then((signature: string) => ({ - result: JSON.stringify(signature), - })) - .catch((e) => { - return Promise.reject({ - error: getCustomError(e.message), - }); - }); - } else { - const signMsg = signPayload(payload); - return sendUsingInternalMessengers({ - method: InternalMethods.sign, - params: [signMsg, account], - }).then((res) => { - if (res.error) return res; + // if (account.isHardware) { + // const hwWallet = new HWwallet(); + // return hwWallet + // .signTransaction({ + // transaction: payload, + // networkName: network.name, + // pathIndex: account.pathIndex.toString(), + // pathType: { + // basePath: account.basePath, + // path: account.HWOptions!.pathTemplate, + // }, + // wallet: account.walletType as unknown as HWwalletType, + // }) + // .then((signature: string) => ({ + // result: JSON.stringify(signature), + // })) + // .catch((e) => { + // return Promise.reject({ + // error: getCustomError(e.message), + // }); + // }); + // } else { + // const signMsg = signPayload(payload); + return sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [payload, account], + }).then((res) => { + debugger; + if (res.error) return res; - const signed = payloadSignTransform( - JSON.parse(res.result as string), - account.signerType, - true - ); - return { - result: JSON.stringify(signed), - }; - }); - } + // const signed = payloadSignTransform( + // JSON.parse(res.result as string), + // account.signerType, + // true + // ); + return { + result: JSON.parse(res.result as string), + }; + }); + // } }; const MessageSigner = ( diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 184786eaa..b9703b13c 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -113,7 +113,7 @@ import { toBN } from "web3-utils"; import { formatFloatingPointValue } from "@/libs/utils/number-formatter"; import { fromBase, toBase, isValidDecimals } from "@enkryptcom/utils"; import BigNumber from "bignumber.js"; -import { VerifyTransactionParams } from "@/providers/polkadot/types"; +import { VerifyTransactionParams } from "../types"; import { routes as RouterNames } from "@/ui/action/router"; import { SendOptions } from "@/types/base-token"; import { KDAToken } from "@/providers/kadena/types/kda-token"; @@ -209,71 +209,80 @@ onMounted(() => { const validateFields = async () => { if (selectedAsset.value && isAddress.value) { - if (!isValidDecimals(amount.value || "0", selectedAsset.value.decimals!)) { - hasEnough.value = false; - return; - } - console.log("validateFields", amount.value, selectedAsset.value.decimals!); - - const api = (await props.network.api()).api as ApiPromise; - await api.isReady; - - let rawAmount = toBN( - toBase( - amount.value ? amount.value.toString() : "0", - selectedAsset.value.decimals! - ) - ); - - console.log("validateFields 2", rawAmount.toString()); - - const sendOptions: SendOptions | undefined = sendMax.value - ? { type: "all" } - : undefined; - - const tx = await selectedAsset.value.send!( - api, - addressTo.value, - rawAmount.toString(), - sendOptions - ); - const { partialFee } = ( - await tx.paymentInfo(props.accountInfo.selectedAccount!.address) - ).toJSON(); - const rawFee = toBN(partialFee?.toString() ?? "0"); - const rawBalance = toBN(selectedAsset.value.balance!); - if ( - sendMax.value && - selectedAsset.value.name === accountAssets.value[0].name - ) { - rawAmount = rawAmount.sub(rawFee); - if (rawAmount.gtn(0)) { - amount.value = fromBase( - rawAmount.toString(), - selectedAsset.value.decimals! - ); - } - } - if (rawAmount.ltn(0) || rawAmount.add(rawFee).gt(rawBalance)) { - hasEnough.value = false; - } else { - hasEnough.value = true; - } - - const nativeAsset = accountAssets.value[0]; - const txFeeHuman = fromBase( - partialFee?.toString() ?? "", - nativeAsset.decimals! - ); - - const txPrice = new BigNumber(nativeAsset.price!).times(txFeeHuman); + hasEnough.value = true; fee.value = { fiatSymbol: "USD", - fiatValue: txPrice.toString(), - nativeSymbol: nativeAsset.symbol ?? "", - nativeValue: txFeeHuman.toString(), + fiatValue: "".toString(), + nativeSymbol: "", + nativeValue: "", }; + return; + // if (!isValidDecimals(amount.value || "0", selectedAsset.value.decimals!)) { + // hasEnough.value = false; + // return; + // } + // console.log("validateFields", amount.value, selectedAsset.value.decimals!); + + // const api = (await props.network.api()).api as ApiPromise; + // await api.isReady; + + // let rawAmount = toBN( + // toBase( + // amount.value ? amount.value.toString() : "0", + // selectedAsset.value.decimals! + // ) + // ); + + // console.log("validateFields 2", rawAmount.toString()); + + // const sendOptions: SendOptions | undefined = sendMax.value + // ? { type: "all" } + // : undefined; + + // const tx = await selectedAsset.value.send!( + // api, + // addressTo.value, + // rawAmount.toString(), + // sendOptions + // ); + // const { partialFee } = ( + // await tx.paymentInfo(props.accountInfo.selectedAccount!.address) + // ).toJSON(); + // const rawFee = toBN(partialFee?.toString() ?? "0"); + // const rawBalance = toBN(selectedAsset.value.balance!); + // if ( + // sendMax.value && + // selectedAsset.value.name === accountAssets.value[0].name + // ) { + // rawAmount = rawAmount.sub(rawFee); + // if (rawAmount.gtn(0)) { + // amount.value = fromBase( + // rawAmount.toString(), + // selectedAsset.value.decimals! + // ); + // } + // } + // if (rawAmount.ltn(0) || rawAmount.add(rawFee).gt(rawBalance)) { + // hasEnough.value = false; + // } else { + // hasEnough.value = true; + // } + + // const nativeAsset = accountAssets.value[0]; + // const txFeeHuman = fromBase( + // partialFee?.toString() ?? "", + // nativeAsset.decimals! + // ); + + // const txPrice = new BigNumber(nativeAsset.price!).times(txFeeHuman); + + // fee.value = { + // fiatSymbol: "USD", + // fiatValue: txPrice.toString(), + // nativeSymbol: nativeAsset.symbol ?? "", + // nativeValue: txFeeHuman.toString(), + // }; } }; watch([selectedAsset, addressTo], validateFields); @@ -354,7 +363,7 @@ const selectAccountTo = (account: string) => { isOpenSelectContactTo.value = false; }; -const selectToken = (token: SubstrateToken | Partial) => { +const selectToken = (token: KDAToken | Partial) => { selectedAsset.value = token; isOpenSelectToken.value = false; }; @@ -394,54 +403,53 @@ const setSendMax = (max: boolean) => { }; const isDisabled = computed(() => { - let isDisabled = true; - - let addressIsValid = false; - - try { - props.network.displayAddress(addressTo.value); - addressIsValid = true; - } catch { - addressIsValid = false; - } - - if ( - amount.value !== undefined && - amount.value !== "" && - hasEnough.value && - addressIsValid && - !edWarn.value && - edWarn.value !== undefined - ) - isDisabled = false; - return isDisabled; + return false; + // let isDisabled = true; + + // let addressIsValid = false; + + // try { + // props.network.displayAddress(addressTo.value); + // addressIsValid = true; + // } catch { + // addressIsValid = false; + // } + + // if ( + // amount.value !== undefined && + // amount.value !== "" && + // hasEnough.value && + // addressIsValid && + // !edWarn.value && + // edWarn.value !== undefined + // ) + // isDisabled = false; + // return isDisabled; }); const sendAction = async () => { const sendAmount = toBase(amount.value!, selectedAsset.value.decimals!); - const sendOptions: SendOptions | undefined = sendMax.value - ? { type: "all" } - : undefined; + // const sendOptions: SendOptions | undefined = sendMax.value + // ? { type: "all" } + // : undefined; - const api = (await props.network.api()).api as ApiPromise; - await api.isReady; + // const api = (await props.network.api()).api as ApiPromise; + // await api.isReady; - const tx = await selectedAsset.value?.send!( - api, - addressTo.value, - sendAmount, - sendOptions - ); + // const tx = await selectedAsset.value?.send!( + // api, + // addressTo.value, + // sendAmount, + // sendOptions + // ); const keyring = new PublicKeyRing(); - const fromAccount = await keyring.getAccount( - polkadotEncodeAddress(addressFrom.value) - ); + const fromAccount = await keyring.getAccount(addressFrom.value); const txVerifyInfo: VerifyTransactionParams = { TransactionData: { from: fromAccount.address, to: addressTo.value, - data: tx.toHex() as `0x{string}`, + data: "0x" as `0x{string}`, value: amount.value!, }, toToken: { @@ -471,22 +479,23 @@ const sendAction = async () => { }, }); - if (fromAccount.isHardware) { - await Browser.windows.create({ - url: Browser.runtime.getURL( - getUiPath( - `dot-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, - ProviderName.polkadot - ) - ), - type: "popup", - focused: true, - height: 600, - width: 460, - }); - } else { - router.push(routedRoute); - } + router.push(routedRoute); + // if (fromAccount.isHardware) { + // await Browser.windows.create({ + // url: Browser.runtime.getURL( + // getUiPath( + // `dot-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, + // ProviderName.polkadot + // ) + // ), + // type: "popup", + // focused: true, + // height: 600, + // width: 460, + // }); + // } else { + // router.push(routedRoute); + // } }; diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue index 1f86dfbd7..00b13171f 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue @@ -83,21 +83,16 @@ import HardwareWalletMsg from "@/providers/common/ui/verify-transaction/hardware import SendProcess from "@action/views/send-process/index.vue"; import PublicKeyRing from "@/libs/keyring/public-keyring"; import { getCurrentContext } from "@/libs/messenger/extension"; -import { VerifyTransactionParams } from "@/providers/polkadot/ui/types"; -import { ApiPromise } from "@polkadot/api"; -import { u8aToHex } from "@polkadot/util"; -import type { SignerResult } from "@polkadot/api/types"; +import { VerifyTransactionParams } from "../../types"; import { - DEFAULT_SUBSTRATE_NETWORK, + DEFAULT_KADENA_NETWORK, getNetworkByName, } from "@/libs/utils/networks"; -import { TypeRegistry } from "@polkadot/types"; import { TransactionSigner } from "../../libs/signer"; -import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; -import ActivityState from "@/libs/activity-state"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; import { BaseNetwork } from "@/types/base-network"; +import { IUnsignedCommand, Pact, createClient } from "@kadena/client"; const isSendDone = ref(false); const account = ref(); @@ -115,7 +110,7 @@ const isWindowPopup = ref(false); const verifyScrollRef = ref>(); defineExpose({ verifyScrollRef }); -const network = ref(DEFAULT_SUBSTRATE_NETWORK); +const network = ref(DEFAULT_KADENA_NETWORK); onBeforeMount(async () => { network.value = (await getNetworkByName(selectedNetwork))!; account.value = await KeyRing.getAccount(txData.fromAddress); @@ -131,87 +126,167 @@ const close = () => { const sendAction = async () => { isProcessing.value = true; - const api = await network.value.api(); - - const tx = (api.api as ApiPromise).tx(txData.TransactionData.data); - - try { - const signedTx = await tx.signAsync(account.value!.address, { - signer: { - signPayload: (signPayload): Promise => { - const registry = new TypeRegistry(); - registry.setSignedExtensions(signPayload.signedExtensions); - const extType = registry.createType("ExtrinsicPayload", signPayload, { - version: signPayload.version, - }); - return TransactionSigner({ - account: account.value!, - network: network.value, - payload: extType, - }).then((res) => { - if (res.error) return Promise.reject(res.error); - else - return { - id: 0, - signature: JSON.parse(res.result as string), - }; - }); - }, - }, - }); - const txActivity: Activity = { - from: txData.fromAddress, - to: txData.toAddress, - isIncoming: txData.fromAddress === txData.toAddress, - network: network.value.name, - status: ActivityStatus.pending, - timestamp: new Date().getTime(), - token: { - decimals: txData.toToken.decimals, - icon: txData.toToken.icon, - name: txData.toToken.name, - symbol: txData.toToken.symbol, - price: txData.toToken.price, - }, - type: ActivityType.transaction, - value: txData.toToken.amount, - transactionHash: "", - }; - const activityState = new ActivityState(); - signedTx - .send() - .then(async (hash) => { - txActivity.transactionHash = u8aToHex(hash); - await activityState.addActivities([txActivity], { - address: network.value.displayAddress(txData.fromAddress), - network: network.value.name, - }); + const modules = Pact.modules as any; + debugger; + const unsignedTransaction: IUnsignedCommand = Pact.builder + .execution( + modules.coin.transfer(txData.fromAddress, txData.toAddress, { + decimal: txData.TransactionData.value, }) - .catch(() => { - txActivity.status = ActivityStatus.failed; - activityState.addActivities([txActivity], { - address: network.value.displayAddress(txData.fromAddress), - network: network.value.name, - }); - }); - - isSendDone.value = true; - if (getCurrentContext() === "popup") { - setTimeout(() => { - isProcessing.value = false; - router.go(-2); - }, 2500); - } else { - setTimeout(() => { - isProcessing.value = false; - window.close(); - }, 1500); - } - } catch (error: any) { - isProcessing.value = false; - console.error("error", error); - errorMsg.value = JSON.stringify(error); + ) + .addSigner(txData.fromAddress, (withCapability: any) => [ + withCapability("coin.GAS"), + withCapability("coin.TRANSFER", txData.fromAddress, txData.toAddress, { + decimal: txData.TransactionData.value, + }), + ]) + .setMeta({ chainId: "1" }) + .setNetworkId("testnet04") + .createTransaction(); + // const unsignedTransaction = modules.coin + // .transfer( + // txData.fromAddress, + // txData.toAddress, + // txData.TransactionData.value + // ) + // // .addSigner("public_key", (withCapability: any) => [ + // // withCapability("coin.GAS"), + // // withCapability("coin.TRANSFER", txData.fromAddress, txData.toAddress, { + // // decimal: txData.TransactionData.value, + // // }), + // // ]) + // // .addCap("coin.GAS", txData.fromAddress) + // // .addCap( + // // "coin.TRANSFER", + // // txData.fromAddress, + // // txData.fromAddress, + // // txData.toAddress, + // // txData.TransactionData.value + // // ) + // .setMeta({ sender: txData.fromAddress }, "testnet04") + // .createTransaction(); + debugger; + + const transaction = await TransactionSigner({ + account: account.value!, + network: network.value, + payload: unsignedTransaction.hash, + }).then((res) => { + debugger; + if (res.error) return Promise.reject(res.error); + else + return { + id: 0, + signature: res.result as string, + }; + }); + debugger; + + const client = createClient( + "https://api.testnet.chainweb.com/chainweb/0.0/testnet04/chain/1/pact" + ); + // const teste: any = JSON.parse(unsignedTransaction.cmd); + // teste.sigs = { + // pubKey: txData.fromAddress, + // sig: transaction.signature, + // }; + // unsignedTransaction.cmd.sigs = { + + // } + // check if all necessary signatures are added + const transactionDescriptor = await client.submit({ + cmd: unsignedTransaction.cmd, + hash: unsignedTransaction.hash, + sigs: [{ sig: transaction.signature }], + }); + const response = await client.listen(transactionDescriptor); + if (response.result.status === "failure") { + throw response.result.error; + } else { + console.log(response.result); } + + // const api = await network.value.api(); + + // const tx = (api.api as ApiPromise).tx(txData.TransactionData.data); + + // try { + // const signedTx = await tx.signAsync(account.value!.address, { + // signer: { + // signPayload: (signPayload): Promise => { + // const registry = new TypeRegistry(); + // registry.setSignedExtensions(signPayload.signedExtensions); + // const extType = registry.createType("ExtrinsicPayload", signPayload, { + // version: signPayload.version, + // }); + // return TransactionSigner({ + // account: account.value!, + // network: network.value, + // payload: extType, + // }).then((res) => { + // if (res.error) return Promise.reject(res.error); + // else + // return { + // id: 0, + // signature: JSON.parse(res.result as string), + // }; + // }); + // }, + // }, + // }); + // const txActivity: Activity = { + // from: txData.fromAddress, + // to: txData.toAddress, + // isIncoming: txData.fromAddress === txData.toAddress, + // network: network.value.name, + // status: ActivityStatus.pending, + // timestamp: new Date().getTime(), + // token: { + // decimals: txData.toToken.decimals, + // icon: txData.toToken.icon, + // name: txData.toToken.name, + // symbol: txData.toToken.symbol, + // price: txData.toToken.price, + // }, + // type: ActivityType.transaction, + // value: txData.toToken.amount, + // transactionHash: "", + // }; + // const activityState = new ActivityState(); + // signedTx + // .send() + // .then(async (hash) => { + // txActivity.transactionHash = u8aToHex(hash); + // await activityState.addActivities([txActivity], { + // address: network.value.displayAddress(txData.fromAddress), + // network: network.value.name, + // }); + // }) + // .catch(() => { + // txActivity.status = ActivityStatus.failed; + // activityState.addActivities([txActivity], { + // address: network.value.displayAddress(txData.fromAddress), + // network: network.value.name, + // }); + // }); + + // isSendDone.value = true; + // if (getCurrentContext() === "popup") { + // setTimeout(() => { + // isProcessing.value = false; + // router.go(-2); + // }, 2500); + // } else { + // setTimeout(() => { + // isProcessing.value = false; + // window.close(); + // }, 1500); + // } + // } catch (error: any) { + // isProcessing.value = false; + // console.error("error", error); + // errorMsg.value = JSON.stringify(error); + // } }; const isHasScroll = () => { diff --git a/packages/extension/src/providers/kadena/ui/types/index.ts b/packages/extension/src/providers/kadena/ui/types/index.ts index 7929241f1..da7306d6f 100644 --- a/packages/extension/src/providers/kadena/ui/types/index.ts +++ b/packages/extension/src/providers/kadena/ui/types/index.ts @@ -33,7 +33,7 @@ export interface VerifyTransactionParams { } export interface SignerTransactionOptions { - payload: ExtrinsicPayload; + payload: string | ExtrinsicPayload; network: BaseNetwork; account: EnkryptAccount; } diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index 00cb11290..d5010a2e7 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -2,7 +2,7 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; // eslint-disable-next-line import/extensions import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto.js"; -const Pact = require("pact-lang-api"); +// const Pact = require("pact-lang-api"); class Signer implements SignerInterface { async generate(mnemonic: string): Promise { @@ -22,13 +22,21 @@ class Signer implements SignerInterface { sig: string, publicKey: string ): Promise { - console.log(msgHash, sig, publicKey); - return kadenaCrypto.kadenaVerify(msgHash, publicKey, sig); + // console.log(msgHash, sig, publicKey); + // return kadenaCrypto.kadenaVerify(msgHash, publicKey, sig); + const xpub = this.hexToBuffer(publicKey); + const xsig = this.hexToBuffer(sig); + return kadenaCrypto.kadenaVerify(msgHash, xpub, xsig); } async sign(msgHash: string, keyPair: KeyPair): Promise { - console.log(msgHash, keyPair); - return Pact.crypto.sign(msgHash, keyPair); + // console.log(msgHash, keyPair); + // console.log("Nova assinatura 2") + // // return kadenaCrypto.kadenaSign('', msgHash, keyPair.privateKey); + // return Pact.crypto.sign(msgHash, keyPair); + + const xprv = this.hexToBuffer(keyPair.privateKey); + return this.bufferToHex(kadenaCrypto.kadenaSign("", msgHash, xprv)); } bufferToHex(buffer: Iterable): string { @@ -36,6 +44,12 @@ class Signer implements SignerInterface { .map((b) => b.toString(16).padStart(2, "0")) .join(""); } + + hexToBuffer(hex: string): Uint8Array { + return new Uint8Array( + hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) + ); + } } export default Signer; diff --git a/yarn.lock b/yarn.lock index b772b01f6..6410c5f3c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3770,6 +3770,65 @@ __metadata: languageName: node linkType: hard +"@kadena/chainweb-node-client@npm:0.4.4": + version: 0.4.4 + resolution: "@kadena/chainweb-node-client@npm:0.4.4" + dependencies: + "@kadena/cryptography-utils": 0.3.8 + "@kadena/pactjs": 0.3.2 + "@kadena/types": 0.4.2 + "@types/isomorphic-fetch": ~0.0.36 + cross-fetch: ~3.1.5 + node-fetch: ~2.6.2 + checksum: b8e5c19d1e5762464841a273b0d13aef431306714acf959f9cfeb306b36da33a5cda1e24e7d14006165ebd0b672eb818a66e8bee590b9f7fc0c6fc7ceae73981 + languageName: node + linkType: hard + +"@kadena/client@npm:^1.2.0": + version: 1.2.0 + resolution: "@kadena/client@npm:1.2.0" + dependencies: + "@kadena/chainweb-node-client": 0.4.4 + "@kadena/cryptography-utils": 0.3.8 + "@kadena/pactjs": 0.3.2 + "@walletconnect/sign-client": ~2.8.1 + cross-fetch: ~3.1.5 + debug: ~4.3.4 + encoding: ~0.1.13 + yaml: ~2.1.1 + checksum: 514f644db00c5a8a0494f709774c4000fa3aadefd03f57a530696f4eee36d485d29581d008bf70b9a8f2ab4b492d80670b923bb5e3f46d0cdbd787e76c252bbc + languageName: node + linkType: hard + +"@kadena/cryptography-utils@npm:0.3.8": + version: 0.3.8 + resolution: "@kadena/cryptography-utils@npm:0.3.8" + dependencies: + "@kadena/types": 0.4.2 + blakejs: ^1.2.1 + buffer: ^6.0.3 + tweetnacl: ^1.0.3 + checksum: 6851d6fafe45fe2aadf1613babf44c17fbaf4ca9803bb26c914d721cf52e8843d7b844e7bb1ef3a9138e35e795e6ea9dbcdce273e8dd34945732b1de03bccebd + languageName: node + linkType: hard + +"@kadena/pactjs@npm:0.3.2": + version: 0.3.2 + resolution: "@kadena/pactjs@npm:0.3.2" + dependencies: + "@kadena/types": 0.4.2 + bignumber.js: ^9.0.2 + checksum: dee9eda88b1c83119a4d853d57d0794c2676dced14e0b73a3ecccdbdce0d34d3dc30194e391a9b98486431abeccf6891e86b04c7c05e99cc79343fe2f1e61e05 + languageName: node + linkType: hard + +"@kadena/types@npm:0.4.2": + version: 0.4.2 + resolution: "@kadena/types@npm:0.4.2" + checksum: e80280e7dc155a1eb6b74c394a78c1c1dca54891fb674ad2b9ec30131883fa88ccdb6c8ed15a6c7a5ad9f2860567ee7ac3e6db4ea97be79ead005b8b0b465d7c + languageName: node + linkType: hard + "@ledgerhq/compressjs@npm:1.3.2": version: 1.3.2 resolution: "@ledgerhq/compressjs@npm:1.3.2" @@ -5674,6 +5733,13 @@ __metadata: languageName: node linkType: hard +"@stablelib/aead@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/aead@npm:1.0.1" + checksum: 1a6f68d138f105d17dd65349751515bd252ab0498c77255b8555478d28415600dde493f909eb718245047a993f838dfae546071e1687566ffb7b8c3e10c918d9 + languageName: node + linkType: hard + "@stablelib/binary@npm:^0.7.2": version: 0.7.2 resolution: "@stablelib/binary@npm:0.7.2" @@ -5725,6 +5791,44 @@ __metadata: languageName: node linkType: hard +"@stablelib/bytes@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/bytes@npm:1.0.1" + checksum: 456267e08c3384abcb71d3ad3e97a6f99185ad754bac016f501ebea4e4886f37900589143b57e33bdbbf513a92fc89368c15dd4517e0540d0bdc79ecdf9dd087 + languageName: node + linkType: hard + +"@stablelib/chacha20poly1305@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha20poly1305@npm:1.0.1" + dependencies: + "@stablelib/aead": ^1.0.1 + "@stablelib/binary": ^1.0.1 + "@stablelib/chacha": ^1.0.1 + "@stablelib/constant-time": ^1.0.1 + "@stablelib/poly1305": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 81f1a32330838d31e4dc3144d76eba7244b56d9ea38c1f604f2c34d93ed8e67e9a6167d2cfd72254c13cc46dfc1f5ce5157b37939a575295d69d9144abb4e4fb + languageName: node + linkType: hard + +"@stablelib/chacha@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/chacha@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: f061f36c4ca4bf177dd7cac11e7c65ced164f141b6065885141ae5a55f32e16ba0209aefcdcc966aef013f1da616ce901a3a80653b4b6f833cf7e3397ae2d6bd + languageName: node + linkType: hard + +"@stablelib/constant-time@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/constant-time@npm:1.0.1" + checksum: dba4f4bf508de2ff15f7f0cbd875e70391aa3ba3698290fe1ed2feb151c243ba08a90fc6fb390ec2230e30fcc622318c591a7c0e35dcb8150afb50c797eac3d7 + languageName: node + linkType: hard + "@stablelib/ed25519@npm:^1.0.2": version: 1.0.2 resolution: "@stablelib/ed25519@npm:1.0.2" @@ -5750,6 +5854,28 @@ __metadata: languageName: node linkType: hard +"@stablelib/hkdf@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/hkdf@npm:1.0.1" + dependencies: + "@stablelib/hash": ^1.0.1 + "@stablelib/hmac": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 9d45e303715a1835c8612b78e6c1b9d2b7463699b484241d8681fb5c17e0f2bbde5ce211c882134b64616a402e09177baeba80426995ff227b3654a155ab225d + languageName: node + linkType: hard + +"@stablelib/hmac@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/hmac@npm:1.0.1" + dependencies: + "@stablelib/constant-time": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: e3b93f7144a5846a6e30213278f7570de6d3f9d09131b95ce76d5c5c8bf37bf5d1830f2ee8d847555707271dbfd6e2461221719fd4d8b27ff06b9dd689c0ec21 + languageName: node + linkType: hard + "@stablelib/int@npm:^0.5.0": version: 0.5.0 resolution: "@stablelib/int@npm:0.5.0" @@ -5764,6 +5890,25 @@ __metadata: languageName: node linkType: hard +"@stablelib/keyagreement@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/keyagreement@npm:1.0.1" + dependencies: + "@stablelib/bytes": ^1.0.1 + checksum: 3c8ec904dd50f72f3162f5447a0fa8f1d9ca6e24cd272d3dbe84971267f3b47f9bd5dc4e4eeedf3fbac2fe01f2d9277053e57c8e60db8c5544bfb35c62d290dd + languageName: node + linkType: hard + +"@stablelib/poly1305@npm:^1.0.1": + version: 1.0.1 + resolution: "@stablelib/poly1305@npm:1.0.1" + dependencies: + "@stablelib/constant-time": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 70b845bb0481c66b7ba3f3865d01e4c67a4dffc9616fc6de1d23efc5e828ec09de25f8e3be4e1f15a23b8e87e3036ee3d949c2fd4785047e6f7028bbec0ead18 + languageName: node + linkType: hard + "@stablelib/random@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/random@npm:1.0.1" @@ -5774,6 +5919,27 @@ __metadata: languageName: node linkType: hard +"@stablelib/random@npm:^1.0.2": + version: 1.0.2 + resolution: "@stablelib/random@npm:1.0.2" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: f5ace0a588dc4c21f01cb85837892d4c872e994ae77a58a8eb7dd61aa0b26fb1e9b46b0445e71af57d963ef7d9f5965c64258fc0d04df7b2947bc48f2d3560c5 + languageName: node + linkType: hard + +"@stablelib/sha256@npm:1.0.1": + version: 1.0.1 + resolution: "@stablelib/sha256@npm:1.0.1" + dependencies: + "@stablelib/binary": ^1.0.1 + "@stablelib/hash": ^1.0.1 + "@stablelib/wipe": ^1.0.1 + checksum: 38669871e1bda72eb537629ebceac1c72da8890273a9fbe088f81f6d14c1ec04e78be8c5b455380a06c67f8e62b2508e11e9063fcc257dbaa1b5c27ac756ba77 + languageName: node + linkType: hard + "@stablelib/sha512@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/sha512@npm:1.0.1" @@ -5799,6 +5965,17 @@ __metadata: languageName: node linkType: hard +"@stablelib/x25519@npm:^1.0.3": + version: 1.0.3 + resolution: "@stablelib/x25519@npm:1.0.3" + dependencies: + "@stablelib/keyagreement": ^1.0.1 + "@stablelib/random": ^1.0.2 + "@stablelib/wipe": ^1.0.1 + checksum: f8537066b542b6770c1b5b2ae5ad0688d1b986e4bf818067c152c123a5471531987bbf024224f75f387f481ccc5b628e391e49e92102b8b1a3e2d449d6105402 + languageName: node + linkType: hard + "@stricahq/bip32ed25519@npm:^1.0.3": version: 1.0.4 resolution: "@stricahq/bip32ed25519@npm:1.0.4" @@ -6724,6 +6901,13 @@ __metadata: languageName: node linkType: hard +"@types/isomorphic-fetch@npm:~0.0.36": + version: 0.0.36 + resolution: "@types/isomorphic-fetch@npm:0.0.36" + checksum: 1ffaa1c97a019b1f7a682e2ae31bd4cc3f324198b422c62cece51b42d2750e0dde0c4df2320a52874d6c6019ee4b00ca2e736010d34b206a82e63ef82ef85bbe + languageName: node + linkType: hard + "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -7900,6 +8084,30 @@ __metadata: languageName: node linkType: hard +"@walletconnect/core@npm:2.8.6": + version: 2.8.6 + resolution: "@walletconnect/core@npm:2.8.6" + dependencies: + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-provider": 1.0.13 + "@walletconnect/jsonrpc-types": 1.0.3 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/jsonrpc-ws-connection": ^1.0.11 + "@walletconnect/keyvaluestorage": ^1.0.2 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/relay-api": ^1.0.9 + "@walletconnect/relay-auth": ^1.0.4 + "@walletconnect/safe-json": ^1.0.2 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.8.6 + "@walletconnect/utils": 2.8.6 + events: ^3.3.0 + lodash.isequal: 4.5.0 + uint8arrays: ^3.1.0 + checksum: dbb2a18de5b4e8162516fbb0db1272ebf898aca66ca8cad3003d36f077ef8cac3dff3731d0a25b1352586e66418770747c49ea9f8e70ffd924ee1a0177c14439 + languageName: node + linkType: hard + "@walletconnect/core@npm:^1.7.3": version: 1.7.8 resolution: "@walletconnect/core@npm:1.7.8" @@ -7941,6 +8149,36 @@ __metadata: languageName: node linkType: hard +"@walletconnect/environment@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/environment@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: a18731d857bdca73910147e59992cef3c6e292c37ab3d3013307bd706f06cb216aa804f0f48b25a78df6493ad8127e633629f4b50acb4f69d3765d6ac0524f68 + languageName: node + linkType: hard + +"@walletconnect/events@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/events@npm:1.0.1" + dependencies: + keyvaluestorage-interface: ^1.0.0 + tslib: 1.14.1 + checksum: d28aa4dcc981bdaf38f0aeed979731ca793cead7e7a4ee730a9146d99d89db09a86c8e3192ed860638283276961c0723ba00cf3b8776f0692b36ec7df6c01be4 + languageName: node + linkType: hard + +"@walletconnect/heartbeat@npm:1.2.1": + version: 1.2.1 + resolution: "@walletconnect/heartbeat@npm:1.2.1" + dependencies: + "@walletconnect/events": ^1.0.1 + "@walletconnect/time": ^1.0.2 + tslib: 1.14.1 + checksum: df4d492a2d336283f834bc205c09b795f85cd507a61b14745dc2124e510a250fefbd83d51216f93df2e0aa0cf8120134db2679de8019eddd63877e9928997952 + languageName: node + linkType: hard + "@walletconnect/iso-crypto@npm:^1.7.3": version: 1.7.8 resolution: "@walletconnect/iso-crypto@npm:1.7.8" @@ -7952,6 +8190,27 @@ __metadata: languageName: node linkType: hard +"@walletconnect/jsonrpc-provider@npm:1.0.13": + version: 1.0.13 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.13" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.8 + "@walletconnect/safe-json": ^1.0.2 + tslib: 1.14.1 + checksum: 497dfdd9f988432f171bc98336f3583c679059f0a166f95d6e51c8e1937c17abd9a5fd3aadfcebf6964bae14edd1e05fb0453e370d6e3bbc7ff4919fcad7c478 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.3 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" + dependencies: + keyvaluestorage-interface: ^1.0.0 + tslib: 1.14.1 + checksum: 26e6f1d8f4207328d3df465c36d0d67844772863dc8e9e78e6cfec417cfc359300eab049d99ea558982b3f0948f4ca26b75253bdf635ffd82ffe30a5276b790c + languageName: node + linkType: hard + "@walletconnect/jsonrpc-types@npm:^1.0.1": version: 1.0.1 resolution: "@walletconnect/jsonrpc-types@npm:1.0.1" @@ -7961,6 +8220,17 @@ __metadata: languageName: node linkType: hard +"@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.8": + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" + dependencies: + "@walletconnect/environment": ^1.0.1 + "@walletconnect/jsonrpc-types": ^1.0.3 + tslib: 1.14.1 + checksum: f43a85dfce8150c3e3d1f009e8d8241ab8e10b026ea435f0918edf4db6b3a17586ba9d9c54a93cc61e4d3c685611e5bd5954fc377a581af503acd38e6d84c2ef + languageName: node + linkType: hard + "@walletconnect/jsonrpc-utils@npm:^1.0.0": version: 1.0.3 resolution: "@walletconnect/jsonrpc-utils@npm:1.0.3" @@ -7971,6 +8241,47 @@ __metadata: languageName: node linkType: hard +"@walletconnect/jsonrpc-ws-connection@npm:^1.0.11": + version: 1.0.13 + resolution: "@walletconnect/jsonrpc-ws-connection@npm:1.0.13" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.6 + "@walletconnect/safe-json": ^1.0.2 + events: ^3.3.0 + tslib: 1.14.1 + ws: ^7.5.1 + checksum: f2253b17564f7622e69b1252830f05efdf7f4d58b120adb3a3e950c2087845171c912307c39948d0b869aa8610688b83f54f54de4657091f7431aea95a59f8b9 + languageName: node + linkType: hard + +"@walletconnect/keyvaluestorage@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/keyvaluestorage@npm:1.0.2" + dependencies: + safe-json-utils: ^1.1.1 + tslib: 1.14.1 + peerDependencies: + "@react-native-async-storage/async-storage": 1.x + lokijs: 1.x + peerDependenciesMeta: + "@react-native-async-storage/async-storage": + optional: true + lokijs: + optional: true + checksum: d695c2efcfa013a43cfaa20c85281df7d364a4452d11a4312a695298bd0e50d04b0e21c828f33f46fb020ea9796e60a6b23041a85f29bd10beeba7d0da24539f + languageName: node + linkType: hard + +"@walletconnect/logger@npm:^2.0.1": + version: 2.0.1 + resolution: "@walletconnect/logger@npm:2.0.1" + dependencies: + pino: 7.11.0 + tslib: 1.14.1 + checksum: b686679d176d5d22a3441d93e71be2652e6c447682a6d6f014baf7c2d9dcd23b93e2f434d4410e33cc532d068333f6b3c1d899aeb0d6f60cc296ed17f57b0c2c + languageName: node + linkType: hard + "@walletconnect/randombytes@npm:^1.0.2": version: 1.0.2 resolution: "@walletconnect/randombytes@npm:1.0.2" @@ -7982,6 +8293,30 @@ __metadata: languageName: node linkType: hard +"@walletconnect/relay-api@npm:^1.0.9": + version: 1.0.9 + resolution: "@walletconnect/relay-api@npm:1.0.9" + dependencies: + "@walletconnect/jsonrpc-types": ^1.0.2 + tslib: 1.14.1 + checksum: 5870579b6552f1ce7351878f1acb8386b0c11288c64d39133c7cee5040feeb7ccf9114228d97a59749d60366ad107b097d656407d534567c24f5d3878ea6e246 + languageName: node + linkType: hard + +"@walletconnect/relay-auth@npm:^1.0.4": + version: 1.0.4 + resolution: "@walletconnect/relay-auth@npm:1.0.4" + dependencies: + "@stablelib/ed25519": ^1.0.2 + "@stablelib/random": ^1.0.1 + "@walletconnect/safe-json": ^1.0.1 + "@walletconnect/time": ^1.0.2 + tslib: 1.14.1 + uint8arrays: ^3.0.0 + checksum: 35b3229d7b57e74fdb8fe6827d8dd8291dc60bacda880a57b2acb47a34d38f12be46c971c9eff361eb4073e896648b550de7a7a3852ef3752f9619c08dfba891 + languageName: node + linkType: hard + "@walletconnect/safe-json@npm:1.0.0": version: 1.0.0 resolution: "@walletconnect/safe-json@npm:1.0.0" @@ -7989,6 +8324,32 @@ __metadata: languageName: node linkType: hard +"@walletconnect/safe-json@npm:^1.0.1, @walletconnect/safe-json@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/safe-json@npm:1.0.2" + dependencies: + tslib: 1.14.1 + checksum: fee03fcc70adb5635ab9419ea6ec6555aa2467bef650ad3b9526451c3a5cf247836db0f3ae3bb435d2e585d99e50c2ebe7dc9c429cfa3df900cf3fe4bd06d37f + languageName: node + linkType: hard + +"@walletconnect/sign-client@npm:~2.8.1": + version: 2.8.6 + resolution: "@walletconnect/sign-client@npm:2.8.6" + dependencies: + "@walletconnect/core": 2.8.6 + "@walletconnect/events": ^1.0.1 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-utils": 1.0.8 + "@walletconnect/logger": ^2.0.1 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.8.6 + "@walletconnect/utils": 2.8.6 + events: ^3.3.0 + checksum: 0595bd5beb0474f350d88306f68808d0542097b440714a622ca0663339586f14d1b2057fd101435de83875344f6d2579ed94e0480a1457f06a689ded6a184ce1 + languageName: node + linkType: hard + "@walletconnect/socket-transport@npm:^1.7.8": version: 1.7.8 resolution: "@walletconnect/socket-transport@npm:1.7.8" @@ -8000,6 +8361,29 @@ __metadata: languageName: node linkType: hard +"@walletconnect/time@npm:^1.0.2": + version: 1.0.2 + resolution: "@walletconnect/time@npm:1.0.2" + dependencies: + tslib: 1.14.1 + checksum: e3fc0113ca9e7ecedfc65f9e1517196682d5ffcda60750f51073b8d704719a17fea75da8b242c804bfa5b994707723043892a2db3cc86988b190b7b8711fe3c0 + languageName: node + linkType: hard + +"@walletconnect/types@npm:2.8.6": + version: 2.8.6 + resolution: "@walletconnect/types@npm:2.8.6" + dependencies: + "@walletconnect/events": ^1.0.1 + "@walletconnect/heartbeat": 1.2.1 + "@walletconnect/jsonrpc-types": 1.0.3 + "@walletconnect/keyvaluestorage": ^1.0.2 + "@walletconnect/logger": ^2.0.1 + events: ^3.3.0 + checksum: e744b55a7a6e92a46b534176bcc047a5c7d04a7b8d10b46bb52350f65afbb575c21b9c33e42f27b428d14e5eb245682a4af7126a25167e576490d15021e88de8 + languageName: node + linkType: hard + "@walletconnect/types@npm:^1.7.3, @walletconnect/types@npm:^1.7.8": version: 1.7.8 resolution: "@walletconnect/types@npm:1.7.8" @@ -8007,6 +8391,28 @@ __metadata: languageName: node linkType: hard +"@walletconnect/utils@npm:2.8.6": + version: 2.8.6 + resolution: "@walletconnect/utils@npm:2.8.6" + dependencies: + "@stablelib/chacha20poly1305": 1.0.1 + "@stablelib/hkdf": 1.0.1 + "@stablelib/random": ^1.0.2 + "@stablelib/sha256": 1.0.1 + "@stablelib/x25519": ^1.0.3 + "@walletconnect/relay-api": ^1.0.9 + "@walletconnect/safe-json": ^1.0.2 + "@walletconnect/time": ^1.0.2 + "@walletconnect/types": 2.8.6 + "@walletconnect/window-getters": ^1.0.1 + "@walletconnect/window-metadata": ^1.0.1 + detect-browser: 5.3.0 + query-string: 7.1.3 + uint8arrays: ^3.1.0 + checksum: b35555def95c45605dbd8ae09f933a49d9ad1f71b6f66332792a7eb3b22090bfffd7c4cc7c61eb9d285dcf4d750cb06cee6daee2f94f29fe044902b44de9aa12 + languageName: node + linkType: hard + "@walletconnect/utils@npm:^1.7.3, @walletconnect/utils@npm:^1.7.8": version: 1.7.8 resolution: "@walletconnect/utils@npm:1.7.8" @@ -8029,6 +8435,15 @@ __metadata: languageName: node linkType: hard +"@walletconnect/window-getters@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-getters@npm:1.0.1" + dependencies: + tslib: 1.14.1 + checksum: fae312c4e1be5574d97f071de58e6aa0d0296869761499caf9d4a9a5fd2643458af32233a2120521b00873a599ff88457d405bd82ced5fb5bd6dc3191c07a3e5 + languageName: node + linkType: hard + "@walletconnect/window-metadata@npm:1.0.0": version: 1.0.0 resolution: "@walletconnect/window-metadata@npm:1.0.0" @@ -8038,6 +8453,16 @@ __metadata: languageName: node linkType: hard +"@walletconnect/window-metadata@npm:^1.0.1": + version: 1.0.1 + resolution: "@walletconnect/window-metadata@npm:1.0.1" + dependencies: + "@walletconnect/window-getters": ^1.0.1 + tslib: 1.14.1 + checksum: e82aea7195c6fe95c00e87bb38051c5549838c2e8302da94f1afa48206f79f0b620166c9820f847494505d282d1568e2086a1561b0493d2d0a1fa115f9106aef + languageName: node + linkType: hard + "@webassemblyjs/ast@npm:1.11.1": version: 1.11.1 resolution: "@webassemblyjs/ast@npm:1.11.1" @@ -8860,6 +9285,13 @@ __metadata: languageName: node linkType: hard +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: b95275afb2f80732f22f43a60178430c468906a415a7ff18bcd0feeebc8eec3930b51250aeda91a476062a90e07132b43a1794e8d8ffcf9b650e8139be75fa36 + languageName: node + linkType: hard + "autoprefixer@npm:^10.2.4": version: 10.4.4 resolution: "autoprefixer@npm:10.4.4" @@ -11284,6 +11716,15 @@ __metadata: languageName: node linkType: hard +"cross-fetch@npm:~3.1.5": + version: 3.1.8 + resolution: "cross-fetch@npm:3.1.8" + dependencies: + node-fetch: ^2.6.12 + checksum: 78f993fa099eaaa041122ab037fe9503ecbbcb9daef234d1d2e0b9230a983f64d645d088c464e21a247b825a08dc444a6e7064adfa93536d3a9454b4745b3632 + languageName: node + linkType: hard + "cross-spawn@npm:^5.0.1": version: 5.1.0 resolution: "cross-spawn@npm:5.1.0" @@ -11627,7 +12068,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:~4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -11710,6 +12151,13 @@ __metadata: languageName: node linkType: hard +"decode-uri-component@npm:^0.2.2": + version: 0.2.2 + resolution: "decode-uri-component@npm:0.2.2" + checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 + languageName: node + linkType: hard + "decompress-response@npm:^3.2.0, decompress-response@npm:^3.3.0": version: 3.3.0 resolution: "decompress-response@npm:3.3.0" @@ -11901,6 +12349,13 @@ __metadata: languageName: node linkType: hard +"detect-browser@npm:5.3.0": + version: 5.3.0 + resolution: "detect-browser@npm:5.3.0" + checksum: dd6e08d55da1d9e0f22510ac79872078ae03d9dfa13c5e66c96baedc1c86567345a88f96949161f6be8f3e0fafa93bf179bdb1cd311b14f5f163112fcc70ab49 + languageName: node + linkType: hard + "detect-indent@npm:^5.0.0": version: 5.0.0 resolution: "detect-indent@npm:5.0.0" @@ -12198,6 +12653,18 @@ __metadata: languageName: node linkType: hard +"duplexify@npm:^4.1.2": + version: 4.1.2 + resolution: "duplexify@npm:4.1.2" + dependencies: + end-of-stream: ^1.4.1 + inherits: ^2.0.3 + readable-stream: ^3.1.1 + stream-shift: ^1.0.0 + checksum: 964376c61c0e92f6ed0694b3ba97c84f199413dc40ab8dfdaef80b7a7f4982fcabf796214e28ed614a5bc1ec45488a29b81e7d46fa3f5ddf65bcb118c20145ad + languageName: node + linkType: hard + "easy-stack@npm:1.0.1": version: 1.0.1 resolution: "easy-stack@npm:1.0.1" @@ -12319,7 +12786,7 @@ __metadata: languageName: node linkType: hard -"encoding@npm:^0.1.13": +"encoding@npm:^0.1.13, encoding@npm:~0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: @@ -12328,7 +12795,7 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0": +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": version: 1.4.4 resolution: "end-of-stream@npm:1.4.4" dependencies: @@ -12353,6 +12820,7 @@ __metadata: dependencies: "@commitlint/cli": ^17.7.1 "@commitlint/config-conventional": ^17.7.0 + "@kadena/client": ^1.2.0 "@swc/core": ^1.3.80 concurrently: ^7.6.0 devmoji: ^2.3.0 @@ -13701,6 +14169,13 @@ __metadata: languageName: node linkType: hard +"fast-redact@npm:^3.0.0": + version: 3.3.0 + resolution: "fast-redact@npm:3.3.0" + checksum: 3f7becc70a5a2662a9cbfdc52a4291594f62ae998806ee00315af307f32d9559dbf512146259a22739ee34401950ef47598c1f4777d33b0ed5027203d67f549c + languageName: node + linkType: hard + "fast-safe-stringify@npm:^2.0.6, fast-safe-stringify@npm:^2.0.7": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" @@ -13784,6 +14259,13 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 + languageName: node + linkType: hard + "finalhandler@npm:~1.1.2": version: 1.1.2 resolution: "finalhandler@npm:1.1.2" @@ -16755,6 +17237,13 @@ __metadata: languageName: node linkType: hard +"lodash.isequal@npm:4.5.0": + version: 4.5.0 + resolution: "lodash.isequal@npm:4.5.0" + checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644 + languageName: node + linkType: hard + "lodash.isfunction@npm:^3.0.9": version: 3.0.9 resolution: "lodash.isfunction@npm:3.0.9" @@ -17868,6 +18357,13 @@ __metadata: languageName: node linkType: hard +"multiformats@npm:^9.4.2": + version: 9.9.0 + resolution: "multiformats@npm:9.9.0" + checksum: d3e8c1be400c09a014f557ea02251a2710dbc9fca5aa32cc702ff29f636c5471e17979f30bdcb0a9cbb556f162a8591dc2e1219c24fc21394a56115b820bb84e + languageName: node + linkType: hard + "multihashes@npm:^0.4.15, multihashes@npm:~0.4.15": version: 0.4.21 resolution: "multihashes@npm:0.4.21" @@ -18100,6 +18596,20 @@ __metadata: languageName: node linkType: hard +"node-fetch@npm:~2.6.2": + version: 2.6.13 + resolution: "node-fetch@npm:2.6.13" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 055845ae5b4796c78c7053564745345025cf959563b3568b43c385f67d311779e6b00e5fef6ed1b79f86ba4048e4b4b722e1aa948305521b9353eb7e788912c9 + languageName: node + linkType: hard + "node-forge@npm:^1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -18479,6 +18989,13 @@ __metadata: languageName: node linkType: hard +"on-exit-leak-free@npm:^0.2.0": + version: 0.2.0 + resolution: "on-exit-leak-free@npm:0.2.0" + checksum: d22b0f0538069110626b578db6e68b6ee0e85b1ee9cc5ef9b4de1bba431431d6a8da91a61e09d2ad46f22a96f968e5237833cb9d0b69bc4d294f7ec82f609b05 + languageName: node + linkType: hard + "on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -19148,6 +19665,44 @@ __metadata: languageName: node linkType: hard +"pino-abstract-transport@npm:v0.5.0": + version: 0.5.0 + resolution: "pino-abstract-transport@npm:0.5.0" + dependencies: + duplexify: ^4.1.2 + split2: ^4.0.0 + checksum: c503f867de3189f8217ab9cf794e8a631dddd0029a829f0f985f5511308152ebd53e363764fbc5570b3d1c715b341e3923456ce16ad84cd41be2b9a074ada234 + languageName: node + linkType: hard + +"pino-std-serializers@npm:^4.0.0": + version: 4.0.0 + resolution: "pino-std-serializers@npm:4.0.0" + checksum: 89d487729b58c9d3273a0ee851ead068d6d2e2ccc1af8e1c1d28f1b3442423679bec7ec04d9a2aba36f94f335e82be9f4de19dc4fbc161e71c136aaa15b85ad3 + languageName: node + linkType: hard + +"pino@npm:7.11.0": + version: 7.11.0 + resolution: "pino@npm:7.11.0" + dependencies: + atomic-sleep: ^1.0.0 + fast-redact: ^3.0.0 + on-exit-leak-free: ^0.2.0 + pino-abstract-transport: v0.5.0 + pino-std-serializers: ^4.0.0 + process-warning: ^1.0.0 + quick-format-unescaped: ^4.0.3 + real-require: ^0.1.0 + safe-stable-stringify: ^2.1.0 + sonic-boom: ^2.2.1 + thread-stream: ^0.15.1 + bin: + pino: bin.js + checksum: b919e7dbe41de978bb050dcef94fd687c012eb78d344a18f75f04ce180d5810fc162be1f136722d70cd005ed05832c4023a38b9acbc1076ae63c9f5ec5ca515c + languageName: node + linkType: hard + "pirates@npm:^4.0.1": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -19686,6 +20241,13 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: c708a03241deec3cabaeee39c4f9ee8c4d71f1c5ef9b746c8252cdb952a6059068cfcdaf348399775244cbc441b6ae5e26a9c87ed371f88335d84f26d19180f9 + languageName: node + linkType: hard + "process@npm:^0.11.10, process@npm:~0.11.0": version: 0.11.10 resolution: "process@npm:0.11.10" @@ -20008,6 +20570,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: ^0.2.2 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 91af02dcd9cc9227a052841d5c2eecb80a0d6489d05625df506a097ef1c59037cfb5e907f39b84643cbfd535c955abec3e553d0130a7b510120c37d06e0f4346 + languageName: node + linkType: hard + "query-string@npm:^5.0.1": version: 5.1.1 resolution: "query-string@npm:5.1.1" @@ -20040,6 +20614,13 @@ __metadata: languageName: node linkType: hard +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 7bc32b99354a1aa46c089d2a82b63489961002bb1d654cee3e6d2d8778197b68c2d854fd23d8422436ee1fdfd0abaddc4d4da120afe700ade68bd357815b26fd + languageName: node + linkType: hard + "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -20249,6 +20830,17 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^3.1.1": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: ^2.0.3 + string_decoder: ^1.1.1 + util-deprecate: ^1.0.1 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -20265,6 +20857,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.1.0": + version: 0.1.0 + resolution: "real-require@npm:0.1.0" + checksum: 96745583ed4f82cd5c6a6af012fd1d3c6fc2f13ae1bcff1a3c4f8094696013a1a07c82c5aa66a403d7d4f84949fc2203bc927c7ad120caad125941ca2d7e5e8e + languageName: node + linkType: hard + "reconnecting-websocket@npm:^4.4.0": version: 4.4.0 resolution: "reconnecting-websocket@npm:4.4.0" @@ -20903,6 +21502,13 @@ __metadata: languageName: node linkType: hard +"safe-json-utils@npm:^1.1.1": + version: 1.1.1 + resolution: "safe-json-utils@npm:1.1.1" + checksum: f82a5833b7f6f25583c46520b3e158da3864d4f6f85b7cd68ec956ae7023395872e834d75f7f6216c109c546d10b6ee15c066d849f75ac2a7b86b8a041b4f01f + languageName: node + linkType: hard + "safe-regex-test@npm:^1.0.0": version: 1.0.0 resolution: "safe-regex-test@npm:1.0.0" @@ -20923,6 +21529,13 @@ __metadata: languageName: node linkType: hard +"safe-stable-stringify@npm:^2.1.0": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 3aeb64449706ee1f5ad2459fc99648b131d48e7a1fbb608d7c628020177512dc9d94108a5cb61bbc953985d313d0afea6566d243237743e02870490afef04b43 + languageName: node + linkType: hard + "safe-stable-stringify@npm:^2.3.1": version: 2.3.1 resolution: "safe-stable-stringify@npm:2.3.1" @@ -21534,6 +22147,15 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^2.2.1": + version: 2.8.0 + resolution: "sonic-boom@npm:2.8.0" + dependencies: + atomic-sleep: ^1.0.0 + checksum: c7f9c89f931d7f60f8e0741551a729f0d81e6dc407a99420fc847a9a4c25af048a615b1188ab3c4f1fb3708fe4904973ddab6ebcc8ed5b78b50ab81a99045910 + languageName: node + linkType: hard + "sortablejs@npm:1.14.0": version: 1.14.0 resolution: "sortablejs@npm:1.14.0" @@ -21679,6 +22301,13 @@ __metadata: languageName: node linkType: hard +"split2@npm:^4.0.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 05d54102546549fe4d2455900699056580cca006c0275c334611420f854da30ac999230857a85fdd9914dc2109ae50f80fda43d2a445f2aa86eccdc1dfce779d + languageName: node + linkType: hard + "split@npm:0.3": version: 0.3.3 resolution: "split@npm:0.3.3" @@ -21891,6 +22520,13 @@ __metadata: languageName: node linkType: hard +"stream-shift@npm:^1.0.0": + version: 1.0.1 + resolution: "stream-shift@npm:1.0.1" + checksum: 59b82b44b29ec3699b5519a49b3cedcc6db58c72fb40c04e005525dfdcab1c75c4e0c180b923c380f204bed78211b9bad8faecc7b93dece4d004c3f6ec75737b + languageName: node + linkType: hard + "stream-splicer@npm:^2.0.0": version: 2.0.1 resolution: "stream-splicer@npm:2.0.1" @@ -22470,6 +23106,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^0.15.1": + version: 0.15.2 + resolution: "thread-stream@npm:0.15.2" + dependencies: + real-require: ^0.1.0 + checksum: 0547795a8f357ba1ac0dba29c71f965182e29e21752951a04a7167515ee37524bfba6c410f31e65a01a8d3e5b93400b812889aa09523e38ce4d744c894ffa6c0 + languageName: node + linkType: hard + "through2@npm:^2.0.0": version: 2.0.5 resolution: "through2@npm:2.0.5" @@ -22841,6 +23486,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:1.14.1, tslib@npm:^1.10.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + languageName: node + linkType: hard + "tslib@npm:2.1.0": version: 2.1.0 resolution: "tslib@npm:2.1.0" @@ -22855,13 +23507,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.10.0, tslib@npm:^1.8.1, tslib@npm:^1.9.0": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd - languageName: node - linkType: hard - "tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.5.3, tslib@npm:^2.6.1, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -23202,6 +23847,15 @@ __metadata: languageName: node linkType: hard +"uint8arrays@npm:^3.0.0, uint8arrays@npm:^3.1.0": + version: 3.1.1 + resolution: "uint8arrays@npm:3.1.1" + dependencies: + multiformats: ^9.4.2 + checksum: b93b6c3f0a526b116799f3a3409bd4b5d5553eb3e73e485998ece7974742254fbc0d2f7988dd21ac86c4b974552f45d9ae9cf9cba9647e529f8eb1fdd2ed84d0 + languageName: node + linkType: hard + "ultra-runner@npm:^3.10.5": version: 3.10.5 resolution: "ultra-runner@npm:3.10.5" @@ -25144,7 +25798,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:7.5.9, ws@npm:^7, ws@npm:^7.2.0, ws@npm:^7.3.1, ws@npm:^7.4.5": +"ws@npm:7.5.9, ws@npm:^7, ws@npm:^7.2.0, ws@npm:^7.3.1, ws@npm:^7.4.5, ws@npm:^7.5.1": version: 7.5.9 resolution: "ws@npm:7.5.9" peerDependencies: @@ -25342,6 +25996,13 @@ __metadata: languageName: node linkType: hard +"yaml@npm:~2.1.1": + version: 2.1.3 + resolution: "yaml@npm:2.1.3" + checksum: 91316062324a93f9cb547469092392e7d004ff8f70c40fecb420f042a4870b2181557350da56c92f07bd44b8f7a252b0be26e6ade1f548e1f4351bdd01c9d3c7 + languageName: node + linkType: hard + "yamljs@npm:^0.3.0": version: 0.3.0 resolution: "yamljs@npm:0.3.0" From b309c8de7c18ca44de1f0c90d91f8a53a5c1ef4f Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Wed, 13 Sep 2023 19:06:07 -0300 Subject: [PATCH 015/375] Sign and verify implementation --- packages/signers/kadena/src/index.ts | 21 ++++++--- .../signers/kadena/tests/generate.test.ts | 5 +++ packages/signers/kadena/tests/sign.test.ts | 44 +++++++++++++++++++ 3 files changed, 63 insertions(+), 7 deletions(-) create mode 100644 packages/signers/kadena/tests/sign.test.ts diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index 495a550fc..4524a0bff 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -1,7 +1,5 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; - -// eslint-disable-next-line import/extensions -import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto.js"; +import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto"; class Signer implements SignerInterface { async generate(mnemonic: string, derivationPath = ""): Promise { @@ -21,13 +19,16 @@ class Signer implements SignerInterface { sig: string, publicKey: string ): Promise { - console.log(msgHash, sig, publicKey); - return true; + const xpub = this.hexToBuffer(publicKey); + const xsig = this.hexToBuffer(sig); + + return kadenaCrypto.kadenaVerify(msgHash, xpub, xsig); } async sign(msgHash: string, keyPair: KeyPair): Promise { - console.log(msgHash, keyPair); - return ""; + const xprv = this.hexToBuffer(keyPair.privateKey); + + return this.bufferToHex(kadenaCrypto.kadenaSign("", msgHash, xprv)); } bufferToHex(buffer: Iterable): string { @@ -35,6 +36,12 @@ class Signer implements SignerInterface { .map(b => b.toString(16).padStart(2, "0")) .join(""); } + + hexToBuffer(hex: string): Uint8Array { + return new Uint8Array( + hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) + ); + } } export default Signer; diff --git a/packages/signers/kadena/tests/generate.test.ts b/packages/signers/kadena/tests/generate.test.ts index 87943ee12..77b894cd9 100644 --- a/packages/signers/kadena/tests/generate.test.ts +++ b/packages/signers/kadena/tests/generate.test.ts @@ -9,23 +9,28 @@ describe("Kadena address generate", () => { "clip coffee brain token leader kiss around main finger network avoid west"; it("should generate Kadena addresses correctly", async () => { + // Arrange const kadenaSigner = new Signer(); + // Act & Assert let keypair = await kadenaSigner.generate(MNEMONIC, "0"); expect(keypair.address).equals( "57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f" ); + // Act & Assert keypair = await kadenaSigner.generate(MNEMONIC, "1"); expect(keypair.address).equals( "3c77941d21857bd26683154a5efc5c15169f27698fc56906bcf49b4c05e1006b" ); + // Act & Assert keypair = await kadenaSigner.generate(MNEMONIC, "2"); expect(keypair.address).equals( "f8dc5d97bc43155b033f813833bcda9ef374b060689648b4c0226f5a1456935a" ); + // Act & Assert keypair = await kadenaSigner.generate(MNEMONIC, "3"); expect(keypair.address).equals( "df3125da8789dc114be0c953040333e9a1a9afb31e1170ade42be52a6701842e" diff --git a/packages/signers/kadena/tests/sign.test.ts b/packages/signers/kadena/tests/sign.test.ts new file mode 100644 index 000000000..d79a1d68e --- /dev/null +++ b/packages/signers/kadena/tests/sign.test.ts @@ -0,0 +1,44 @@ +import { expect } from "chai"; +import { blake2b } from "cardano-crypto-kadena.js/features/crypto-primitives"; + +import Signer from "../src"; + +function bufferToHex(buffer: Iterable): string { + return Array.from(new Uint8Array(buffer)) + .map(b => b.toString(16).padStart(2, "0")) + .join(""); +} + +describe("Kadena signing", () => { + const MNEMONIC = + "clip coffee brain token leader kiss around main finger network avoid west"; + + const msg = "Everything should be made as simple as possible, but not simpler."; + const signature = "5ca1f34b074c8cffbd2127facdde210158cc48885cf3637aa0cb6c6809741ae8631cecec601c804ad8764761380fff02d3ab329f33b23d09f611a2ca8736e306"; + + it("it should sign correctly", async () => { + // Arrange + const kadenaSigner = new Signer(); + const keypair = await kadenaSigner.generate(MNEMONIC, "0"); + const msgHash = bufferToHex(blake2b(Buffer.from(msg), 32)); + + // Act + const signResult = await kadenaSigner.sign(msgHash, keypair); + + // Assert + expect(signResult).equals(signature); + }); + + it("it should verify correctly", async () => { + // Arrange + const kadenaSigner = new Signer(); + const keypair = await kadenaSigner.generate(MNEMONIC, "0"); + const msgHash = bufferToHex(blake2b(Buffer.from(msg), 32)); + + // Act + const signResult = await kadenaSigner.verify(msgHash, signature, keypair.publicKey); + + // Assert + expect(signResult).equals(true); + }); +}); From f975bc5c5307e8a9f778b6b102d3ae0bb71decc4 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Thu, 14 Sep 2023 10:26:46 -0300 Subject: [PATCH 016/375] Using kadena crypto utils to sign and verify --- packages/signers/kadena/package.json | 1 + packages/signers/kadena/src/index.ts | 33 +++++++++++++++++----- packages/signers/kadena/tests/sign.test.ts | 14 +++++---- yarn.lock | 3 +- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/packages/signers/kadena/package.json b/packages/signers/kadena/package.json index cadea618e..90aa2dc8c 100644 --- a/packages/signers/kadena/package.json +++ b/packages/signers/kadena/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "@enkryptcom/utils": "workspace:^", + "@kadena/cryptography-utils": "^0.3.8", "cardano-crypto-kadena.js": "^6.0.1", "chai": "^4.3.8" }, diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index f81458a02..da4d554ca 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -1,7 +1,6 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto"; - -// const Pact = require("pact-lang-api"); +import { base64UrlDecodeArr, hexToBin, sign, signHash, verifySig } from "@kadena/cryptography-utils"; class Signer implements SignerInterface { async generate(mnemonic: string, derivationPath = ""): Promise { @@ -21,16 +20,36 @@ class Signer implements SignerInterface { sig: string, publicKey: string ): Promise { - const xpub = this.hexToBuffer(publicKey); - const xsig = this.hexToBuffer(sig); + console.log('msgHash', msgHash); + console.log('sig', sig); + console.log('publicKey', publicKey); - return kadenaCrypto.kadenaVerify(msgHash, xpub, xsig); + const signCmd = { + hash: 'YbdNz31xZBhW6LaaXCmltf0WQdVSwDPw_LJWcTgwevA', + sig: '224a9a0624e1b22a3e34d8040850efb595e924c22f72c07a700a175a025c3bdd0a6a46cbc8f52cdc76fe01cdf2f92835ae255383e753115e8a3ba29dd0e80407', + pubKey: '57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f', + }; + + return verifySig( + base64UrlDecodeArr(signCmd.hash), + hexToBin(signCmd.sig), + hexToBin(signCmd.pubKey), + ); + + // return verifySig( + // base64UrlDecodeArr(msgHash), + // hexToBin(sig), + // hexToBin(publicKey), + // ); } async sign(msgHash: string, keyPair: KeyPair): Promise { - const xprv = this.hexToBuffer(keyPair.privateKey); + const signResult = signHash(msgHash, { + secretKey: keyPair.privateKey.slice(0, 128), // 256 + publicKey: keyPair.publicKey, + }); - return this.bufferToHex(kadenaCrypto.kadenaSign("", msgHash, xprv)); + return signResult.sig; } bufferToHex(buffer: Iterable): string { diff --git a/packages/signers/kadena/tests/sign.test.ts b/packages/signers/kadena/tests/sign.test.ts index d79a1d68e..32721514f 100644 --- a/packages/signers/kadena/tests/sign.test.ts +++ b/packages/signers/kadena/tests/sign.test.ts @@ -1,5 +1,6 @@ import { expect } from "chai"; import { blake2b } from "cardano-crypto-kadena.js/features/crypto-primitives"; +import { hash } from "@kadena/cryptography-utils"; import Signer from "../src"; @@ -13,14 +14,15 @@ describe("Kadena signing", () => { const MNEMONIC = "clip coffee brain token leader kiss around main finger network avoid west"; - const msg = "Everything should be made as simple as possible, but not simpler."; - const signature = "5ca1f34b074c8cffbd2127facdde210158cc48885cf3637aa0cb6c6809741ae8631cecec601c804ad8764761380fff02d3ab329f33b23d09f611a2ca8736e306"; + // const msg = "Everything should be made as simple as possible, but not simpler."; + const msg = "{\"signers\":[{\"pubKey\":\"57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f\",\"clist\":[{\"name\":\"coin.TRANSFER\",\"args\":[\"57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f\",\"gjpeixer\",1.0e-3]},{\"name\":\"coin.GAS\",\"args\":[]}]}],\"meta\":{\"creationTime\":1694695327,\"ttl\":28800,\"chainId\":\"1\",\"gasPrice\":1.0e-6,\"gasLimit\":2320,\"sender\":\"57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f\"},\"nonce\":\"chainweaver\",\"networkId\":\"testnet04\",\"payload\":{\"exec\":{\"code\":\"(coin.transfer \\\"57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f\\\" \\\"gjpeixer\\\" 0.001)\",\"data\":null}}}"; + const signature = "9c911a113d6acb8847501ab005a7e2d674cfe3eed9df80eaba12645eccf8a54ffbaa58657fd45ce01fe47b5795aaca53c85fb503db1036aa01440e5cd6c26b06"; it("it should sign correctly", async () => { // Arrange const kadenaSigner = new Signer(); const keypair = await kadenaSigner.generate(MNEMONIC, "0"); - const msgHash = bufferToHex(blake2b(Buffer.from(msg), 32)); + const msgHash = hash(msg); // Act const signResult = await kadenaSigner.sign(msgHash, keypair); @@ -33,12 +35,12 @@ describe("Kadena signing", () => { // Arrange const kadenaSigner = new Signer(); const keypair = await kadenaSigner.generate(MNEMONIC, "0"); - const msgHash = bufferToHex(blake2b(Buffer.from(msg), 32)); + const msgHash = hash(msg); // Act - const signResult = await kadenaSigner.verify(msgHash, signature, keypair.publicKey); + const verifyResult = await kadenaSigner.verify(msgHash, signature, keypair.publicKey); // Assert - expect(signResult).equals(true); + expect(verifyResult).equals(true); }); }); diff --git a/yarn.lock b/yarn.lock index 6410c5f3c..4424b05e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2601,6 +2601,7 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" + "@kadena/cryptography-utils": ^0.3.8 "@types/chai": ^4.3.5 "@types/hdkey": ^2.0.1 "@types/mocha": ^10.0.1 @@ -3800,7 +3801,7 @@ __metadata: languageName: node linkType: hard -"@kadena/cryptography-utils@npm:0.3.8": +"@kadena/cryptography-utils@npm:0.3.8, @kadena/cryptography-utils@npm:^0.3.8": version: 0.3.8 resolution: "@kadena/cryptography-utils@npm:0.3.8" dependencies: From 23ea21fe92ccc3f6b286b244d6fdd242947a49c9 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Mon, 18 Sep 2023 11:25:27 -0300 Subject: [PATCH 017/375] Fix activities tab; Removing coingecko for Kadena testnet --- .../src/providers/kadena/networks/kadena-testnet.ts | 2 -- .../components/network-activity-transaction.vue | 10 ++++++++-- packages/signers/kadena/src/index.ts | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/extension/src/providers/kadena/networks/kadena-testnet.ts b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts index 65c688d8d..85e9f9c36 100644 --- a/packages/extension/src/providers/kadena/networks/kadena-testnet.ts +++ b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts @@ -21,8 +21,6 @@ const kadenaOptions: KadenaNetworkOptions = { networkId: "testnet04", chainId: "1", }, - coingeckoID: "kadena", - coingeckoPlatform: CoingeckoPlatform.Kadena, activityHandler: wrapActivityHandler(kadenaScanActivity), }; diff --git a/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue b/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue index e1491d7d0..f176db6ac 100644 --- a/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue +++ b/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue @@ -46,7 +46,10 @@

{{ $filters.formatFloatingPointValue( - fromBase(activity.value, activity.token.decimals) + fromBase( + parseInt(activity.value).toString(), + activity.token.decimals + ) ).value }} {{ activity.token.symbol }} @@ -135,7 +138,10 @@ const transactionURL = computed(() => { }); const getFiatValue = computed(() => { return new BigNumber(props.activity.token.price || "0").times( - fromBase(props.activity.value, props.activity.token.decimals) + fromBase( + parseInt(props.activity.value).toString(), + props.activity.token.decimals + ) ); }); onMounted(() => { diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index da4d554ca..5394ae741 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -1,6 +1,6 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto"; -import { base64UrlDecodeArr, hexToBin, sign, signHash, verifySig } from "@kadena/cryptography-utils"; +import { base64UrlDecodeArr, hexToBin, signHash, verifySig } from "@kadena/cryptography-utils"; class Signer implements SignerInterface { async generate(mnemonic: string, derivationPath = ""): Promise { From 882c2dead83493a92b51b4481ba57491be9b1adf Mon Sep 17 00:00:00 2001 From: Glaicon Date: Mon, 18 Sep 2023 10:35:48 -0400 Subject: [PATCH 018/375] WIP - Update send and verify page --- packages/extension/package.json | 1 + .../kadena/ui/send-transaction/index.vue | 92 ++++----- .../verify-transaction/index.vue | 191 +++++++----------- packages/signers/kadena/src/index.ts | 67 +++--- yarn.lock | 2 + 5 files changed, 157 insertions(+), 196 deletions(-) diff --git a/packages/extension/package.json b/packages/extension/package.json index f2be0af37..9c8f348bc 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -29,6 +29,7 @@ "@enkryptcom/utils": "workspace:^", "@ethereumjs/common": "^3.2.0", "@ethereumjs/tx": "^4.2.0", + "@kadena/client": "^1.2.0", "@ledgerhq/hw-transport-webusb": "^6.27.19", "@metamask/eth-sig-util": "^6.0.0", "@types/chrome": "^0.0.244", diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index b9703b13c..325108899 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -166,36 +166,37 @@ const selected: string = route.params.id as string; const isLoadingAssets = ref(true); const edWarn = computed(() => { - if (!fee.value) { - return undefined; - } + return true; + // if (!fee.value) { + // return undefined; + // } - if (!amount.value) { - return false; - } + // if (!amount.value) { + // return false; + // } - if (!isValidDecimals(amount.value ?? "0", selectedAsset.value.decimals!)) { - return false; - } + // if (!isValidDecimals(amount.value ?? "0", selectedAsset.value.decimals!)) { + // return false; + // } - const rawAmount = toBN( - toBase(amount.value.toString(), selectedAsset.value.decimals ?? 0) - ); - const ed = selectedAsset.value.existentialDeposit ?? toBN(0); - const userBalance = toBN(selectedAsset.value.balance ?? 0); + // const rawAmount = toBN( + // toBase(amount.value.toString(), selectedAsset.value.decimals ?? 0) + // ); + // const ed = selectedAsset.value.existentialDeposit ?? toBN(0); + // const userBalance = toBN(selectedAsset.value.balance ?? 0); - if (!sendMax.value && userBalance.sub(rawAmount).lte(ed)) { - return true; - } + // if (!sendMax.value && userBalance.sub(rawAmount).lte(ed)) { + // return true; + // } - const txFee = toBN( - toBase(fee.value.nativeValue, selectedAsset.value.decimals!) - ); - if (!sendMax.value && userBalance.sub(txFee).sub(rawAmount).lt(ed)) { - return true; - } else { - return false; - } + // const txFee = toBN( + // toBase(fee.value.nativeValue, selectedAsset.value.decimals!) + // ); + // if (!sendMax.value && userBalance.sub(txFee).sub(rawAmount).lt(ed)) { + // return true; + // } else { + // return false; + // } }); const isAddress = computed(() => { @@ -369,6 +370,7 @@ const selectToken = (token: KDAToken | Partial) => { }; const inputAmount = (number: string | undefined) => { + debugger; sendMax.value = false; amount.value = number ? (parseFloat(number) < 0 ? "0" : number) : number; validateFields(); @@ -403,32 +405,31 @@ const setSendMax = (max: boolean) => { }; const isDisabled = computed(() => { - return false; - // let isDisabled = true; + let isDisabled = true; - // let addressIsValid = false; + let addressIsValid = false; - // try { - // props.network.displayAddress(addressTo.value); - // addressIsValid = true; - // } catch { - // addressIsValid = false; - // } + try { + props.network.displayAddress(addressTo.value); + addressIsValid = true; + } catch { + addressIsValid = false; + } - // if ( - // amount.value !== undefined && - // amount.value !== "" && - // hasEnough.value && - // addressIsValid && - // !edWarn.value && - // edWarn.value !== undefined - // ) - // isDisabled = false; - // return isDisabled; + if ( + amount.value !== undefined && + amount.value !== "" && + hasEnough.value && + addressIsValid && + !edWarn.value && + edWarn.value !== undefined + ) + isDisabled = false; + return isDisabled; }); const sendAction = async () => { - const sendAmount = toBase(amount.value!, selectedAsset.value.decimals!); + // const sendAmount = toBase(amount.value!, selectedAsset.value.decimals!); // const sendOptions: SendOptions | undefined = sendMax.value // ? { type: "all" } @@ -443,6 +444,7 @@ const sendAction = async () => { // sendAmount, // sendOptions // ); + debugger; const keyring = new PublicKeyRing(); const fromAccount = await keyring.getAccount(addressFrom.value); const txVerifyInfo: VerifyTransactionParams = { diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue index 00b13171f..079bcc3fe 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue @@ -92,7 +92,16 @@ import { TransactionSigner } from "../../libs/signer"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; import { BaseNetwork } from "@/types/base-network"; -import { IUnsignedCommand, Pact, createClient } from "@kadena/client"; +import { + IUnsignedCommand, + Pact, + createClient, + addSignatures, + ICommand, +} from "@kadena/client"; +import ActivityState from "@/libs/activity-state"; +import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; +import { u8aToHex } from "@polkadot/util"; const isSendDone = ref(false); const account = ref(); @@ -128,51 +137,32 @@ const sendAction = async () => { isProcessing.value = true; const modules = Pact.modules as any; debugger; - const unsignedTransaction: IUnsignedCommand = Pact.builder + + const unsignedTransaction = Pact.builder .execution( modules.coin.transfer(txData.fromAddress, txData.toAddress, { decimal: txData.TransactionData.value, }) ) - .addSigner(txData.fromAddress, (withCapability: any) => [ - withCapability("coin.GAS"), - withCapability("coin.TRANSFER", txData.fromAddress, txData.toAddress, { + .addData("ks", { + keys: [txData.toAddress], + pred: "keys-all", + }) + .addSigner(txData.fromAddress, (withCap: any) => [ + withCap("coin.TRANSFER", txData.fromAddress, txData.toAddress, { decimal: txData.TransactionData.value, }), + withCap("coin.GAS"), ]) - .setMeta({ chainId: "1" }) + .setMeta({ chainId: "1", senderAccount: txData.fromAddress }) .setNetworkId("testnet04") .createTransaction(); - // const unsignedTransaction = modules.coin - // .transfer( - // txData.fromAddress, - // txData.toAddress, - // txData.TransactionData.value - // ) - // // .addSigner("public_key", (withCapability: any) => [ - // // withCapability("coin.GAS"), - // // withCapability("coin.TRANSFER", txData.fromAddress, txData.toAddress, { - // // decimal: txData.TransactionData.value, - // // }), - // // ]) - // // .addCap("coin.GAS", txData.fromAddress) - // // .addCap( - // // "coin.TRANSFER", - // // txData.fromAddress, - // // txData.fromAddress, - // // txData.toAddress, - // // txData.TransactionData.value - // // ) - // .setMeta({ sender: txData.fromAddress }, "testnet04") - // .createTransaction(); - debugger; const transaction = await TransactionSigner({ account: account.value!, network: network.value, - payload: unsignedTransaction.hash, + payload: unsignedTransaction.cmd, }).then((res) => { - debugger; if (res.error) return Promise.reject(res.error); else return { @@ -180,25 +170,21 @@ const sendAction = async () => { signature: res.result as string, }; }); - debugger; + + const signedTranscation: IUnsignedCommand | ICommand = addSignatures( + unsignedTransaction, + { + sig: transaction.signature, + pubKey: txData.fromAddress, + } + ); const client = createClient( "https://api.testnet.chainweb.com/chainweb/0.0/testnet04/chain/1/pact" ); - // const teste: any = JSON.parse(unsignedTransaction.cmd); - // teste.sigs = { - // pubKey: txData.fromAddress, - // sig: transaction.signature, - // }; - // unsignedTransaction.cmd.sigs = { - - // } - // check if all necessary signatures are added - const transactionDescriptor = await client.submit({ - cmd: unsignedTransaction.cmd, - hash: unsignedTransaction.hash, - sigs: [{ sig: transaction.signature }], - }); + const transactionDescriptor = await client.submit( + signedTranscation as ICommand + ); const response = await client.listen(transactionDescriptor); if (response.result.status === "failure") { throw response.result.error; @@ -206,82 +192,43 @@ const sendAction = async () => { console.log(response.result); } - // const api = await network.value.api(); - - // const tx = (api.api as ApiPromise).tx(txData.TransactionData.data); - - // try { - // const signedTx = await tx.signAsync(account.value!.address, { - // signer: { - // signPayload: (signPayload): Promise => { - // const registry = new TypeRegistry(); - // registry.setSignedExtensions(signPayload.signedExtensions); - // const extType = registry.createType("ExtrinsicPayload", signPayload, { - // version: signPayload.version, - // }); - // return TransactionSigner({ - // account: account.value!, - // network: network.value, - // payload: extType, - // }).then((res) => { - // if (res.error) return Promise.reject(res.error); - // else - // return { - // id: 0, - // signature: JSON.parse(res.result as string), - // }; - // }); - // }, - // }, - // }); - // const txActivity: Activity = { - // from: txData.fromAddress, - // to: txData.toAddress, - // isIncoming: txData.fromAddress === txData.toAddress, - // network: network.value.name, - // status: ActivityStatus.pending, - // timestamp: new Date().getTime(), - // token: { - // decimals: txData.toToken.decimals, - // icon: txData.toToken.icon, - // name: txData.toToken.name, - // symbol: txData.toToken.symbol, - // price: txData.toToken.price, - // }, - // type: ActivityType.transaction, - // value: txData.toToken.amount, - // transactionHash: "", - // }; - // const activityState = new ActivityState(); - // signedTx - // .send() - // .then(async (hash) => { - // txActivity.transactionHash = u8aToHex(hash); - // await activityState.addActivities([txActivity], { - // address: network.value.displayAddress(txData.fromAddress), - // network: network.value.name, - // }); - // }) - // .catch(() => { - // txActivity.status = ActivityStatus.failed; - // activityState.addActivities([txActivity], { - // address: network.value.displayAddress(txData.fromAddress), - // network: network.value.name, - // }); - // }); - - // isSendDone.value = true; - // if (getCurrentContext() === "popup") { - // setTimeout(() => { - // isProcessing.value = false; - // router.go(-2); - // }, 2500); - // } else { - // setTimeout(() => { - // isProcessing.value = false; - // window.close(); - // }, 1500); - // } + const txActivity: Activity = { + from: txData.fromAddress, + to: txData.toAddress, + isIncoming: txData.fromAddress === txData.toAddress, + network: network.value.name, + status: ActivityStatus.pending, + timestamp: new Date().getTime(), + token: { + decimals: txData.toToken.decimals, + icon: txData.toToken.icon, + name: txData.toToken.name, + symbol: txData.toToken.symbol, + price: txData.toToken.price, + }, + type: ActivityType.transaction, + value: txData.toToken.amount, + transactionHash: "", + }; + const activityState = new ActivityState(); + + txActivity.transactionHash = transactionDescriptor.requestKey; + await activityState.addActivities([txActivity], { + address: network.value.displayAddress(txData.fromAddress), + network: network.value.name, + }); + isSendDone.value = true; + if (getCurrentContext() === "popup") { + setTimeout(() => { + isProcessing.value = false; + router.go(-2); + }, 2500); + } else { + setTimeout(() => { + isProcessing.value = false; + window.close(); + }, 1500); + } // } catch (error: any) { // isProcessing.value = false; // console.error("error", error); diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index da4d554ca..2c01b94d5 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -1,17 +1,35 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; -import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto"; -import { base64UrlDecodeArr, hexToBin, sign, signHash, verifySig } from "@kadena/cryptography-utils"; +import { + base64UrlDecodeArr, + hexToBin, + sign, + verifySig, +} from "@kadena/cryptography-utils"; class Signer implements SignerInterface { async generate(mnemonic: string, derivationPath = ""): Promise { - const root = kadenaCrypto.kadenaMnemonicToRootKeypair("", mnemonic.trim()); - const hardIndex = 0x80000000 + Number(derivationPath); - const privPubKey = kadenaCrypto.kadenaGenKeypair("", root, hardIndex); + // eslint-disable-next-line no-debugger + debugger; + console.log("mnemonic", mnemonic); + console.log("derivationPath", derivationPath); + + // if (keyPair) { + // return keyPair; + // } + // const genKeyPairVar = genKeyPair(); + // keyPair = { + // address: genKeyPairVar.publicKey, + // privateKey: genKeyPairVar.secretKey, + // publicKey: genKeyPairVar.publicKey, + // }; return { - address: this.bufferToHex(privPubKey[1]), - privateKey: this.bufferToHex(privPubKey[0]), - publicKey: this.bufferToHex(privPubKey[1]), + address: + "cb40739853e741e1d9cbe4b72573bbe534d0a8e5df40e90133f9678d266f2e67", + privateKey: + "b43d2182bb697f3c99ec6b6fc04d2dd4414951daf2a5a6e010c9c66f06013a39", + publicKey: + "cb40739853e741e1d9cbe4b72573bbe534d0a8e5df40e90133f9678d266f2e67", }; } @@ -20,32 +38,23 @@ class Signer implements SignerInterface { sig: string, publicKey: string ): Promise { - console.log('msgHash', msgHash); - console.log('sig', sig); - console.log('publicKey', publicKey); + console.log("msgHash", msgHash); + console.log("sig", sig); + console.log("publicKey", publicKey); - const signCmd = { - hash: 'YbdNz31xZBhW6LaaXCmltf0WQdVSwDPw_LJWcTgwevA', - sig: '224a9a0624e1b22a3e34d8040850efb595e924c22f72c07a700a175a025c3bdd0a6a46cbc8f52cdc76fe01cdf2f92835ae255383e753115e8a3ba29dd0e80407', - pubKey: '57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f', - }; - return verifySig( - base64UrlDecodeArr(signCmd.hash), - hexToBin(signCmd.sig), - hexToBin(signCmd.pubKey), + base64UrlDecodeArr(msgHash), + hexToBin(sig), + hexToBin(publicKey) ); - - // return verifySig( - // base64UrlDecodeArr(msgHash), - // hexToBin(sig), - // hexToBin(publicKey), - // ); } async sign(msgHash: string, keyPair: KeyPair): Promise { - const signResult = signHash(msgHash, { - secretKey: keyPair.privateKey.slice(0, 128), // 256 + // eslint-disable-next-line no-debugger + debugger; + const signResult = sign(msgHash, { + secretKey: keyPair.privateKey, + // secretKey: keyPair.privateKey.slice(0, 64), publicKey: keyPair.publicKey, }); @@ -60,7 +69,7 @@ class Signer implements SignerInterface { hexToBuffer(hex: string): Uint8Array { return new Uint8Array( - hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) + hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16)) ); } } diff --git a/yarn.lock b/yarn.lock index 4424b05e6..4297cbeff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2286,6 +2286,7 @@ __metadata: "@enkryptcom/utils": "workspace:^" "@ethereumjs/common": ^3.2.0 "@ethereumjs/tx": ^4.2.0 + "@kadena/client": ^1.2.0 "@ledgerhq/hw-transport-webusb": ^6.27.19 "@metamask/eth-sig-util": ^6.0.0 "@polkadot/api": ^10.9.1 @@ -2601,6 +2602,7 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" + "@kadena/client": ^1.2.0 "@kadena/cryptography-utils": ^0.3.8 "@types/chai": ^4.3.5 "@types/hdkey": ^2.0.1 From 474e63ebeff7e0cdb85c295f3a6c558a858ecac0 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Mon, 18 Sep 2023 13:42:43 -0400 Subject: [PATCH 019/375] WIP - Update send page token --- .../extension/src/providers/kadena/index.ts | 1 - .../providers/kadena/types/kadena-network.ts | 4 +- .../src/providers/kadena/types/kda-token.ts | 116 +++++++++-- .../kadena/ui/send-transaction/index.vue | 188 ++++++++---------- 4 files changed, 177 insertions(+), 132 deletions(-) diff --git a/packages/extension/src/providers/kadena/index.ts b/packages/extension/src/providers/kadena/index.ts index 6c2bc7e53..bbfe2133d 100644 --- a/packages/extension/src/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/index.ts @@ -68,7 +68,6 @@ class KadenaProvider } getUIPath(page: string): string { - debugger; return GetUIPath(page, this.namespace); } } diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index 1da033ca5..ef0ab9878 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -15,7 +15,7 @@ import { } from "@/libs/utils/number-formatter"; import { fromBase } from "@enkryptcom/utils"; import BigNumber from "bignumber.js"; -import { KDAToken } from "./kda-token"; +import { KDABaseToken, KDAToken } from "./kda-token"; import { KadenaApiOptions } from "."; export interface KadenaNetworkOptions { @@ -67,7 +67,7 @@ export class KadenaNetwork extends BaseNetwork { this.activityHandler = options.activityHandler; } - public async getAllTokens(pubkey: string): Promise { + public async getAllTokens(pubkey: string): Promise { const assets = await this.getAllTokenInfo(pubkey); return assets.map((token) => { diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index c9a35f9d9..a4a263249 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -1,12 +1,27 @@ -import { - BaseToken, - BaseTokenOptions, - SendOptions, - TransferType, -} from "@/types/base-token"; +import { BaseToken, BaseTokenOptions, SendOptions } from "@/types/base-token"; import KadenaAPI from "@/providers/kadena/libs/api"; +import { + ICommand, + ICommandResult, + IUnsignedCommand, + Pact, + addSignatures, + createClient, +} from "@kadena/client"; +import { TransactionSigner } from "../ui/libs/signer"; +import { BaseNetwork } from "@/types/base-network"; +import { EnkryptAccount } from "@enkryptcom/types"; -export class KDAToken extends BaseToken { +export abstract class KDABaseToken extends BaseToken { + public abstract sendLocal( + to: string, + from: EnkryptAccount, + amount: string, + network: BaseNetwork + ): Promise; +} + +export class KDAToken extends KDABaseToken { constructor(options: BaseTokenOptions) { super(options); } @@ -24,18 +39,79 @@ export class KDAToken extends BaseToken { amount: string, options: SendOptions ): Promise { - throw new Error("EVM-send is not implemented here"); - // const transferType: TransferType = options ? options.type : "keepAlive"; - - // switch (transferType) { - // case "transfer": - // return (api as ApiPromise).tx.balances.transfer(to, amount); - // case "keepAlive": - // return (api as ApiPromise).tx.balances.transferKeepAlive(to, amount); - // case "all": - // return (api as ApiPromise).tx.balances.transferAll(to, false); - // case "allKeepAlive": - // return (api as ApiPromise).tx.balances.transferAll(to, true); - // } + const modules = Pact.modules as any; + return Pact.builder + .execution( + modules.coin.transfer(to, to, { + decimal: amount, + }) + ) + .addData("ks", { + keys: [to], + pred: "keys-all", + }) + .addSigner(to, (withCap: any) => [ + withCap("coin.TRANSFER", to, to, { + decimal: amount, + }), + withCap("coin.GAS"), + ]) + .setMeta({ chainId: "1", senderAccount: to }) + .setNetworkId("testnet04") + .createTransaction(); + } + + public async sendLocal( + to: string, + from: EnkryptAccount | any, + amount: string, + network: BaseNetwork + ): Promise { + const modules = Pact.modules as any; + const unsignedTransaction = Pact.builder + .execution( + modules.coin.transfer(from.address, to, { + decimal: amount, + }) + ) + .addData("ks", { + keys: [to], + pred: "keys-all", + }) + .addSigner(from.address, (withCap: any) => [ + withCap("coin.TRANSFER", from.address, to, { + decimal: amount, + }), + withCap("coin.GAS"), + ]) + .setMeta({ chainId: "1", senderAccount: from.address }) + .setNetworkId("testnet04") + .createTransaction(); + + const transaction = await TransactionSigner({ + account: from, + network: network, + payload: unsignedTransaction.cmd, + }).then((res) => { + if (res.error) return Promise.reject(res.error); + else + return { + id: 0, + signature: res.result as string, + }; + }); + + const signedTranscation: IUnsignedCommand | ICommand = addSignatures( + unsignedTransaction, + { + sig: transaction.signature, + pubKey: from.address, + } + ); + + const client = createClient( + "https://api.testnet.chainweb.com/chainweb/0.0/testnet04/chain/1/pact" + ); + return client.local(signedTranscation as ICommand); } } diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 325108899..811b7125f 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -102,31 +102,24 @@ import SendTokenSelect from "./components/send-token-select.vue"; import AssetsSelectList from "@action/views/assets-select-list/index.vue"; import SendInputAmount from "./components/send-input-amount.vue"; import SendFeeSelect from "./components/send-fee-select.vue"; -import SendAlert from "./components/send-alert.vue"; import BaseButton from "@action/components/base-button/index.vue"; -import SubstrateApi from "@/providers/polkadot/libs/api"; -import { ApiPromise } from "@polkadot/api"; import { AccountsHeaderData } from "@action/types/account"; import { GasFeeInfo } from "@/providers/ethereum/ui/types"; -import { SubstrateNetwork } from "@/providers/polkadot/types/substrate-network"; import { toBN } from "web3-utils"; import { formatFloatingPointValue } from "@/libs/utils/number-formatter"; import { fromBase, toBase, isValidDecimals } from "@enkryptcom/utils"; import BigNumber from "bignumber.js"; import { VerifyTransactionParams } from "../types"; import { routes as RouterNames } from "@/ui/action/router"; -import { SendOptions } from "@/types/base-token"; import { KDAToken } from "@/providers/kadena/types/kda-token"; -import Browser from "webextension-polyfill"; -import getUiPath from "@/libs/utils/get-ui-path"; -import { ProviderName } from "@/types/provider"; import PublicKeyRing from "@/libs/keyring/public-keyring"; -import { polkadotEncodeAddress } from "@enkryptcom/utils"; import { GenericNameResolver, CoinType } from "@/libs/name-resolver"; +import { KadenaNetwork } from "../../types/kadena-network"; +import KadenaAPI from "@/providers/kadena/libs/api"; const props = defineProps({ network: { - type: Object as PropType, + type: Object as PropType, default: () => ({}), }, accountInfo: { @@ -166,37 +159,36 @@ const selected: string = route.params.id as string; const isLoadingAssets = ref(true); const edWarn = computed(() => { - return true; - // if (!fee.value) { - // return undefined; - // } + if (!fee.value) { + return undefined; + } - // if (!amount.value) { - // return false; - // } + if (!amount.value) { + return false; + } - // if (!isValidDecimals(amount.value ?? "0", selectedAsset.value.decimals!)) { - // return false; - // } + if (!isValidDecimals(amount.value ?? "0", selectedAsset.value.decimals!)) { + return false; + } - // const rawAmount = toBN( - // toBase(amount.value.toString(), selectedAsset.value.decimals ?? 0) - // ); - // const ed = selectedAsset.value.existentialDeposit ?? toBN(0); - // const userBalance = toBN(selectedAsset.value.balance ?? 0); + const rawAmount = toBN( + toBase(amount.value.toString(), selectedAsset.value.decimals ?? 0) + ); + const ed = selectedAsset.value.existentialDeposit ?? toBN(0); + const userBalance = toBN(selectedAsset.value.balance ?? 0); - // if (!sendMax.value && userBalance.sub(rawAmount).lte(ed)) { - // return true; - // } + if (!sendMax.value && userBalance.sub(rawAmount).lte(ed)) { + return true; + } - // const txFee = toBN( - // toBase(fee.value.nativeValue, selectedAsset.value.decimals!) - // ); - // if (!sendMax.value && userBalance.sub(txFee).sub(rawAmount).lt(ed)) { - // return true; - // } else { - // return false; - // } + const txFee = toBN( + toBase(fee.value.nativeValue, selectedAsset.value.decimals!) + ); + if (!sendMax.value && userBalance.sub(txFee).sub(rawAmount).lt(ed)) { + return true; + } else { + return false; + } }); const isAddress = computed(() => { @@ -210,80 +202,60 @@ onMounted(() => { const validateFields = async () => { if (selectedAsset.value && isAddress.value) { - hasEnough.value = true; + if (!isValidDecimals(amount.value || "0", selectedAsset.value.decimals!)) { + hasEnough.value = false; + return; + } + + let rawAmount = toBN( + toBase( + amount.value ? amount.value.toString() : "0", + selectedAsset.value.decimals! + ) + ); + + const localTransaction = await selectedAsset.value.sendLocal!( + addressTo.value, + props.accountInfo.selectedAccount, + rawAmount.toString(), + props.network + ); + + const partialFee = localTransaction.gas; + const rawFee = toBN(partialFee?.toString() ?? "0"); + const rawBalance = toBN(selectedAsset.value.balance!); + if ( + sendMax.value && + selectedAsset.value.name === accountAssets.value[0].name + ) { + rawAmount = rawAmount.sub(rawFee); + if (rawAmount.gtn(0)) { + amount.value = fromBase( + rawAmount.toString(), + selectedAsset.value.decimals! + ); + } + } + if (rawAmount.ltn(0) || rawAmount.add(rawFee).gt(rawBalance)) { + hasEnough.value = false; + } else { + hasEnough.value = true; + } + + const nativeAsset = accountAssets.value[0]; + const txFeeHuman = fromBase( + partialFee?.toString() ?? "", + nativeAsset.decimals! + ); + + const txPrice = new BigNumber(nativeAsset.price!).times(txFeeHuman); fee.value = { fiatSymbol: "USD", - fiatValue: "".toString(), - nativeSymbol: "", - nativeValue: "", + fiatValue: txPrice.toString(), + nativeSymbol: nativeAsset.symbol ?? "", + nativeValue: txFeeHuman.toString(), }; - return; - // if (!isValidDecimals(amount.value || "0", selectedAsset.value.decimals!)) { - // hasEnough.value = false; - // return; - // } - // console.log("validateFields", amount.value, selectedAsset.value.decimals!); - - // const api = (await props.network.api()).api as ApiPromise; - // await api.isReady; - - // let rawAmount = toBN( - // toBase( - // amount.value ? amount.value.toString() : "0", - // selectedAsset.value.decimals! - // ) - // ); - - // console.log("validateFields 2", rawAmount.toString()); - - // const sendOptions: SendOptions | undefined = sendMax.value - // ? { type: "all" } - // : undefined; - - // const tx = await selectedAsset.value.send!( - // api, - // addressTo.value, - // rawAmount.toString(), - // sendOptions - // ); - // const { partialFee } = ( - // await tx.paymentInfo(props.accountInfo.selectedAccount!.address) - // ).toJSON(); - // const rawFee = toBN(partialFee?.toString() ?? "0"); - // const rawBalance = toBN(selectedAsset.value.balance!); - // if ( - // sendMax.value && - // selectedAsset.value.name === accountAssets.value[0].name - // ) { - // rawAmount = rawAmount.sub(rawFee); - // if (rawAmount.gtn(0)) { - // amount.value = fromBase( - // rawAmount.toString(), - // selectedAsset.value.decimals! - // ); - // } - // } - // if (rawAmount.ltn(0) || rawAmount.add(rawFee).gt(rawBalance)) { - // hasEnough.value = false; - // } else { - // hasEnough.value = true; - // } - - // const nativeAsset = accountAssets.value[0]; - // const txFeeHuman = fromBase( - // partialFee?.toString() ?? "", - // nativeAsset.decimals! - // ); - - // const txPrice = new BigNumber(nativeAsset.price!).times(txFeeHuman); - - // fee.value = { - // fiatSymbol: "USD", - // fiatValue: txPrice.toString(), - // nativeSymbol: nativeAsset.symbol ?? "", - // nativeValue: txFeeHuman.toString(), - // }; } }; watch([selectedAsset, addressTo], validateFields); @@ -293,7 +265,7 @@ watch(addressFrom, () => { }); const fetchTokens = async () => { - const networkApi = (await props.network.api()) as SubstrateApi; + const networkApi = (await props.network.api()) as KadenaAPI; const networkAssets = await props.network.getAllTokens(addressFrom.value); const pricePromises = networkAssets.map((asset) => asset.getLatestPrice()); const balancePromises = networkAssets.map((asset) => { @@ -370,7 +342,6 @@ const selectToken = (token: KDAToken | Partial) => { }; const inputAmount = (number: string | undefined) => { - debugger; sendMax.value = false; amount.value = number ? (parseFloat(number) < 0 ? "0" : number) : number; validateFields(); @@ -406,7 +377,6 @@ const setSendMax = (max: boolean) => { const isDisabled = computed(() => { let isDisabled = true; - let addressIsValid = false; try { From e33dc291eca118b52821ceef17496694be00dcdf Mon Sep 17 00:00:00 2001 From: Glaicon Date: Mon, 18 Sep 2023 13:50:46 -0400 Subject: [PATCH 020/375] WIP - Uncomment code and update kda-token --- .../src/providers/kadena/types/kda-token.ts | 21 +------- .../kadena/ui/send-transaction/index.vue | 52 +++++++------------ 2 files changed, 20 insertions(+), 53 deletions(-) diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index a4a263249..464c2798a 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -39,26 +39,7 @@ export class KDAToken extends KDABaseToken { amount: string, options: SendOptions ): Promise { - const modules = Pact.modules as any; - return Pact.builder - .execution( - modules.coin.transfer(to, to, { - decimal: amount, - }) - ) - .addData("ks", { - keys: [to], - pred: "keys-all", - }) - .addSigner(to, (withCap: any) => [ - withCap("coin.TRANSFER", to, to, { - decimal: amount, - }), - withCap("coin.GAS"), - ]) - .setMeta({ chainId: "1", senderAccount: to }) - .setNetworkId("testnet04") - .createTransaction(); + throw new Error("EVM-send is not implemented here"); } public async sendLocal( diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 811b7125f..e81ddf489 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -116,6 +116,9 @@ import PublicKeyRing from "@/libs/keyring/public-keyring"; import { GenericNameResolver, CoinType } from "@/libs/name-resolver"; import { KadenaNetwork } from "../../types/kadena-network"; import KadenaAPI from "@/providers/kadena/libs/api"; +import getUiPath from "@/libs/utils/get-ui-path"; +import { ProviderName } from "@/types/provider"; +import Browser from "webextension-polyfill"; const props = defineProps({ network: { @@ -399,22 +402,6 @@ const isDisabled = computed(() => { }); const sendAction = async () => { - // const sendAmount = toBase(amount.value!, selectedAsset.value.decimals!); - - // const sendOptions: SendOptions | undefined = sendMax.value - // ? { type: "all" } - // : undefined; - - // const api = (await props.network.api()).api as ApiPromise; - // await api.isReady; - - // const tx = await selectedAsset.value?.send!( - // api, - // addressTo.value, - // sendAmount, - // sendOptions - // ); - debugger; const keyring = new PublicKeyRing(); const fromAccount = await keyring.getAccount(addressFrom.value); const txVerifyInfo: VerifyTransactionParams = { @@ -451,23 +438,22 @@ const sendAction = async () => { }, }); - router.push(routedRoute); - // if (fromAccount.isHardware) { - // await Browser.windows.create({ - // url: Browser.runtime.getURL( - // getUiPath( - // `dot-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, - // ProviderName.polkadot - // ) - // ), - // type: "popup", - // focused: true, - // height: 600, - // width: 460, - // }); - // } else { - // router.push(routedRoute); - // } + if (fromAccount.isHardware) { + await Browser.windows.create({ + url: Browser.runtime.getURL( + getUiPath( + `dot-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, + ProviderName.polkadot + ) + ), + type: "popup", + focused: true, + height: 600, + width: 460, + }); + } else { + router.push(routedRoute); + } }; From 30ee98737af399af26d924ba3e2e5792b9547e72 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Mon, 18 Sep 2023 17:14:17 -0300 Subject: [PATCH 021/375] Adding Kadena providers to some other classes --- packages/extension/src/libs/background/types.ts | 6 ++++-- packages/extension/src/providers/index.ts | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/libs/background/types.ts b/packages/extension/src/libs/background/types.ts index 52b3bfcec..5e59210d6 100644 --- a/packages/extension/src/libs/background/types.ts +++ b/packages/extension/src/libs/background/types.ts @@ -1,18 +1,20 @@ import BitcoinProvider from "@/providers/bitcoin"; import type EthereumProvider from "@/providers/ethereum"; import type PolkadotProvider from "@/providers/polkadot"; +import type KadenaProvider from "@/providers/kadena"; export interface TabProviderType { [key: string]: Record< number, - EthereumProvider | PolkadotProvider | BitcoinProvider + EthereumProvider | PolkadotProvider | BitcoinProvider | KadenaProvider >; } export interface ProviderType { [key: string]: | typeof EthereumProvider | typeof PolkadotProvider - | typeof BitcoinProvider; + | typeof BitcoinProvider + | typeof KadenaProvider; } export interface ExternalMessageOptions { savePersistentEvents: boolean; diff --git a/packages/extension/src/providers/index.ts b/packages/extension/src/providers/index.ts index 8a9265312..738d6fcec 100644 --- a/packages/extension/src/providers/index.ts +++ b/packages/extension/src/providers/index.ts @@ -1,10 +1,12 @@ import EthereumProvider from "@/providers/ethereum"; import PolkadotProvider from "@/providers/polkadot"; import BitcoinProvider from "@/providers/bitcoin"; +import KadenaProvider from "@/providers/kadena"; import { ProviderName } from "@/types/provider"; export default { [ProviderName.ethereum]: EthereumProvider, [ProviderName.polkadot]: PolkadotProvider, [ProviderName.bitcoin]: BitcoinProvider, + [ProviderName.kadena]: KadenaProvider, }; From aa4d24d1f8c81ee573c2097a9206c3a1bd65c94c Mon Sep 17 00:00:00 2001 From: Glaicon Date: Mon, 18 Sep 2023 20:34:46 -0400 Subject: [PATCH 022/375] update send transaction page --- .../src/providers/kadena/ui/send-transaction/index.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index e81ddf489..769f89116 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -195,7 +195,7 @@ const edWarn = computed(() => { }); const isAddress = computed(() => { - return true; + return addressTo.value.length > 3 && addressTo.value.length < 256; }); onMounted(() => { @@ -306,7 +306,7 @@ const inputAddressFrom = (text: string) => { const inputAddressTo = (text: string) => { const debounceResolve = debounce(() => { nameResolver - .resolveName(text, [props.network.name as CoinType, "DOT", "KSM"]) + .resolveName(text, [props.network.name as CoinType]) .then((resolved) => { if (resolved) { addressTo.value = resolved; @@ -443,7 +443,7 @@ const sendAction = async () => { url: Browser.runtime.getURL( getUiPath( `dot-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, - ProviderName.polkadot + ProviderName.kadena ) ), type: "popup", From e739d327afd72d404d62259de03b070c90427982 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Tue, 19 Sep 2023 11:08:26 -0400 Subject: [PATCH 023/375] update send and verify page --- .../src/providers/kadena/libs/api.ts | 27 +++ .../src/providers/kadena/types/kda-token.ts | 33 ++-- .../kadena/ui/send-transaction/index.vue | 9 +- .../verify-transaction/index.vue | 168 +++++++----------- 4 files changed, 108 insertions(+), 129 deletions(-) diff --git a/packages/extension/src/providers/kadena/libs/api.ts b/packages/extension/src/providers/kadena/libs/api.ts index 3ec7899dd..3e4dbf0f7 100644 --- a/packages/extension/src/providers/kadena/libs/api.ts +++ b/packages/extension/src/providers/kadena/libs/api.ts @@ -6,6 +6,12 @@ import { import { ProviderAPIInterface } from "@/types/provider"; import { KadenaNetworkOptions } from "../types/kadena-network"; import { formatDecimals } from "./utils"; +import { + ICommand, + ICommandResult, + ITransactionDescriptor, + createClient, +} from "@kadena/client"; class API implements ProviderAPIInterface { decimals: number; @@ -71,6 +77,27 @@ class API implements ProviderAPIInterface { return await Pact.fetch.local(cmd, this.apiHost); } + + async sendLocalTransaction( + signedTranscation: ICommand + ): Promise { + const client = createClient(this.apiHost); + return client.local(signedTranscation as ICommand); + } + + async sendTransaction( + signedTranscation: ICommand + ): Promise { + const client = createClient(this.apiHost); + return client.submit(signedTranscation as ICommand); + } + + async listen( + transactionDescriptor: ITransactionDescriptor + ): Promise { + const client = createClient(this.apiHost); + return client.listen(transactionDescriptor); + } } export default API; diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index 464c2798a..9dad14907 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -1,24 +1,17 @@ import { BaseToken, BaseTokenOptions, SendOptions } from "@/types/base-token"; import KadenaAPI from "@/providers/kadena/libs/api"; -import { - ICommand, - ICommandResult, - IUnsignedCommand, - Pact, - addSignatures, - createClient, -} from "@kadena/client"; +import { ICommand, Pact, addSignatures } from "@kadena/client"; import { TransactionSigner } from "../ui/libs/signer"; import { BaseNetwork } from "@/types/base-network"; import { EnkryptAccount } from "@enkryptcom/types"; export abstract class KDABaseToken extends BaseToken { - public abstract sendLocal( + public abstract buildTransaction( to: string, from: EnkryptAccount, amount: string, network: BaseNetwork - ): Promise; + ): Promise; } export class KDAToken extends KDABaseToken { @@ -42,12 +35,12 @@ export class KDAToken extends KDABaseToken { throw new Error("EVM-send is not implemented here"); } - public async sendLocal( + public async buildTransaction( to: string, from: EnkryptAccount | any, amount: string, network: BaseNetwork - ): Promise { + ): Promise { const modules = Pact.modules as any; const unsignedTransaction = Pact.builder .execution( @@ -82,17 +75,11 @@ export class KDAToken extends KDABaseToken { }; }); - const signedTranscation: IUnsignedCommand | ICommand = addSignatures( - unsignedTransaction, - { - sig: transaction.signature, - pubKey: from.address, - } - ); + const signedTranscation = addSignatures(unsignedTransaction, { + sig: transaction.signature, + pubKey: from.address, + }); - const client = createClient( - "https://api.testnet.chainweb.com/chainweb/0.0/testnet04/chain/1/pact" - ); - return client.local(signedTranscation as ICommand); + return signedTranscation as ICommand; } } diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 769f89116..b2aa94290 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -217,14 +217,19 @@ const validateFields = async () => { ) ); - const localTransaction = await selectedAsset.value.sendLocal!( + const localTransaction = await selectedAsset.value.buildTransaction!( addressTo.value, props.accountInfo.selectedAccount, rawAmount.toString(), props.network ); - const partialFee = localTransaction.gas; + const networkApi = (await props.network.api()) as KadenaAPI; + const transactionResult = await networkApi.sendLocalTransaction( + localTransaction + ); + + const partialFee = transactionResult.gas; const rawFee = toBN(partialFee?.toString() ?? "0"); const rawBalance = toBN(selectedAsset.value.balance!); if ( diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue index 079bcc3fe..3a530da7b 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue @@ -88,23 +88,17 @@ import { DEFAULT_KADENA_NETWORK, getNetworkByName, } from "@/libs/utils/networks"; -import { TransactionSigner } from "../../libs/signer"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; import { BaseNetwork } from "@/types/base-network"; -import { - IUnsignedCommand, - Pact, - createClient, - addSignatures, - ICommand, -} from "@kadena/client"; import ActivityState from "@/libs/activity-state"; import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; -import { u8aToHex } from "@polkadot/util"; +import { KDAToken } from "@/providers/kadena/types/kda-token"; +import KadenaAPI from "@/providers/kadena/libs/api"; const isSendDone = ref(false); const account = ref(); +const kdaToken = ref(); const KeyRing = new PublicKeyRing(); const route = useRoute(); const router = useRouter(); @@ -124,6 +118,14 @@ onBeforeMount(async () => { network.value = (await getNetworkByName(selectedNetwork))!; account.value = await KeyRing.getAccount(txData.fromAddress); isWindowPopup.value = account.value.isHardware; + kdaToken.value = new KDAToken({ + icon: network.value.icon, + balance: "0", + price: "0", + name: "loading", + symbol: "loading", + decimals: 7, + }); }); const close = () => { if (getCurrentContext() === "popup") { @@ -135,105 +137,63 @@ const close = () => { const sendAction = async () => { isProcessing.value = true; - const modules = Pact.modules as any; - debugger; - - const unsignedTransaction = Pact.builder - .execution( - modules.coin.transfer(txData.fromAddress, txData.toAddress, { - decimal: txData.TransactionData.value, - }) - ) - .addData("ks", { - keys: [txData.toAddress], - pred: "keys-all", - }) - .addSigner(txData.fromAddress, (withCap: any) => [ - withCap("coin.TRANSFER", txData.fromAddress, txData.toAddress, { - decimal: txData.TransactionData.value, - }), - withCap("coin.GAS"), - ]) - .setMeta({ chainId: "1", senderAccount: txData.fromAddress }) - .setNetworkId("testnet04") - .createTransaction(); - - const transaction = await TransactionSigner({ - account: account.value!, - network: network.value, - payload: unsignedTransaction.cmd, - }).then((res) => { - if (res.error) return Promise.reject(res.error); - else - return { - id: 0, - signature: res.result as string, - }; - }); - const signedTranscation: IUnsignedCommand | ICommand = addSignatures( - unsignedTransaction, - { - sig: transaction.signature, - pubKey: txData.fromAddress, + try { + const transaction = await kdaToken.value!.buildTransaction!( + txData.toAddress, + account.value!, + txData.TransactionData.value, + network.value + ); + + const networkApi = (await network.value.api()) as KadenaAPI; + const transactionDescriptor = await networkApi.sendTransaction(transaction); + const response = await networkApi.listen(transactionDescriptor); + if (response.result.status === "failure") { + throw response.result.error; } - ); - - const client = createClient( - "https://api.testnet.chainweb.com/chainweb/0.0/testnet04/chain/1/pact" - ); - const transactionDescriptor = await client.submit( - signedTranscation as ICommand - ); - const response = await client.listen(transactionDescriptor); - if (response.result.status === "failure") { - throw response.result.error; - } else { - console.log(response.result); - } - const txActivity: Activity = { - from: txData.fromAddress, - to: txData.toAddress, - isIncoming: txData.fromAddress === txData.toAddress, - network: network.value.name, - status: ActivityStatus.pending, - timestamp: new Date().getTime(), - token: { - decimals: txData.toToken.decimals, - icon: txData.toToken.icon, - name: txData.toToken.name, - symbol: txData.toToken.symbol, - price: txData.toToken.price, - }, - type: ActivityType.transaction, - value: txData.toToken.amount, - transactionHash: "", - }; - const activityState = new ActivityState(); - - txActivity.transactionHash = transactionDescriptor.requestKey; - await activityState.addActivities([txActivity], { - address: network.value.displayAddress(txData.fromAddress), - network: network.value.name, - }); - isSendDone.value = true; - if (getCurrentContext() === "popup") { - setTimeout(() => { - isProcessing.value = false; - router.go(-2); - }, 2500); - } else { - setTimeout(() => { - isProcessing.value = false; - window.close(); - }, 1500); + const txActivity: Activity = { + from: txData.fromAddress, + to: txData.toAddress, + isIncoming: txData.fromAddress === txData.toAddress, + network: network.value.name, + status: ActivityStatus.success, + timestamp: new Date().getTime(), + token: { + decimals: txData.toToken.decimals, + icon: txData.toToken.icon, + name: txData.toToken.name, + symbol: txData.toToken.symbol, + price: txData.toToken.price, + }, + type: ActivityType.transaction, + value: txData.toToken.amount, + transactionHash: transactionDescriptor.requestKey, + }; + const activityState = new ActivityState(); + + await activityState.addActivities([txActivity], { + address: network.value.displayAddress(txData.fromAddress), + network: network.value.name, + }); + isSendDone.value = true; + if (getCurrentContext() === "popup") { + setTimeout(() => { + isProcessing.value = false; + router.go(-2); + }, 2500); + } else { + setTimeout(() => { + isProcessing.value = false; + window.close(); + }, 1500); + } + } catch (error: any) { + isProcessing.value = false; + console.error("error", error); + errorMsg.value = JSON.stringify(error); } - // } catch (error: any) { - // isProcessing.value = false; - // console.error("error", error); - // errorMsg.value = JSON.stringify(error); - // } }; const isHasScroll = () => { From 9e9f0f446e523da842e29733ef302c525418dce2 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Tue, 19 Sep 2023 11:23:31 -0400 Subject: [PATCH 024/375] update kadena ui signer --- .../src/providers/kadena/ui/libs/signer.ts | 77 ++++++++----------- 1 file changed, 33 insertions(+), 44 deletions(-) diff --git a/packages/extension/src/providers/kadena/ui/libs/signer.ts b/packages/extension/src/providers/kadena/ui/libs/signer.ts index 7ae9fa12a..1b372c8fe 100644 --- a/packages/extension/src/providers/kadena/ui/libs/signer.ts +++ b/packages/extension/src/providers/kadena/ui/libs/signer.ts @@ -3,10 +3,6 @@ import { HWwalletType } from "@enkryptcom/types"; import HWwallet from "@enkryptcom/hw-wallets"; import { SignerMessageOptions, SignerTransactionOptions } from "../types"; import { getCustomError } from "@/libs/error"; -import { - payloadSignTransform, - signPayload, -} from "@/providers/polkadot/libs/signing-utils"; import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; import { isAscii, @@ -15,51 +11,44 @@ import { u8aWrapBytes, } from "@polkadot/util"; import { bufferToHex } from "ethereumjs-util"; +import { ExtrinsicPayload } from "@polkadot/types/interfaces"; const TransactionSigner = ( options: SignerTransactionOptions ): Promise => { const { account, network, payload } = options; - // if (account.isHardware) { - // const hwWallet = new HWwallet(); - // return hwWallet - // .signTransaction({ - // transaction: payload, - // networkName: network.name, - // pathIndex: account.pathIndex.toString(), - // pathType: { - // basePath: account.basePath, - // path: account.HWOptions!.pathTemplate, - // }, - // wallet: account.walletType as unknown as HWwalletType, - // }) - // .then((signature: string) => ({ - // result: JSON.stringify(signature), - // })) - // .catch((e) => { - // return Promise.reject({ - // error: getCustomError(e.message), - // }); - // }); - // } else { - // const signMsg = signPayload(payload); - return sendUsingInternalMessengers({ - method: InternalMethods.sign, - params: [payload, account], - }).then((res) => { - debugger; - if (res.error) return res; - - // const signed = payloadSignTransform( - // JSON.parse(res.result as string), - // account.signerType, - // true - // ); - return { - result: JSON.parse(res.result as string), - }; - }); - // } + if (account.isHardware) { + const hwWallet = new HWwallet(); + return hwWallet + .signTransaction({ + transaction: payload as ExtrinsicPayload, + networkName: network.name, + pathIndex: account.pathIndex.toString(), + pathType: { + basePath: account.basePath, + path: account.HWOptions!.pathTemplate, + }, + wallet: account.walletType as unknown as HWwalletType, + }) + .then((signature: string) => ({ + result: JSON.stringify(signature), + })) + .catch((e) => { + return Promise.reject({ + error: getCustomError(e.message), + }); + }); + } else { + return sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [payload, account], + }).then((res) => { + if (res.error) return res; + return { + result: JSON.parse(res.result as string), + }; + }); + } }; const MessageSigner = ( From c0a42940223c225f64bb949ac860b937fa6f0a6e Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Tue, 19 Sep 2023 16:20:21 -0300 Subject: [PATCH 025/375] Key generation using hd-keys --- packages/signers/kadena/package.json | 5 +- packages/signers/kadena/src/index.ts | 49 +++++++++---------- .../signers/kadena/tests/generate.test.ts | 11 ++--- packages/signers/kadena/tests/sign.test.ts | 8 +-- yarn.lock | 36 +++++++++++++- 5 files changed, 68 insertions(+), 41 deletions(-) diff --git a/packages/signers/kadena/package.json b/packages/signers/kadena/package.json index cadea618e..9aa903bef 100644 --- a/packages/signers/kadena/package.json +++ b/packages/signers/kadena/package.json @@ -18,8 +18,11 @@ }, "dependencies": { "@enkryptcom/utils": "workspace:^", + "@kadena/cryptography-utils": "^0.3.8", + "bip39": "^3.1.0", "cardano-crypto-kadena.js": "^6.0.1", - "chai": "^4.3.8" + "chai": "^4.3.8", + "ed25519-hd-key": "^1.3.0" }, "devDependencies": { "@enkryptcom/types": "workspace:^", diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index 4524a0bff..03b91727e 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -1,16 +1,25 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; -import kadenaCrypto from "cardano-crypto-kadena.js/kadena-crypto"; +import { mnemonicToSeedSync } from 'bip39'; +import { derivePath } from 'ed25519-hd-key'; +import { + signHash, + verifySig, + binToHex, + hexToBin, + base64UrlDecodeArr, + restoreKeyPairFromSecretKey +} from '@kadena/cryptography-utils'; class Signer implements SignerInterface { async generate(mnemonic: string, derivationPath = ""): Promise { - const root = kadenaCrypto.kadenaMnemonicToRootKeypair("", mnemonic.trim()); - const hardIndex = 0x80000000 + Number(derivationPath); - const privPubKey = kadenaCrypto.kadenaGenKeypair("", root, hardIndex); - + const seed = binToHex(mnemonicToSeedSync(mnemonic)); + const keys = derivePath("m/44'/626'/0'", seed, 0x80000000 + Number(derivationPath)); + const keyPair = restoreKeyPairFromSecretKey(binToHex(keys.key)); + return { - address: this.bufferToHex(privPubKey[1]), - privateKey: this.bufferToHex(privPubKey[0]), - publicKey: this.bufferToHex(privPubKey[1]), + address: keyPair.publicKey, + privateKey: keyPair.secretKey, + publicKey: keyPair.publicKey, }; } @@ -19,28 +28,14 @@ class Signer implements SignerInterface { sig: string, publicKey: string ): Promise { - const xpub = this.hexToBuffer(publicKey); - const xsig = this.hexToBuffer(sig); - - return kadenaCrypto.kadenaVerify(msgHash, xpub, xsig); + return verifySig(base64UrlDecodeArr(msgHash), hexToBin(sig), hexToBin(publicKey)); } async sign(msgHash: string, keyPair: KeyPair): Promise { - const xprv = this.hexToBuffer(keyPair.privateKey); - - return this.bufferToHex(kadenaCrypto.kadenaSign("", msgHash, xprv)); - } - - bufferToHex(buffer: Iterable): string { - return Array.from(new Uint8Array(buffer)) - .map(b => b.toString(16).padStart(2, "0")) - .join(""); - } - - hexToBuffer(hex: string): Uint8Array { - return new Uint8Array( - hex.match(/.{1,2}/g)?.map(byte => parseInt(byte, 16)) - ); + return signHash(msgHash, { + publicKey: keyPair.publicKey, + secretKey: keyPair.privateKey + }).sig; } } diff --git a/packages/signers/kadena/tests/generate.test.ts b/packages/signers/kadena/tests/generate.test.ts index 77b894cd9..34c97f26d 100644 --- a/packages/signers/kadena/tests/generate.test.ts +++ b/packages/signers/kadena/tests/generate.test.ts @@ -2,9 +2,6 @@ import { expect } from "chai"; import Signer from "../src"; describe("Kadena address generate", () => { - // You can check this derived address on: - // https://kadenakeys.io - const MNEMONIC = "clip coffee brain token leader kiss around main finger network avoid west"; @@ -15,25 +12,25 @@ describe("Kadena address generate", () => { // Act & Assert let keypair = await kadenaSigner.generate(MNEMONIC, "0"); expect(keypair.address).equals( - "57b9e48323d8cf9d811a4032662ab86c1c8f440b974759b4267d27a1f1ca936f" + "e84affbb41a62d74020bc4841ea206aba7734f9e0d30fb688a4a84fe2d30e291" ); // Act & Assert keypair = await kadenaSigner.generate(MNEMONIC, "1"); expect(keypair.address).equals( - "3c77941d21857bd26683154a5efc5c15169f27698fc56906bcf49b4c05e1006b" + "2ddd388820dfd8ddafa37a69926e0b5e57d29daa3adab2ede8a390f984038283" ); // Act & Assert keypair = await kadenaSigner.generate(MNEMONIC, "2"); expect(keypair.address).equals( - "f8dc5d97bc43155b033f813833bcda9ef374b060689648b4c0226f5a1456935a" + "16dcf13ed0261406c63561ef32853e4b417fe1c197a164b6385718c596261918" ); // Act & Assert keypair = await kadenaSigner.generate(MNEMONIC, "3"); expect(keypair.address).equals( - "df3125da8789dc114be0c953040333e9a1a9afb31e1170ade42be52a6701842e" + "af29ee6f585381b0109eef8ba51f55fbe9cca31c83375efdb8d72588be3995fc" ); }); }); diff --git a/packages/signers/kadena/tests/sign.test.ts b/packages/signers/kadena/tests/sign.test.ts index d79a1d68e..ddf763b37 100644 --- a/packages/signers/kadena/tests/sign.test.ts +++ b/packages/signers/kadena/tests/sign.test.ts @@ -14,12 +14,12 @@ describe("Kadena signing", () => { "clip coffee brain token leader kiss around main finger network avoid west"; const msg = "Everything should be made as simple as possible, but not simpler."; - const signature = "5ca1f34b074c8cffbd2127facdde210158cc48885cf3637aa0cb6c6809741ae8631cecec601c804ad8764761380fff02d3ab329f33b23d09f611a2ca8736e306"; + const signature = "894531b2e628884f960b3b58369bf9d34401fc5bb54cc4eac0bf577df3701bc0cf5f330a5db06cbf3980384f2a5894ae3eb64f7c83d63fa31205817a489c5509"; it("it should sign correctly", async () => { // Arrange const kadenaSigner = new Signer(); - const keypair = await kadenaSigner.generate(MNEMONIC, "0"); + const keypair = await kadenaSigner.generate(MNEMONIC, "1"); const msgHash = bufferToHex(blake2b(Buffer.from(msg), 32)); // Act @@ -29,10 +29,10 @@ describe("Kadena signing", () => { expect(signResult).equals(signature); }); - it("it should verify correctly", async () => { + it.only("it should verify correctly", async () => { // Arrange const kadenaSigner = new Signer(); - const keypair = await kadenaSigner.generate(MNEMONIC, "0"); + const keypair = await kadenaSigner.generate(MNEMONIC, "1"); const msgHash = bufferToHex(blake2b(Buffer.from(msg), 32)); // Act diff --git a/yarn.lock b/yarn.lock index b772b01f6..2a415a313 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2601,14 +2601,17 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" + "@kadena/cryptography-utils": ^0.3.8 "@types/chai": ^4.3.5 "@types/hdkey": ^2.0.1 "@types/mocha": ^10.0.1 "@types/node": ^20.5.7 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 + bip39: ^3.1.0 cardano-crypto-kadena.js: ^6.0.1 chai: ^4.3.8 + ed25519-hd-key: ^1.3.0 eslint: ^8.48.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -3770,6 +3773,25 @@ __metadata: languageName: node linkType: hard +"@kadena/cryptography-utils@npm:^0.3.8": + version: 0.3.8 + resolution: "@kadena/cryptography-utils@npm:0.3.8" + dependencies: + "@kadena/types": 0.4.2 + blakejs: ^1.2.1 + buffer: ^6.0.3 + tweetnacl: ^1.0.3 + checksum: 6851d6fafe45fe2aadf1613babf44c17fbaf4ca9803bb26c914d721cf52e8843d7b844e7bb1ef3a9138e35e795e6ea9dbcdce273e8dd34945732b1de03bccebd + languageName: node + linkType: hard + +"@kadena/types@npm:0.4.2": + version: 0.4.2 + resolution: "@kadena/types@npm:0.4.2" + checksum: e80280e7dc155a1eb6b74c394a78c1c1dca54891fb674ad2b9ec30131883fa88ccdb6c8ed15a6c7a5ad9f2860567ee7ac3e6db4ea97be79ead005b8b0b465d7c + languageName: node + linkType: hard + "@ledgerhq/compressjs@npm:1.3.2": version: 1.3.2 resolution: "@ledgerhq/compressjs@npm:1.3.2" @@ -11233,7 +11255,7 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.3, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hmac@npm:1.1.7, create-hmac@npm:^1.1.0, create-hmac@npm:^1.1.3, create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -12225,6 +12247,16 @@ __metadata: languageName: node linkType: hard +"ed25519-hd-key@npm:^1.3.0": + version: 1.3.0 + resolution: "ed25519-hd-key@npm:1.3.0" + dependencies: + create-hmac: 1.1.7 + tweetnacl: 1.0.3 + checksum: 65dcf405f948ca592adc1e81d750627ce65887310ba0e1b430a6ae0dcc13e9e67a81cb855252c8d64cc0303da2b84ddad810db3098d24c808a5ae89e79fe58cf + languageName: node + linkType: hard + "ed2curve@npm:^0.3.0": version: 0.3.0 resolution: "ed2curve@npm:0.3.0" @@ -22939,7 +22971,7 @@ __metadata: languageName: node linkType: hard -"tweetnacl@npm:1.x.x, tweetnacl@npm:^1.0.0, tweetnacl@npm:^1.0.3": +"tweetnacl@npm:1.0.3, tweetnacl@npm:1.x.x, tweetnacl@npm:^1.0.0, tweetnacl@npm:^1.0.3": version: 1.0.3 resolution: "tweetnacl@npm:1.0.3" checksum: e4a57cac188f0c53f24c7a33279e223618a2bfb5fea426231991652a13247bea06b081fd745d71291fcae0f4428d29beba1b984b1f1ce6f66b06a6d1ab90645c From 01ac5aa993274d6ed3e83fee914ffacae0a10e07 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Tue, 19 Sep 2023 15:51:03 -0400 Subject: [PATCH 026/375] refactor in kadena network --- .../kadena/networks/kadena-testnet.ts | 2 +- .../providers/kadena/types/kadena-network.ts | 5 ++++- .../src/providers/kadena/types/kda-token.ts | 21 ++++++++++--------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/extension/src/providers/kadena/networks/kadena-testnet.ts b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts index 85e9f9c36..be6ce1864 100644 --- a/packages/extension/src/providers/kadena/networks/kadena-testnet.ts +++ b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts @@ -1,4 +1,4 @@ -import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; +import { NetworkNames } from "@enkryptcom/types"; import { KadenaNetwork, KadenaNetworkOptions } from "../types/kadena-network"; import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; import { kadenaScanActivity } from "../libs/activity-handlers"; diff --git a/packages/extension/src/providers/kadena/types/kadena-network.ts b/packages/extension/src/providers/kadena/types/kadena-network.ts index ef0ab9878..a021d0d5c 100644 --- a/packages/extension/src/providers/kadena/types/kadena-network.ts +++ b/packages/extension/src/providers/kadena/types/kadena-network.ts @@ -1,6 +1,6 @@ import { Activity } from "@/types/activity"; import { BaseNetwork, BaseNetworkOptions } from "@/types/base-network"; -import { BaseToken, BaseTokenOptions } from "@/types/base-token"; +import { BaseTokenOptions } from "@/types/base-token"; import { AssetsType, ProviderName } from "@/types/provider"; import { CoingeckoPlatform, NetworkNames, SignerType } from "@enkryptcom/types"; import KadenaAPI from "@/providers/kadena/libs/api"; @@ -41,6 +41,8 @@ export interface KadenaNetworkOptions { } export class KadenaNetwork extends BaseNetwork { + public options: KadenaNetworkOptions; + private activityHandler: ( network: BaseNetwork, address: string @@ -64,6 +66,7 @@ export class KadenaNetwork extends BaseNetwork { }; super(baseOptions); + this.options = options; this.activityHandler = options.activityHandler; } diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index 9dad14907..e3106f49d 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -1,16 +1,16 @@ import { BaseToken, BaseTokenOptions, SendOptions } from "@/types/base-token"; import KadenaAPI from "@/providers/kadena/libs/api"; -import { ICommand, Pact, addSignatures } from "@kadena/client"; +import { ChainId, ICommand, Pact, addSignatures } from "@kadena/client"; import { TransactionSigner } from "../ui/libs/signer"; -import { BaseNetwork } from "@/types/base-network"; import { EnkryptAccount } from "@enkryptcom/types"; +import { KadenaNetwork } from "./kadena-network"; export abstract class KDABaseToken extends BaseToken { public abstract buildTransaction( to: string, from: EnkryptAccount, amount: string, - network: BaseNetwork + network: KadenaNetwork ): Promise; } @@ -39,7 +39,7 @@ export class KDAToken extends KDABaseToken { to: string, from: EnkryptAccount | any, amount: string, - network: BaseNetwork + network: KadenaNetwork ): Promise { const modules = Pact.modules as any; const unsignedTransaction = Pact.builder @@ -58,8 +58,11 @@ export class KDAToken extends KDABaseToken { }), withCap("coin.GAS"), ]) - .setMeta({ chainId: "1", senderAccount: from.address }) - .setNetworkId("testnet04") + .setMeta({ + chainId: network.options.kadenaApiOptions.chainId as ChainId, + senderAccount: from.address, + }) + .setNetworkId(network.options.kadenaApiOptions.networkId) .createTransaction(); const transaction = await TransactionSigner({ @@ -75,11 +78,9 @@ export class KDAToken extends KDABaseToken { }; }); - const signedTranscation = addSignatures(unsignedTransaction, { + return addSignatures(unsignedTransaction, { sig: transaction.signature, pubKey: from.address, - }); - - return signedTranscation as ICommand; + }) as ICommand; } } From f8ccdb0a3e06c57346c094ed02f2fce0a6b3ffc5 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Tue, 19 Sep 2023 20:53:30 -0400 Subject: [PATCH 027/375] update decimals digits --- packages/extension/src/providers/kadena/libs/api.ts | 6 +++--- packages/extension/src/providers/kadena/libs/utils.ts | 7 ------- .../src/providers/kadena/networks/kadena-testnet.ts | 2 +- packages/extension/src/providers/kadena/networks/kadena.ts | 2 +- 4 files changed, 5 insertions(+), 12 deletions(-) delete mode 100644 packages/extension/src/providers/kadena/libs/utils.ts diff --git a/packages/extension/src/providers/kadena/libs/api.ts b/packages/extension/src/providers/kadena/libs/api.ts index 3e4dbf0f7..774a4909d 100644 --- a/packages/extension/src/providers/kadena/libs/api.ts +++ b/packages/extension/src/providers/kadena/libs/api.ts @@ -5,13 +5,13 @@ import { } from "@/types/activity"; import { ProviderAPIInterface } from "@/types/provider"; import { KadenaNetworkOptions } from "../types/kadena-network"; -import { formatDecimals } from "./utils"; import { ICommand, ICommandResult, ITransactionDescriptor, createClient, } from "@kadena/client"; +import { toBase } from "@enkryptcom/utils"; class API implements ProviderAPIInterface { decimals: number; @@ -51,12 +51,12 @@ class API implements ProviderAPIInterface { const balance = await this.getBalanceAPI(address); if (balance.result.error) { - return formatDecimals("0", this.decimals); + return toBase("0", this.decimals); } const balanceValue = balance.result.data.toString(); - return formatDecimals(balanceValue, this.decimals); + return toBase(balanceValue, this.decimals); } async getBalanceAPI(account: string) { diff --git a/packages/extension/src/providers/kadena/libs/utils.ts b/packages/extension/src/providers/kadena/libs/utils.ts deleted file mode 100644 index 2bfe8f52b..000000000 --- a/packages/extension/src/providers/kadena/libs/utils.ts +++ /dev/null @@ -1,7 +0,0 @@ -const formatDecimals = (value: string, decimals: number): string => { - const intLength = value.substring(0, value.indexOf(".")).length; - - return value.replace(".", "").padEnd(decimals + intLength, "0"); -}; - -export { formatDecimals }; diff --git a/packages/extension/src/providers/kadena/networks/kadena-testnet.ts b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts index be6ce1864..fb99d4466 100644 --- a/packages/extension/src/providers/kadena/networks/kadena-testnet.ts +++ b/packages/extension/src/providers/kadena/networks/kadena-testnet.ts @@ -14,7 +14,7 @@ const kadenaOptions: KadenaNetworkOptions = { currencyName: "KDA", currencyNameLong: "Kadena", icon: require("./icons/kadena-kda-logo.svg"), - decimals: 7, + decimals: 8, prefix: 0, node: "https://api.testnet.chainweb.com/chainweb/0.0", kadenaApiOptions: { diff --git a/packages/extension/src/providers/kadena/networks/kadena.ts b/packages/extension/src/providers/kadena/networks/kadena.ts index 9539699fd..52b17520c 100644 --- a/packages/extension/src/providers/kadena/networks/kadena.ts +++ b/packages/extension/src/providers/kadena/networks/kadena.ts @@ -14,7 +14,7 @@ const kadenaOptions: KadenaNetworkOptions = { currencyName: "KDA", currencyNameLong: "Kadena", icon: require("./icons/kadena-kda-logo.svg"), - decimals: 7, + decimals: 8, prefix: 0, node: "https://api.chainweb.com/chainweb/0.0", kadenaApiOptions: { From b144cc80ca376a1a0bbfd74da2a497ca8138f2d0 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Wed, 20 Sep 2023 07:35:42 -0400 Subject: [PATCH 028/375] WIP- get activities formatting value --- .../libs/activity-handlers/providers/kadena/index.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts index 8303f3af9..409fc33ed 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts @@ -3,7 +3,8 @@ import MarketData from "@/libs/market-data"; import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; import { BaseNetwork } from "@/types/base-network"; import { NetworkEndpoints, NetworkTtls } from "./configs"; -import { formatDecimals } from "../../../utils"; +import { toBase } from "@enkryptcom/utils"; +import { formatFloatingPointValue } from "@/libs/utils/number-formatter"; const getAddressActivity = async ( address: string, @@ -41,8 +42,9 @@ export default async ( .then((mdata) => (price = mdata || "0")); } + debugger; return activities.map((activity: any) => { - return { + const tt = { from: activity.fromAccount, to: activity.toAccount, isIncoming: activity.fromAccount !== address, @@ -50,7 +52,10 @@ export default async ( rawInfo: activity, status: ActivityStatus.success, timestamp: new Date(activity.blockTime).getTime(), - value: formatDecimals(activity.amount, network.decimals), + value: formatFloatingPointValue(activity.amount).value, + // value: toBase(parseFloat(activity.amount).toString(), network.decimals), + // value: parseFloat(activity.amount).toFixed(network.decimals), + // value: toBase(parseFloat(activity.amount), network.decimals), // AINDA NAO RESOLVI transactionHash: activity.requestKey, type: ActivityType.transaction, token: { @@ -62,5 +67,6 @@ export default async ( price: price, }, }; + return tt; }); }; From 760b1a2d475e3534646027116f60fa5935e33a2f Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Wed, 20 Sep 2023 08:57:58 -0300 Subject: [PATCH 029/375] Fixing sign method --- packages/signers/kadena/src/index.ts | 5 +++-- yarn.lock | 10 ---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/packages/signers/kadena/src/index.ts b/packages/signers/kadena/src/index.ts index 03b91727e..327225aeb 100644 --- a/packages/signers/kadena/src/index.ts +++ b/packages/signers/kadena/src/index.ts @@ -2,7 +2,7 @@ import { SignerInterface, KeyPair } from "@enkryptcom/types"; import { mnemonicToSeedSync } from 'bip39'; import { derivePath } from 'ed25519-hd-key'; import { - signHash, + sign, verifySig, binToHex, hexToBin, @@ -32,7 +32,8 @@ class Signer implements SignerInterface { } async sign(msgHash: string, keyPair: KeyPair): Promise { - return signHash(msgHash, { + console.log("msghash", msgHash); + return sign(msgHash, { publicKey: keyPair.publicKey, secretKey: keyPair.privateKey }).sig; diff --git a/yarn.lock b/yarn.lock index 86eb437b2..659ba4026 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2602,10 +2602,7 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" -<<<<<<< HEAD -======= "@kadena/client": ^1.2.0 ->>>>>>> add-send-page "@kadena/cryptography-utils": ^0.3.8 "@types/chai": ^4.3.5 "@types/hdkey": ^2.0.1 @@ -3778,9 +3775,6 @@ __metadata: languageName: node linkType: hard -<<<<<<< HEAD -"@kadena/cryptography-utils@npm:^0.3.8": -======= "@kadena/chainweb-node-client@npm:0.4.4": version: 0.4.4 resolution: "@kadena/chainweb-node-client@npm:0.4.4" @@ -3812,7 +3806,6 @@ __metadata: linkType: hard "@kadena/cryptography-utils@npm:0.3.8, @kadena/cryptography-utils@npm:^0.3.8": ->>>>>>> add-send-page version: 0.3.8 resolution: "@kadena/cryptography-utils@npm:0.3.8" dependencies: @@ -3824,8 +3817,6 @@ __metadata: languageName: node linkType: hard -<<<<<<< HEAD -======= "@kadena/pactjs@npm:0.3.2": version: 0.3.2 resolution: "@kadena/pactjs@npm:0.3.2" @@ -3836,7 +3827,6 @@ __metadata: languageName: node linkType: hard ->>>>>>> add-send-page "@kadena/types@npm:0.4.2": version: 0.4.2 resolution: "@kadena/types@npm:0.4.2" From 6ebc4d1c97ebb61262710ee121ce228ff77ff959 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Wed, 20 Sep 2023 09:00:15 -0300 Subject: [PATCH 030/375] merge from add-send-page branch --- yarn.lock | 1 - 1 file changed, 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 659ba4026..035cf9d55 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2602,7 +2602,6 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@kadena/client": ^1.2.0 "@kadena/cryptography-utils": ^0.3.8 "@types/chai": ^4.3.5 "@types/hdkey": ^2.0.1 From 0511d4ad4803d4640e369bc7613b9f46e2b65b64 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Wed, 20 Sep 2023 09:49:12 -0400 Subject: [PATCH 031/375] Update buildtransaction --- .../src/providers/kadena/libs/api.ts | 5 +++ .../src/providers/kadena/types/kda-token.ts | 33 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/packages/extension/src/providers/kadena/libs/api.ts b/packages/extension/src/providers/kadena/libs/api.ts index 774a4909d..492eaef42 100644 --- a/packages/extension/src/providers/kadena/libs/api.ts +++ b/packages/extension/src/providers/kadena/libs/api.ts @@ -98,6 +98,11 @@ class API implements ProviderAPIInterface { const client = createClient(this.apiHost); return client.listen(transactionDescriptor); } + + async dirtyRead(signedTranscation: ICommand): Promise { + const client = createClient(this.apiHost); + return client.dirtyRead(signedTranscation); + } } export default API; diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index e3106f49d..576f89e17 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -41,16 +41,22 @@ export class KDAToken extends KDABaseToken { amount: string, network: KadenaNetwork ): Promise { + const accountDetails = await this.getAccountDetails(to, network); const modules = Pact.modules as any; const unsignedTransaction = Pact.builder .execution( - modules.coin.transfer(from.address, to, { - decimal: amount, - }) + modules.coin["transfer-create"]( + from.address, + to, + () => '(read-keyset "ks")', + { + decimal: amount, + } + ) ) .addData("ks", { - keys: [to], - pred: "keys-all", + keys: accountDetails.data.guard.keys, + pred: accountDetails.data.guard.pred, }) .addSigner(from.address, (withCap: any) => [ withCap("coin.TRANSFER", from.address, to, { @@ -83,4 +89,21 @@ export class KDAToken extends KDABaseToken { pubKey: from.address, }) as ICommand; } + + public async getAccountDetails( + account: string, + network: KadenaNetwork + ): Promise { + const modules = Pact.modules as any; + const unsignedTransaction = Pact.builder + .execution(modules.coin.details(account)) + .setMeta({ chainId: network.options.kadenaApiOptions.chainId as ChainId }) + .setNetworkId(network.options.kadenaApiOptions.networkId) + .createTransaction(); + + const api = (await network.api()) as KadenaAPI; + const response = await api.dirtyRead(unsignedTransaction as ICommand); + + return response.result; + } } From 8c8128a849df78457b800ce595bd302dd4399157 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Wed, 20 Sep 2023 09:51:28 -0400 Subject: [PATCH 032/375] add getAccountDetails to kda-token abstract class --- packages/extension/src/providers/kadena/types/kda-token.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index 576f89e17..a84216486 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -12,6 +12,11 @@ export abstract class KDABaseToken extends BaseToken { amount: string, network: KadenaNetwork ): Promise; + + public abstract getAccountDetails( + account: string, + network: KadenaNetwork + ): Promise; } export class KDAToken extends KDABaseToken { From 83c5f8004fbcb8b45be2facb6c49c875c630d386 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Wed, 20 Sep 2023 11:21:47 -0300 Subject: [PATCH 033/375] Fix account details loading when the account does not exists --- packages/extension/src/providers/kadena/types/kda-token.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index a84216486..c8f0b3e0c 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -47,6 +47,7 @@ export class KDAToken extends KDABaseToken { network: KadenaNetwork ): Promise { const accountDetails = await this.getAccountDetails(to, network); + const modules = Pact.modules as any; const unsignedTransaction = Pact.builder .execution( @@ -60,8 +61,8 @@ export class KDAToken extends KDABaseToken { ) ) .addData("ks", { - keys: accountDetails.data.guard.keys, - pred: accountDetails.data.guard.pred, + keys: accountDetails.data?.guard.keys || [to], + pred: accountDetails.data?.guard.pred || "keys-all", }) .addSigner(from.address, (withCap: any) => [ withCap("coin.TRANSFER", from.address, to, { From 62e2cb182d5c43514cac0ecb831ee3195fa6045b Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Wed, 20 Sep 2023 17:39:15 -0300 Subject: [PATCH 034/375] Fix activities tab --- .../providers/kadena/index.ts | 56 +++++++++---------- .../network-activity-transaction.vue | 9 +-- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts index 409fc33ed..b1e733ab2 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts @@ -3,7 +3,7 @@ import MarketData from "@/libs/market-data"; import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; import { BaseNetwork } from "@/types/base-network"; import { NetworkEndpoints, NetworkTtls } from "./configs"; -import { toBase } from "@enkryptcom/utils"; +import BigNumber from "bignumber.js"; import { formatFloatingPointValue } from "@/libs/utils/number-formatter"; const getAddressActivity = async ( @@ -41,32 +41,30 @@ export default async ( .getTokenPrice(network.coingeckoID) .then((mdata) => (price = mdata || "0")); } - - debugger; - return activities.map((activity: any) => { - const tt = { - from: activity.fromAccount, - to: activity.toAccount, - isIncoming: activity.fromAccount !== address, - network: network.name, - rawInfo: activity, - status: ActivityStatus.success, - timestamp: new Date(activity.blockTime).getTime(), - value: formatFloatingPointValue(activity.amount).value, - // value: toBase(parseFloat(activity.amount).toString(), network.decimals), - // value: parseFloat(activity.amount).toFixed(network.decimals), - // value: toBase(parseFloat(activity.amount), network.decimals), // AINDA NAO RESOLVI - transactionHash: activity.requestKey, - type: ActivityType.transaction, - token: { - decimals: network.decimals, - icon: network.icon, - name: network.currencyNameLong, - symbol: - activity.token !== "coin" ? activity.token : network.currencyName, - price: price, - }, - }; - return tt; - }); + return activities + .filter((a) => a.idx === 1) // idx === 0 is the gas fee activity + .map((activity: any, i: number) => { + const tt = { + nonce: i.toString(), + from: activity.fromAccount, + to: activity.toAccount, + isIncoming: activity.fromAccount !== address, + network: network.name, + rawInfo: activity, + status: ActivityStatus.success, + timestamp: new Date(activity.blockTime).getTime(), + value: formatFloatingPointValue(new BigNumber(activity.amount)).value, + transactionHash: activity.requestKey, + type: ActivityType.transaction, + token: { + decimals: network.decimals, + icon: network.icon, + name: network.currencyNameLong, + symbol: + activity.token !== "coin" ? activity.token : network.currencyName, + price: price, + }, + }; + return tt; + }); }; diff --git a/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue b/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue index f176db6ac..9da4f87d7 100644 --- a/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue +++ b/packages/extension/src/ui/action/views/network-activity/components/network-activity-transaction.vue @@ -44,14 +44,7 @@

- {{ - $filters.formatFloatingPointValue( - fromBase( - parseInt(activity.value).toString(), - activity.token.decimals - ) - ).value - }} + {{ activity.value }} {{ activity.token.symbol }}

$ {{ $filters.formatFiatValue(getFiatValue).value }}

From fae6cf5f2506a665e3e3cca1f41c14a0333030f4 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Thu, 21 Sep 2023 17:37:40 -0400 Subject: [PATCH 035/375] WIP - Update Kadena inject --- packages/extension/src/providers/kadena/index.ts | 10 +++++----- .../providers/kadena/methods/dot_accounts_get.ts | 16 ++++++++++++++++ .../src/providers/kadena/methods/index.ts | 2 ++ packages/extension/src/scripts/inject.ts | 6 ++++++ packages/extension/src/types/provider.ts | 10 ++++++++-- 5 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 packages/extension/src/providers/kadena/methods/dot_accounts_get.ts create mode 100644 packages/extension/src/providers/kadena/methods/index.ts diff --git a/packages/extension/src/providers/kadena/index.ts b/packages/extension/src/providers/kadena/index.ts index bbfe2133d..f3608e87a 100644 --- a/packages/extension/src/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/index.ts @@ -1,6 +1,6 @@ import getRequestProvider, { RequestClass } from "@enkryptcom/request"; import { MiddlewareFunction, OnMessageResponse } from "@enkryptcom/types"; -// import Middlewares from "./methods"; +import Middlewares from "./methods"; import EventEmitter from "eventemitter3"; import { BackgroundProviderInterface, @@ -25,7 +25,7 @@ class KadenaProvider constructor(toWindow: (message: string) => void) { super(); - // this.setMiddleWares(); + this.setMiddleWares(); this.requestProvider = getRequestProvider("", this.middlewares); this.toWindow = toWindow; this.requestProvider.on("notification", (notif: any) => { @@ -35,9 +35,9 @@ class KadenaProvider this.KeyRing = new PublicKeyRing(); } - // private setMiddleWares(): void { - // this.middlewares = Middlewares.map((mw) => mw.bind(this)); - // } + private setMiddleWares(): void { + this.middlewares = Middlewares.map((mw) => mw.bind(this)); + } setRequestProvider(network: BaseNetwork): void { this.requestProvider.disconnect(); diff --git a/packages/extension/src/providers/kadena/methods/dot_accounts_get.ts b/packages/extension/src/providers/kadena/methods/dot_accounts_get.ts new file mode 100644 index 000000000..7a452fbf6 --- /dev/null +++ b/packages/extension/src/providers/kadena/methods/dot_accounts_get.ts @@ -0,0 +1,16 @@ +import { MiddlewareFunction } from "@enkryptcom/types"; +import KadenaProvider from ".."; +import { ProviderRPCRequest } from "@/types/provider"; + +const method: MiddlewareFunction = function ( + this: KadenaProvider, + payload: ProviderRPCRequest, + res, + next +): void { + if (payload.method !== "dot_accounts_get") return next(); + else { + console.log("Test"); + } +}; +export default method; diff --git a/packages/extension/src/providers/kadena/methods/index.ts b/packages/extension/src/providers/kadena/methods/index.ts new file mode 100644 index 000000000..18d5215b5 --- /dev/null +++ b/packages/extension/src/providers/kadena/methods/index.ts @@ -0,0 +1,2 @@ +import dotAccountsGet from "./dot_accounts_get"; +export default [dotAccountsGet]; diff --git a/packages/extension/src/scripts/inject.ts b/packages/extension/src/scripts/inject.ts index cc1a98631..5b3186114 100644 --- a/packages/extension/src/scripts/inject.ts +++ b/packages/extension/src/scripts/inject.ts @@ -7,6 +7,7 @@ import { ProviderName, ProviderType } from "@/types/provider"; import EthereumProvider from "@/providers/ethereum/inject"; import PolkadotProvider from "@/providers/polkadot/inject"; import BitcoinProvider from "@/providers/bitcoin/inject"; +import KadenaProvider from "@/providers/kadena/inject"; import { InternalMethods } from "@/types/messenger"; @@ -31,6 +32,11 @@ const loadInjectedProviders = () => { type: ProviderType.bitcoin, sendMessageHandler: providerSendMessage, }); + KadenaProvider(window, { + name: ProviderName.kadena, + type: ProviderType.kadena, + sendMessageHandler: providerSendMessage, + }); }; loadInjectedProviders(); diff --git a/packages/extension/src/types/provider.ts b/packages/extension/src/types/provider.ts index f4d00e838..9ed08d0ac 100644 --- a/packages/extension/src/types/provider.ts +++ b/packages/extension/src/types/provider.ts @@ -1,6 +1,7 @@ import type { InjectedProvider as EthereumProvider } from "../providers/ethereum/types"; import type { InjectedProvider as PolkadotProvider } from "@/providers/polkadot/types"; import type { InjectedProvider as BitcoinProvider } from "@/providers/bitcoin/types"; +import type { InjectedProvider as KadenaProvider } from "@/providers/kadena/types"; import EventEmitter from "eventemitter3"; import { EXTENSION_VERSION } from "@/configs/constants"; import { @@ -50,6 +51,7 @@ export enum ProviderType { evm, substrate, bitcoin, + kadena, } export type SendMessageHandler = ( @@ -126,8 +128,12 @@ export type handleOutgoingMessage = ( provider: Provider, message: string ) => Promise; -export { EthereumProvider, PolkadotProvider, BitcoinProvider }; -export type Provider = EthereumProvider | PolkadotProvider | BitcoinProvider; +export { EthereumProvider, PolkadotProvider, BitcoinProvider, KadenaProvider }; +export type Provider = + | EthereumProvider + | PolkadotProvider + | BitcoinProvider + | KadenaProvider; export interface ProviderRequestOptions { url: string; From 878b03365911d3329ec4f52b8c0327a45a2c8b35 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Mon, 25 Sep 2023 10:53:55 -0300 Subject: [PATCH 036/375] Better error message on UI --- .../ui/send-transaction/verify-transaction/index.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue index 3a530da7b..1dd33467b 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue @@ -12,6 +12,13 @@
+

+ {{ errorMsg }} +

Double check the information and confirm transaction

@@ -32,7 +39,6 @@ /> - {{ errorMsg }}

@@ -192,7 +198,9 @@ const sendAction = async () => { } catch (error: any) { isProcessing.value = false; console.error("error", error); - errorMsg.value = JSON.stringify(error); + errorMsg.value = `Error: ${ + error.message || "Could not send the transaction" + }`; } }; From ab56fd0162e7a7ba5d358b86e50adf0f3ba1c657 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Mon, 25 Sep 2023 14:57:55 -0400 Subject: [PATCH 037/375] update background index --- packages/extension/src/libs/background/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/extension/src/libs/background/index.ts b/packages/extension/src/libs/background/index.ts index 3422f5050..992ff4a37 100644 --- a/packages/extension/src/libs/background/index.ts +++ b/packages/extension/src/libs/background/index.ts @@ -44,6 +44,7 @@ class BackgroundHandler { [ProviderName.ethereum]: {}, [ProviderName.polkadot]: {}, [ProviderName.bitcoin]: {}, + [ProviderName.kadena]: {}, }; this.#providers = Providers; } From 4c67de43133d9fa58c342394f5004b05c928a80c Mon Sep 17 00:00:00 2001 From: Glaicon Date: Mon, 25 Sep 2023 16:14:31 -0400 Subject: [PATCH 038/375] add acounts-states for kadena --- .../kadena/libs/accounts-state/index.ts | 59 +++++++++++++++++++ .../kadena/libs/accounts-state/types.ts | 6 ++ packages/extension/src/types/provider.ts | 1 + 3 files changed, 66 insertions(+) create mode 100644 packages/extension/src/providers/kadena/libs/accounts-state/index.ts create mode 100644 packages/extension/src/providers/kadena/libs/accounts-state/types.ts diff --git a/packages/extension/src/providers/kadena/libs/accounts-state/index.ts b/packages/extension/src/providers/kadena/libs/accounts-state/index.ts new file mode 100644 index 000000000..ba84a0e05 --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/accounts-state/index.ts @@ -0,0 +1,59 @@ +import { InternalStorageNamespace } from "@/types/provider"; +import BrowserStorage from "@/libs/common/browser-storage"; +import { IState, StorageKeys } from "./types"; +class AccountState { + #storage: BrowserStorage; + constructor() { + this.#storage = new BrowserStorage( + InternalStorageNamespace.kadenaAccountsState + ); + } + async addApprovedDomain(domain: string): Promise { + const state = await this.getStateByDomain(domain); + state.isApproved = true; + await this.setState(state, domain); + } + async removeApprovedDomain(domain: string): Promise { + const state = await this.getStateByDomain(domain); + state.isApproved = false; + await this.setState(state, domain); + } + async isApproved(domain: string): Promise { + const state = await this.getStateByDomain(domain); + return state.isApproved; + } + async deleteState(domain: string): Promise { + const allStates = await this.getAllStates(); + if (allStates[domain]) { + delete allStates[domain]; + await this.#storage.set(StorageKeys.accountsState, allStates); + } + } + async isConnected(domain: string): Promise { + return this.getStateByDomain(domain).then((res) => res.isApproved); + } + async deleteAllStates(): Promise { + return await this.#storage.remove(StorageKeys.accountsState); + } + async setState(state: IState, domain: string): Promise { + const allStates = await this.getAllStates(); + allStates[domain] = state; + await this.#storage.set(StorageKeys.accountsState, allStates); + } + async getStateByDomain(domain: string): Promise { + const allStates: Record = await this.getAllStates(); + if (!allStates[domain]) + return { + isApproved: false, + }; + else return allStates[domain]; + } + async getAllStates(): Promise> { + const allStates: Record = await this.#storage.get( + StorageKeys.accountsState + ); + if (!allStates) return {}; + return allStates; + } +} +export default AccountState; diff --git a/packages/extension/src/providers/kadena/libs/accounts-state/types.ts b/packages/extension/src/providers/kadena/libs/accounts-state/types.ts new file mode 100644 index 000000000..b20ca5a8a --- /dev/null +++ b/packages/extension/src/providers/kadena/libs/accounts-state/types.ts @@ -0,0 +1,6 @@ +export enum StorageKeys { + accountsState = "kadena-accounts-state", +} +export interface IState { + isApproved: boolean; +} diff --git a/packages/extension/src/types/provider.ts b/packages/extension/src/types/provider.ts index 9ed08d0ac..52a1a39a3 100644 --- a/packages/extension/src/types/provider.ts +++ b/packages/extension/src/types/provider.ts @@ -33,6 +33,7 @@ export enum InternalStorageNamespace { evmAccountsState = "EVMAccountsState", substrateAccountsState = "SubstrateAccountsState", bitcoinAccountsState = "BitcoinAccountsState", + kadenaAccountsState = "KadenaAccountsState", activityState = "ActivityState", marketData = "MarketData", cacheFetch = "CacheFetch", From d4e9d936b371332dd3061269303898dce3261069 Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Mon, 25 Sep 2023 17:46:59 -0300 Subject: [PATCH 039/375] Creating accounts get UI for Kadena --- .../kadena/methods/dot_accounts_get.ts | 86 ++++++++++++++++++- .../src/providers/kadena/ui/kda-accounts.vue | 6 +- .../src/providers/kadena/ui/routes/index.ts | 10 ++- 3 files changed, 93 insertions(+), 9 deletions(-) diff --git a/packages/extension/src/providers/kadena/methods/dot_accounts_get.ts b/packages/extension/src/providers/kadena/methods/dot_accounts_get.ts index 7a452fbf6..e03b460ea 100644 --- a/packages/extension/src/providers/kadena/methods/dot_accounts_get.ts +++ b/packages/extension/src/providers/kadena/methods/dot_accounts_get.ts @@ -1,6 +1,21 @@ -import { MiddlewareFunction } from "@enkryptcom/types"; +import { + CallbackFunction, + MiddlewareFunction, + SignerType, +} from "@enkryptcom/types"; import KadenaProvider from ".."; +import { WindowPromise } from "@/libs/window-promise"; +import PublicKeyRing from "@/libs/keyring/public-keyring"; +import AccountState from "../libs/accounts-state"; import { ProviderRPCRequest } from "@/types/provider"; +import { getCustomError } from "@/libs/error"; + +let isAccountAccessPending = false; + +const pendingPromises: { + payload: ProviderRPCRequest; + res: CallbackFunction; +}[] = []; const method: MiddlewareFunction = function ( this: KadenaProvider, @@ -10,7 +25,74 @@ const method: MiddlewareFunction = function ( ): void { if (payload.method !== "dot_accounts_get") return next(); else { - console.log("Test"); + if (isAccountAccessPending) { + pendingPromises.push({ + payload, + res, + }); + return; + } + + isAccountAccessPending = true; + + const handleRemainingPromises = () => { + isAccountAccessPending = false; + + if (pendingPromises.length) { + const promi = pendingPromises.pop(); + if (promi) handleAccountAccess(promi.payload, promi.res); + } + }; + + const getAccounts = () => { + const publicKeyring = new PublicKeyRing(); + + return publicKeyring.getAccounts([SignerType.ed25519kda]).then((acc) => { + return acc.map((acc) => { + return { + address: acc.address, + genesisHash: "", + name: acc.name, + type: acc.signerType, + }; + }); + }); + }; + + const handleAccountAccess = ( + _payload: ProviderRPCRequest, + _res: CallbackFunction + ) => { + if (_payload.options && _payload.options.domain) { + isAccountAccessPending = true; + const accountsState = new AccountState(); + + accountsState.isApproved(_payload.options.domain).then((isApproved) => { + if (isApproved) { + getAccounts().then((acc) => { + _res(null, acc); + handleRemainingPromises(); + }); + } else { + const windowPromise = new WindowPromise(); + windowPromise + .getResponse( + this.getUIPath(this.UIRoutes.dotAccounts.path), + JSON.stringify(payload) + ) + .then(({ error }) => { + if (error) res(error); + else getAccounts().then((acc) => res(null, acc)); + }) + .finally(handleRemainingPromises); + } + }); + } else { + _res(getCustomError("No domain set!")); + } + }; + + handleAccountAccess(payload, res); } }; export default method; diff --git a/packages/extension/src/providers/kadena/ui/kda-accounts.vue b/packages/extension/src/providers/kadena/ui/kda-accounts.vue index e4ee8866f..34e55b0ae 100644 --- a/packages/extension/src/providers/kadena/ui/kda-accounts.vue +++ b/packages/extension/src/providers/kadena/ui/kda-accounts.vue @@ -64,13 +64,13 @@ import { WindowPromiseHandler } from "@/libs/window-promise"; import { ProviderRequestOptions } from "@/types/provider"; import { getError } from "@/libs/error"; import AccountState from "../libs/accounts-state"; -import { SubstrateNetwork } from "../types/substrate-network"; +import { KadenaNetwork } from "../types/kadena-network"; import { ErrorCodes } from "@/providers/ethereum/types"; import { truncate } from "lodash"; -import Polkadot from "@/providers/polkadot/networks/polkadot"; +import Kadena from "@/providers/kadena/networks/kadena"; const windowPromise = WindowPromiseHandler(0); -const network = ref(Polkadot); +const network = ref(Kadena); const Options = ref({ domain: "", diff --git a/packages/extension/src/providers/kadena/ui/routes/index.ts b/packages/extension/src/providers/kadena/ui/routes/index.ts index ba2b02ae8..b63fffa15 100644 --- a/packages/extension/src/providers/kadena/ui/routes/index.ts +++ b/packages/extension/src/providers/kadena/ui/routes/index.ts @@ -1,16 +1,18 @@ -import dotAccounts from "../dot-accounts.vue"; -import dotSignMessage from "../dot-sign-message.vue"; -import dotUpdateMetadata from "../dot-update-metadata.vue"; -import dotVerifyTransaction from "../dot-verify-transaction.vue"; +import dotAccounts from "../kda-accounts.vue"; +import dotSignMessage from "../kda-sign-message.vue"; +import dotUpdateMetadata from "../kda-update-metadata.vue"; +import dotVerifyTransaction from "../kda-verify-transaction.vue"; import dotHWVerify from "../send-transaction/verify-transaction/index.vue"; import { RouteRecordRaw } from "vue-router"; import RouteNames from "./names"; + const routes = Object.assign({}, RouteNames); routes.dotAccounts.component = dotAccounts; routes.dotTxApprove.component = dotVerifyTransaction; routes.dotSignMessage.component = dotSignMessage; routes.dotUpdateMetadata.component = dotUpdateMetadata; routes.dotHWVerify.component = dotHWVerify; + export default (namespace: string): RouteRecordRaw[] => { return Object.values(routes).map((route) => { route.path = `/${namespace}/${route.path}`; From 45c6acf0d0ab5ce24fd279a56d292d68f4cbd073 Mon Sep 17 00:00:00 2001 From: Glaicon Date: Mon, 25 Sep 2023 17:52:31 -0400 Subject: [PATCH 040/375] WIP - update provider pages --- .../providers/kadena/ui/kda-sign-message.vue | 2 +- .../kadena/ui/kda-update-metadata.vue | 4 +- .../kadena/ui/kda-verify-transaction.vue | 381 ------------------ .../src/providers/kadena/ui/routes/index.ts | 1 - .../extension/src/ui/provider-pages/routes.ts | 3 +- 5 files changed, 5 insertions(+), 386 deletions(-) delete mode 100644 packages/extension/src/providers/kadena/ui/kda-verify-transaction.vue diff --git a/packages/extension/src/providers/kadena/ui/kda-sign-message.vue b/packages/extension/src/providers/kadena/ui/kda-sign-message.vue index 3e4d308af..172fc04cd 100644 --- a/packages/extension/src/providers/kadena/ui/kda-sign-message.vue +++ b/packages/extension/src/providers/kadena/ui/kda-sign-message.vue @@ -9,7 +9,7 @@
- -
diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue index 65b8ffc66..2703f91fc 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-token-item.vue @@ -26,7 +26,6 @@ + + diff --git a/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue b/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue index 58e8a9dad..fbb15dc11 100644 --- a/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue +++ b/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue @@ -9,20 +9,27 @@ - - -
-

{{ "Chain 1" }}

-
- -
-
+
+ + + +
+

- {{ cryptoAmount }} {{ symbol }} + {{ cryptoAmount }} {{ network.currencyName }}

-

{{ fiatAmount }}

+

+ {{ currentChainId }} · + {{ fiatAmount }} +

diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 24ce15fb2..36440f385 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -8,14 +8,6 @@ -

- {{ errorMsg }} -

- + +
@@ -111,6 +105,7 @@ import SendTokenSelect from "./components/send-token-select.vue"; import AssetsSelectList from "@action/views/assets-select-list/index.vue"; import SendInputAmount from "./components/send-input-amount.vue"; import SendFeeSelect from "./components/send-fee-select.vue"; +import SendAlert from "./components/send-alert.vue"; import BaseButton from "@action/components/base-button/index.vue"; import { AccountsHeaderData } from "@action/types/account"; import { GasFeeInfo } from "@/providers/ethereum/ui/types"; diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue index cfe500b6e..cf577fa63 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/verify-transaction/index.vue @@ -12,13 +12,7 @@
-

- {{ errorMsg }} -

+

Double check the information and confirm transaction

@@ -42,6 +36,10 @@
+
+ +
+
{ right: 0 !important; } } + + &__error { + position: absolute; + top: 480px; + width: 100%; + background-color: white; + } } From 046886a70c826ec4d50c3b32a6167df52d3e834c Mon Sep 17 00:00:00 2001 From: Andre Borges Medeiros Date: Tue, 6 Feb 2024 14:26:59 -0300 Subject: [PATCH 154/375] Linting issues --- .../kadena/ui/send-transaction/components/send-alert.vue | 2 +- .../src/providers/kadena/ui/send-transaction/index.vue | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-alert.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-alert.vue index a58e4c045..627b1588b 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-alert.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-alert.vue @@ -12,7 +12,7 @@ interface IProps { errorMsg: string; } -const props = defineProps(); +defineProps(); + + + + + + + + + + + + + diff --git a/packages/extension/src/providers/ethereum/networks/icons/sys_rollux.svg b/packages/extension/src/providers/ethereum/networks/icons/sys_rollux.svg new file mode 100644 index 000000000..40f6876f6 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/icons/sys_rollux.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + diff --git a/packages/extension/src/providers/ethereum/networks/icons/tsys_nevm.svg b/packages/extension/src/providers/ethereum/networks/icons/tsys_nevm.svg new file mode 100644 index 000000000..82f6622ff --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/icons/tsys_nevm.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/packages/extension/src/providers/ethereum/networks/icons/tsys_rollux.svg b/packages/extension/src/providers/ethereum/networks/icons/tsys_rollux.svg new file mode 100644 index 000000000..5650aa0a4 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/icons/tsys_rollux.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + From 0bfd4ce15ca72a9c09a785c4cac9bf7719d2abb9 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 1 May 2024 11:43:57 -0700 Subject: [PATCH 169/375] fix: eth_accounts --- .../ethereum/methods/eth_accounts.ts | 111 ++++-------------- .../ethereum/methods/eth_requestAccounts.ts | 99 ++++++++++++++++ .../src/providers/ethereum/methods/index.ts | 2 + .../src/ui/action/views/lock-screen/index.vue | 4 - 4 files changed, 123 insertions(+), 93 deletions(-) create mode 100644 packages/extension/src/providers/ethereum/methods/eth_requestAccounts.ts diff --git a/packages/extension/src/providers/ethereum/methods/eth_accounts.ts b/packages/extension/src/providers/ethereum/methods/eth_accounts.ts index a7fea6127..a20cc7959 100644 --- a/packages/extension/src/providers/ethereum/methods/eth_accounts.ts +++ b/packages/extension/src/providers/ethereum/methods/eth_accounts.ts @@ -1,110 +1,43 @@ -import { CallbackFunction, MiddlewareFunction } from "@enkryptcom/types"; +import { MiddlewareFunction } from "@enkryptcom/types"; import type EthereumProvider from ".."; import { ProviderRPCRequest } from "@/types/provider"; -import { WindowPromise } from "@/libs/window-promise"; import AccountState from "../libs/accounts-state"; import { getCustomError } from "@/libs/error"; import openOnboard from "@/libs/utils/open-onboard"; -let isAccountAccessPending = false; import { throttle } from "lodash"; const throttledOpenOnboard = throttle(() => openOnboard(), 10000); -const existingErrors: Record = {}; -const pendingPromises: { - payload: ProviderRPCRequest; - res: CallbackFunction; -}[] = []; const method: MiddlewareFunction = async function ( this: EthereumProvider, payload: ProviderRPCRequest, res, next ): Promise { - if ( - payload.method !== "eth_accounts" && - payload.method !== "eth_requestAccounts" && - payload.method !== "eth_coinbase" - ) + if (payload.method !== "eth_accounts" && payload.method !== "eth_coinbase") return next(); else { - if (isAccountAccessPending) { - pendingPromises.push({ - payload, - res, - }); - return; - } - isAccountAccessPending = true; const isInitialized = await this.KeyRing.isInitialized(); - - const handleRemainingPromises = () => { - isAccountAccessPending = false; - if (pendingPromises.length) { - const promi = pendingPromises.pop(); - if (promi) handleAccountAccess(promi.payload, promi.res); + if (payload.options && payload.options.domain) { + if (!isInitialized) { + res(null, payload.method === "eth_coinbase" ? "" : []); + return throttledOpenOnboard(); } - }; - const handleAccountAccess = ( - _payload: ProviderRPCRequest, - _res: CallbackFunction - ) => { - if (_payload.options && _payload.options.domain) { - isAccountAccessPending = true; - if (!isInitialized) { - _res(getCustomError("Enkrypt not initialized")); - throttledOpenOnboard(); - return handleRemainingPromises(); - } - const accountsState = new AccountState(); - if ( - existingErrors[_payload.options.domain] && - existingErrors[_payload.options.domain].time > - new Date().getTime() - 2000 - ) { - _res(existingErrors[_payload.options.domain].error as any); - return handleRemainingPromises(); - } - accountsState - .getApprovedAddresses(_payload.options.domain) - .then((accounts) => { - if (accounts.length) { - _res( - null, - payload.method === "eth_coinbase" ? accounts[0] : accounts - ); - handleRemainingPromises(); - } else { - const windowPromise = new WindowPromise(); - windowPromise - .getResponse( - this.getUIPath(this.UIRoutes.ethConnectDApp.path), - JSON.stringify({ - ..._payload, - params: [this.network.name], - }) - ) - .then(({ error, result }) => { - if (error) { - existingErrors[_payload.options!.domain] = { - time: new Date().getTime(), - error, - }; - return _res(error as any); - } - const accounts = JSON.parse(result || "[]"); - _res( - null, - payload.method === "eth_coinbase" ? accounts[0] : accounts - ); - }) - .finally(handleRemainingPromises); - } - }); - } else { - _res(getCustomError("No domain set!")); - } - }; - handleAccountAccess(payload, res); + const accountsState = new AccountState(); + accountsState + .getApprovedAddresses(payload.options.domain) + .then((accounts) => { + if (accounts.length) { + res( + null, + payload.method === "eth_coinbase" ? accounts[0] : accounts + ); + } else { + res(null, payload.method === "eth_coinbase" ? "" : []); + } + }); + } else { + res(getCustomError("No domain set!")); + } } }; export default method; diff --git a/packages/extension/src/providers/ethereum/methods/eth_requestAccounts.ts b/packages/extension/src/providers/ethereum/methods/eth_requestAccounts.ts new file mode 100644 index 000000000..2436c660a --- /dev/null +++ b/packages/extension/src/providers/ethereum/methods/eth_requestAccounts.ts @@ -0,0 +1,99 @@ +import { CallbackFunction, MiddlewareFunction } from "@enkryptcom/types"; +import type EthereumProvider from ".."; +import { ProviderRPCRequest } from "@/types/provider"; +import { WindowPromise } from "@/libs/window-promise"; +import AccountState from "../libs/accounts-state"; +import { getCustomError } from "@/libs/error"; +import openOnboard from "@/libs/utils/open-onboard"; +let isAccountAccessPending = false; +import { throttle } from "lodash"; + +const throttledOpenOnboard = throttle(() => openOnboard(), 10000); +const existingErrors: Record = {}; +const pendingPromises: { + payload: ProviderRPCRequest; + res: CallbackFunction; +}[] = []; +const method: MiddlewareFunction = async function ( + this: EthereumProvider, + payload: ProviderRPCRequest, + res, + next +): Promise { + if (payload.method !== "eth_requestAccounts") return next(); + else { + if (isAccountAccessPending) { + pendingPromises.push({ + payload, + res, + }); + return; + } + isAccountAccessPending = true; + const isInitialized = await this.KeyRing.isInitialized(); + + const handleRemainingPromises = () => { + isAccountAccessPending = false; + if (pendingPromises.length) { + const promi = pendingPromises.pop(); + if (promi) handleAccountAccess(promi.payload, promi.res); + } + }; + const handleAccountAccess = ( + _payload: ProviderRPCRequest, + _res: CallbackFunction + ) => { + if (_payload.options && _payload.options.domain) { + isAccountAccessPending = true; + if (!isInitialized) { + _res(getCustomError("Enkrypt not initialized")); + throttledOpenOnboard(); + return handleRemainingPromises(); + } + const accountsState = new AccountState(); + if ( + existingErrors[_payload.options.domain] && + existingErrors[_payload.options.domain].time > + new Date().getTime() - 2000 + ) { + _res(existingErrors[_payload.options.domain].error as any); + return handleRemainingPromises(); + } + accountsState + .getApprovedAddresses(_payload.options.domain) + .then((accounts) => { + if (accounts.length) { + _res(null, accounts); + handleRemainingPromises(); + } else { + const windowPromise = new WindowPromise(); + windowPromise + .getResponse( + this.getUIPath(this.UIRoutes.ethConnectDApp.path), + JSON.stringify({ + ..._payload, + params: [this.network.name], + }) + ) + .then(({ error, result }) => { + if (error) { + existingErrors[_payload.options!.domain] = { + time: new Date().getTime(), + error, + }; + return _res(error as any); + } + const accounts = JSON.parse(result || "[]"); + _res(null, accounts); + }) + .finally(handleRemainingPromises); + } + }); + } else { + _res(getCustomError("No domain set!")); + } + }; + handleAccountAccess(payload, res); + } +}; +export default method; diff --git a/packages/extension/src/providers/ethereum/methods/index.ts b/packages/extension/src/providers/ethereum/methods/index.ts index 8f5a84578..d24ab7f8c 100644 --- a/packages/extension/src/providers/ethereum/methods/index.ts +++ b/packages/extension/src/providers/ethereum/methods/index.ts @@ -13,6 +13,7 @@ import watchAsset from "./wallet_watchAsset"; import walletRequestPermissions from "./wallet_requestPermissions"; import ethSendRawTransaction from "./eth_sendRawTransaction"; import enkryptGetPublickKey from "./enkrypt_getPublicKey"; +import ethRequestAccounts from "./eth_requestAccounts"; export default [ ethSendTransaction, ethSign, @@ -29,4 +30,5 @@ export default [ walletRequestPermissions, ethSendRawTransaction, enkryptGetPublickKey, + ethRequestAccounts, ]; diff --git a/packages/extension/src/ui/action/views/lock-screen/index.vue b/packages/extension/src/ui/action/views/lock-screen/index.vue index b992098da..44fe29445 100644 --- a/packages/extension/src/ui/action/views/lock-screen/index.vue +++ b/packages/extension/src/ui/action/views/lock-screen/index.vue @@ -52,10 +52,6 @@ import { sendToBackgroundFromAction } from "@/libs/messenger/extension"; import { InternalMethods } from "@/types/messenger"; import { computed } from "@vue/reactivity"; import SwapLookingAnimation from "@action/icons/swap/swap-looking-animation.vue"; -import BitcoinNetworks from "@/providers/bitcoin/networks"; -import KeyRing from "@/libs/keyring/keyring"; -import { NetworkNames, WalletType } from "@enkryptcom/types"; -import { getAccountsByNetworkName } from "@/libs/utils/accounts"; import { trackGenericEvents } from "@/libs/metrics"; import { GenericEvents } from "@/libs/metrics/types"; From a94dc2d77e4c8e2deb623610c50ed3184be5aee0 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 1 May 2024 12:09:48 -0700 Subject: [PATCH 170/375] devop: minor changes --- .../libs/activity-handlers/providers/kadena/index.ts | 11 ----------- .../extension/src/providers/kadena/types/kda-token.ts | 2 +- .../accounts-header/components/header-accounts.vue | 1 - 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts index c3b446eff..d3c9ff4b8 100644 --- a/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts +++ b/packages/extension/src/providers/kadena/libs/activity-handlers/providers/kadena/index.ts @@ -3,7 +3,6 @@ import MarketData from "@/libs/market-data"; import { Activity, ActivityStatus, ActivityType } from "@/types/activity"; import { BaseNetwork } from "@/types/base-network"; import { NetworkEndpoints, NetworkTtls } from "./configs"; -import ActivityState from "@/libs/activity-state"; import { toBase } from "@enkryptcom/utils"; const getAddressActivity = async ( @@ -30,16 +29,6 @@ export default async ( const networkName = network.name as keyof typeof NetworkEndpoints; const enpoint = NetworkEndpoints[networkName]; const ttl = NetworkTtls[networkName]; - - const activityState = new ActivityState(); - const options = { - address: address, - network: network.name, - }; - const allActivities = await activityState.getAllActivities(options); - // disabling this as there is a bug removing activities - // querying from height=zero should remedy it temporarily - // const lastActivity = allActivities[allActivities.length - 1] as any; const activities = await getAddressActivity( address, enpoint, diff --git a/packages/extension/src/providers/kadena/types/kda-token.ts b/packages/extension/src/providers/kadena/types/kda-token.ts index 07f7c3e5b..1d286f7d4 100644 --- a/packages/extension/src/providers/kadena/types/kda-token.ts +++ b/packages/extension/src/providers/kadena/types/kda-token.ts @@ -57,7 +57,7 @@ export class KDAToken extends KDABaseToken { network: KadenaNetwork ): Promise { to = network.displayAddress(to); - const accountDetails = await this.getAccountDetails(to, network); + // const accountDetails = await this.getAccountDetails(to, network); const api = (await network.api()) as KadenaAPI; const chainID = await api.getChainId(); const keySetAccount = to.startsWith("k:") ? to.replace("k:", "") : to; diff --git a/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue b/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue index c4b098cf3..0bf7751b5 100644 --- a/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue +++ b/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue @@ -150,7 +150,6 @@ const checkAndSetConnectedDapp = () => { const checkAndSetSubNetwork = () => { if (props.network.subNetworks) { domainState.getSelectedSubNetWork().then((id) => { - console.log(id); if (id) { const subnet = props.network.subNetworks!.find((net) => net.id === id); if (subnet) currentSubNetwork.value = subnet; From abd4cf20e945d9172c3801bc239825ea664de550 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 1 May 2024 12:32:24 -0700 Subject: [PATCH 171/375] fix: dot sigs --- .../src/providers/polkadot/methods/dot_signer_signRaw.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts b/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts index b06aea475..2654246e2 100644 --- a/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts +++ b/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts @@ -1,7 +1,7 @@ import { MiddlewareFunction } from "@enkryptcom/types"; import SubstrateProvider from ".."; import { ProviderRPCRequest } from "@/types/provider"; -import { polkadotEncodeAddress } from "@enkryptcom/utils"; +import { polkadotEncodeAddress, utf8ToHex } from "@enkryptcom/utils"; import { SignerPayloadRaw } from "@polkadot/types/types"; import { getCustomError } from "@/libs/error"; import { WindowPromise } from "@/libs/window-promise"; @@ -13,11 +13,16 @@ const method: MiddlewareFunction = function ( ): void { if (payload.method !== "dot_signer_signRaw") return next(); else { + console.log(payload); if (!payload.params?.length) return res(getCustomError("Missing Params: signer_signPayload")); const reqPayload = payload.params[0] as SignerPayloadRaw; if (reqPayload.type !== "bytes" && reqPayload.type !== "payload") return res(getCustomError("type is not bytes: signer_signRaw")); + const data = + reqPayload.type === "payload" + ? utf8ToHex(reqPayload.data) + : reqPayload.data; this.KeyRing.getAccount(polkadotEncodeAddress(reqPayload.address)).then( (account) => { const windowPromise = new WindowPromise(); @@ -26,7 +31,7 @@ const method: MiddlewareFunction = function ( this.getUIPath(this.UIRoutes.dotSignMessage.path), JSON.stringify({ ...payload, - params: [reqPayload.data, account], + params: [data, account], }), true ) From e56bd10cbd701752f46ceb6977b354197846dad1 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 2 May 2024 12:03:33 -0700 Subject: [PATCH 172/375] fix: qa issues --- .../components/send-input-amount.vue | 5 +-- .../kadena/ui/send-transaction/index.vue | 39 +++++++++---------- packages/extension/src/ui/action/App.vue | 5 ++- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue index d163cf024..8124653ea 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue @@ -7,7 +7,6 @@ :class="{ error: !isValid }" @focus="changeFocus" @blur="changeFocus" - @input="emit('update:inputSetMax', false)" />
@@ -15,7 +14,7 @@ ${{ $filters.formatFiatValue(fiatEquivalent).value }}
- + Max
@@ -28,7 +27,7 @@ import BigNumber from "bignumber.js"; const emit = defineEmits<{ (e: "update:inputAmount", address: string | undefined): void; - (e: "update:inputSetMax", max: boolean): void; + (e: "update:inputSetMax"): void; }>(); const isFocus = ref(false); diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 433c010f6..44f7c51be 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -34,7 +34,7 @@ ref="addressInputTo" :value="addressTo" :network="network" - :is-address="fieldsValidation.addressTo.valueOf" + :is-address="fieldsValidation.addressTo" @update:input-address="inputAddressTo" @toggle:show-contacts="toggleSelectContactTo" /> @@ -66,7 +66,7 @@ @@ -181,7 +181,7 @@ onMounted(() => { const validateFields = async () => { errorMsg.value = ""; - + fee.value = null; fieldsValidation.value = { addressTo: true, amount: true, @@ -214,10 +214,13 @@ const validateFields = async () => { errorMsg.value = '"To" address cannot be the same as "From" address'; return; } + } else { + fieldsValidation.value.addressTo = false; + return; } let rawAmount = toBN(toBase("0", selectedAsset.value.decimals!)); - + const minAmount = toBN(toBase("0.000001", props.network.decimals)); if (amount.value) { if (!isValidDecimals(amount.value, selectedAsset.value.decimals!)) { fieldsValidation.value.amount = false; @@ -229,21 +232,21 @@ const validateFields = async () => { toBase(amount.value.toString(), selectedAsset.value.decimals!) ); - if (rawAmount.lten(0)) { + if (rawAmount.lt(minAmount)) { fieldsValidation.value.amount = false; - errorMsg.value = "Amount must be greater than 0"; + errorMsg.value = "Amount must be greater than 0.000001"; return; } } - if (amount.value || sendMax.value) { const localTransaction = await selectedAsset.value.buildTransaction!( addressTo.value, props.accountInfo.selectedAccount, - sendMax.value ? "0.000000000001" : amount.value!, + sendMax.value + ? fromBase(minAmount.toString(), props.network.decimals) + : amount.value!, props.network ); - const networkApi = (await props.network.api()) as KadenaAPI; const transactionResult = await networkApi.sendLocalTransaction( @@ -272,7 +275,6 @@ const validateFields = async () => { selectedAsset.value.name === accountAssets.value[0].name ) { rawAmount = rawBalance.sub(rawFee); - if (rawAmount.gtn(0)) { amount.value = fromBase( rawAmount.toString(), @@ -307,7 +309,7 @@ const validateFields = async () => { } }; -watch([selectedAsset, addressTo, amount, sendMax], validateFields); +watch([selectedAsset, addressTo, amount], validateFields); watch(addressFrom, () => { fetchTokens(); @@ -408,15 +410,9 @@ const sendButtonTitle = computed(() => { return title; }); -const setSendMax = (max: boolean) => { - if (!max) { - sendMax.value = false; - return; - } - - if (selectedAsset.value) { - sendMax.value = true; - } +const setSendMax = () => { + sendMax.value = true; + validateFields(); }; const isDisabled = computed(() => { @@ -424,7 +420,8 @@ const isDisabled = computed(() => { !addressTo.value || !amount.value || !fieldsValidation.value.amount || - !fieldsValidation.value.addressTo + !fieldsValidation.value.addressTo || + !fee.value ); }); diff --git a/packages/extension/src/ui/action/App.vue b/packages/extension/src/ui/action/App.vue index 2e54557b0..330204969 100644 --- a/packages/extension/src/ui/action/App.vue +++ b/packages/extension/src/ui/action/App.vue @@ -208,7 +208,7 @@ const openBuyPage = () => { ? (currentNetwork.value as KadenaNetwork).options.buyLink : `https://ccswap.myetherwallet.com/?to=${currentNetwork.value.displayAddress( accountHeaderData.value.selectedAccount!.address - )}&platform=enkrypt`; + )}&crypto=${currentNetwork.value.currencyName}&platform=enkrypt`; Browser.tabs.create({ url: buyLink, }); @@ -281,6 +281,9 @@ const setNetwork = async (network: BaseNetwork) => { provider: network.provider, network: network.name, }); + if (!network.subNetworks) { + currentSubNetwork.value = ""; + } const activeAccounts = await getAccountsByNetworkName(network.name); const inactiveAccounts = await kr.getAccounts( From 4959d9571aadf54283e818f647d7b1455e36723a Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 2 May 2024 12:42:30 -0700 Subject: [PATCH 173/375] fix: from account existance --- .../providers/kadena/ui/send-transaction/index.vue | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 44f7c51be..50d5507f8 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -195,7 +195,14 @@ const validateFields = async () => { if (isAddress.value) { const to = props.network.displayAddress(addressTo.value); const from = props.network.displayAddress(addressFrom.value); - + const accountDetailFrom = await accountAssets.value[0].getAccountDetails( + from, + props.network + ); + if (accountDetailFrom.error) { + errorMsg.value = "Not enough balance"; // account doesnt exist + return; + } if (!props.network.isAddress(to)) { const accountDetail = await accountAssets.value[0].getAccountDetails( to, @@ -208,7 +215,6 @@ const validateFields = async () => { return; } } - if (to == from) { fieldsValidation.value.addressTo = false; errorMsg.value = '"To" address cannot be the same as "From" address'; @@ -255,6 +261,7 @@ const validateFields = async () => { if (transactionResult.result.status !== "success") { fieldsValidation.value.amount = false; + console.log(transactionResult.result.error); errorMsg.value = (transactionResult.result.error as any).message || "An error occurred"; From aa7bf5745e725867aadd10fa4d49071b02d9961a Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 2 May 2024 14:21:34 -0700 Subject: [PATCH 174/375] feat: add swap to base and maticzk --- packages/swap/src/common/supportedNetworks.ts | 24 +++++++++++++++++++ packages/swap/src/configs.ts | 2 ++ packages/swap/src/providers/oneInch/index.ts | 4 ++++ packages/swap/src/providers/paraswap/index.ts | 8 +++++++ packages/swap/src/providers/zerox/index.ts | 4 ++++ packages/swap/src/types/index.ts | 2 ++ 6 files changed, 44 insertions(+) diff --git a/packages/swap/src/common/supportedNetworks.ts b/packages/swap/src/common/supportedNetworks.ts index ab58b68bc..e7a16d346 100644 --- a/packages/swap/src/common/supportedNetworks.ts +++ b/packages/swap/src/common/supportedNetworks.ts @@ -50,6 +50,18 @@ const NetworkDetails: Record = { signerType: [SignerType.secp256k1], type: NetworkType.EVM, }, + [SupportedNetworkName.MaticZK]: { + id: SupportedNetworkName.MaticZK, + cgId: "matic-network", + decimals: 18, + logoURI: + "https://tokens.1inch.io/0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0.png", + name: "Polygon ZK", + symbol: "MATIC", + rank: 4, + signerType: [SignerType.secp256k1], + type: NetworkType.EVM, + }, [SupportedNetworkName.Optimism]: { id: SupportedNetworkName.Optimism, cgId: "optimism", @@ -62,6 +74,18 @@ const NetworkDetails: Record = { signerType: [SignerType.secp256k1], type: NetworkType.EVM, }, + [SupportedNetworkName.Base]: { + id: SupportedNetworkName.Base, + cgId: "ethereum", + decimals: 18, + logoURI: + "https://assets.coingecko.com/asset_platforms/images/131/large/base.jpeg", + name: "Base", + signerType: [SignerType.secp256k1], + type: NetworkType.EVM, + rank: 6, + symbol: "ETH", + }, [SupportedNetworkName.Arbitrum]: { id: SupportedNetworkName.Arbitrum, cgId: "ethereum", diff --git a/packages/swap/src/configs.ts b/packages/swap/src/configs.ts index 90405a66b..ded2ffc0b 100644 --- a/packages/swap/src/configs.ts +++ b/packages/swap/src/configs.ts @@ -61,6 +61,8 @@ const TOKEN_LISTS: { [NetworkNames.Gnosis]: `https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/${SupportedNetworkName.Gnosis}.json`, [NetworkNames.Klaytn]: `https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/${SupportedNetworkName.Klaytn}.json`, [NetworkNames.ZkSync]: `https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/${SupportedNetworkName.Zksync}.json`, + [NetworkNames.Base]: `https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/${SupportedNetworkName.Base}.json`, + [NetworkNames.MaticZK]: `https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/${SupportedNetworkName.MaticZK}.json`, }; const CHANGELLY_LIST = diff --git a/packages/swap/src/providers/oneInch/index.ts b/packages/swap/src/providers/oneInch/index.ts index 22f1bb508..ddd1cadc2 100644 --- a/packages/swap/src/providers/oneInch/index.ts +++ b/packages/swap/src/providers/oneInch/index.ts @@ -79,6 +79,10 @@ const supportedNetworks: { approvalAddress: ONEINCH_APPROVAL_ADDRESS, chainId: "42161", }, + [SupportedNetworkName.Base]: { + approvalAddress: ONEINCH_APPROVAL_ADDRESS, + chainId: "8453", + }, [SupportedNetworkName.Zksync]: { approvalAddress: "0x6fd4383cb451173d5f9304f041c7bcbf27d561ff", chainId: "324", diff --git a/packages/swap/src/providers/paraswap/index.ts b/packages/swap/src/providers/paraswap/index.ts index 6eeff90e8..817c42f7c 100644 --- a/packages/swap/src/providers/paraswap/index.ts +++ b/packages/swap/src/providers/paraswap/index.ts @@ -68,6 +68,14 @@ const supportedNetworks: { approvalAddress: PARASWAP_APPROVAL_ADDRESS, chainId: "42161", }, + [SupportedNetworkName.Base]: { + approvalAddress: "0x93aAAe79a53759cD164340E4C8766E4Db5331cD7", + chainId: "8453", + }, + [SupportedNetworkName.MaticZK]: { + approvalAddress: "0xc8a21fcd5a100c3ecc037c97e2f9c53a8d3a02a1", + chainId: "1101", + }, }; const BASE_URL = "https://apiv5.paraswap.io/"; diff --git a/packages/swap/src/providers/zerox/index.ts b/packages/swap/src/providers/zerox/index.ts index b1ddc1a7e..174c30f83 100644 --- a/packages/swap/src/providers/zerox/index.ts +++ b/packages/swap/src/providers/zerox/index.ts @@ -65,6 +65,10 @@ const supportedNetworks: { approvalAddress: "0xdef1c0ded9bec7f1a1670819833240f027b25eff", chainId: "42161", }, + [SupportedNetworkName.Base]: { + approvalAddress: "0xdef1c0ded9bec7f1a1670819833240f027b25eff", + chainId: "1101", + }, }; const BASE_URL = "https://partners.mewapi.io/zerox/"; diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index ac1e38b84..d4397e207 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -27,6 +27,8 @@ export enum SupportedNetworkName { Klaytn = NetworkNames.Klaytn, Aurora = NetworkNames.Aurora, Zksync = NetworkNames.ZkSync, + Base = NetworkNames.Base, + MaticZK = NetworkNames.MaticZK, } // eslint-disable-next-line no-shadow From e1cc9949c068cd512c713747ab6a275f587b448e Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 2 May 2024 14:45:58 -0700 Subject: [PATCH 175/375] devop: set release version --- packages/extension/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/package.json b/packages/extension/package.json index 5d9fa774a..7eaa66dcd 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/extension", - "version": "1.38.0", + "version": "1.39.0", "private": true, "scripts": { "zip": "cd dist; zip -r release.zip *;", From 254d5d3a728b596f657cddc3dec6c3a568215607 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 6 May 2024 10:18:44 -0700 Subject: [PATCH 176/375] devop: remove console.log --- .../src/providers/polkadot/methods/dot_signer_signRaw.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts b/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts index 2654246e2..5839f0948 100644 --- a/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts +++ b/packages/extension/src/providers/polkadot/methods/dot_signer_signRaw.ts @@ -13,7 +13,6 @@ const method: MiddlewareFunction = function ( ): void { if (payload.method !== "dot_signer_signRaw") return next(); else { - console.log(payload); if (!payload.params?.length) return res(getCustomError("Missing Params: signer_signPayload")); const reqPayload = payload.params[0] as SignerPayloadRaw; From 84ae8b9eaca33a1fff71be7e62a447dae54410fd Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 6 May 2024 14:57:26 -0700 Subject: [PATCH 177/375] fix: number input decimal error --- .../bitcoin/ui/send-transaction/index.vue | 2 +- .../ui/send-transaction/send-input-amount.vue | 15 +- .../ethereum/ui/send-transaction/index.vue | 2 +- .../components/send-input-amount.vue | 168 ----------------- .../kadena/ui/send-transaction/index.vue | 13 +- .../components/send-input-amount.vue | 169 ------------------ .../polkadot/ui/send-transaction/index.vue | 18 +- .../components/swap-token-amount-input.vue | 16 +- 8 files changed, 45 insertions(+), 358 deletions(-) delete mode 100644 packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue delete mode 100644 packages/extension/src/providers/polkadot/ui/send-transaction/components/send-input-amount.vue diff --git a/packages/extension/src/providers/bitcoin/ui/send-transaction/index.vue b/packages/extension/src/providers/bitcoin/ui/send-transaction/index.vue index e52a41789..8d309b56d 100644 --- a/packages/extension/src/providers/bitcoin/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/bitcoin/ui/send-transaction/index.vue @@ -389,7 +389,7 @@ const inputAmount = (inputAmount: string) => { } const inputAmountBn = new BigNumber(inputAmount); isMaxSelected.value = false; - amount.value = inputAmountBn.lt(0) ? "0" : inputAmountBn.toFixed(); + amount.value = inputAmountBn.lt(0) ? "0" : inputAmount; }; const toggleSelectFee = () => { diff --git a/packages/extension/src/providers/common/ui/send-transaction/send-input-amount.vue b/packages/extension/src/providers/common/ui/send-transaction/send-input-amount.vue index a0df84c6b..66adba85f 100644 --- a/packages/extension/src/providers/common/ui/send-transaction/send-input-amount.vue +++ b/packages/extension/src/providers/common/ui/send-transaction/send-input-amount.vue @@ -3,9 +3,10 @@ @@ -31,7 +32,7 @@ import SwitchArrowIcon from "@action/icons/send/switch-arrow-icon.vue"; import BigNumber from "bignumber.js"; const emit = defineEmits<{ - (e: "update:inputAmount", address: string): void; + (e: "update:inputAmount", value: string): void; (e: "update:inputSetMax"): void; }>(); @@ -64,10 +65,18 @@ const fiatEquivalent = computed(() => { const amount = computed({ get: () => props.amount, set: (value) => { - emit("update:inputAmount", value.toString()); + let fValue = value.toString(); + if (fValue === ".") fValue = "0."; + emit("update:inputAmount", fValue); }, }); +const onlyNumber = ($event: KeyboardEvent) => { + const keyCode = $event.keyCode ? $event.keyCode : $event.which; + if ((keyCode < 48 || keyCode > 57) && keyCode !== 46) { + $event.preventDefault(); + } +}; const changeFocus = () => { isFocus.value = !isFocus.value; }; diff --git a/packages/extension/src/providers/ethereum/ui/send-transaction/index.vue b/packages/extension/src/providers/ethereum/ui/send-transaction/index.vue index 45b551633..e87798c72 100644 --- a/packages/extension/src/providers/ethereum/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/ethereum/ui/send-transaction/index.vue @@ -614,7 +614,7 @@ const inputAmount = (inputAmount: string) => { } const inputAmountBn = new BigNumber(inputAmount); isMaxSelected.value = false; - amount.value = inputAmountBn.lt(0) ? "0" : inputAmountBn.toFixed(); + amount.value = inputAmountBn.lt(0) ? "0" : inputAmount; if (isInputsValid.value) { updateTransactionFees(Tx.value); } diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue b/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue deleted file mode 100644 index 8124653ea..000000000 --- a/packages/extension/src/providers/kadena/ui/send-transaction/components/send-input-amount.vue +++ /dev/null @@ -1,168 +0,0 @@ - - - - - diff --git a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue index 50d5507f8..e64dcf0b1 100644 --- a/packages/extension/src/providers/kadena/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/kadena/ui/send-transaction/index.vue @@ -65,8 +65,9 @@ @@ -103,7 +104,7 @@ import SendContactsList from "./components/send-contacts-list.vue"; import SendFromContactsList from "./components/send-from-contacts-list.vue"; import SendTokenSelect from "./components/send-token-select.vue"; import AssetsSelectList from "@action/views/assets-select-list/index.vue"; -import SendInputAmount from "./components/send-input-amount.vue"; +import SendInputAmount from "@/providers/common/ui/send-transaction/send-input-amount.vue"; import SendFeeSelect from "./components/send-fee-select.vue"; import SendAlert from "./components/send-alert.vue"; import BaseButton from "@action/components/base-button/index.vue"; @@ -399,9 +400,13 @@ const selectToken = (token: KDAToken | Partial) => { isOpenSelectToken.value = false; }; -const inputAmount = (number: string | undefined) => { +const inputAmount = (inputAmount: string) => { + if (inputAmount === "") { + inputAmount = "0"; + } + const inputAmountBn = new BigNumber(inputAmount); sendMax.value = false; - amount.value = number ? (parseFloat(number) < 0 ? "" : number) : number; + amount.value = inputAmountBn.lt(0) ? "0" : inputAmount; }; const sendButtonTitle = computed(() => { diff --git a/packages/extension/src/providers/polkadot/ui/send-transaction/components/send-input-amount.vue b/packages/extension/src/providers/polkadot/ui/send-transaction/components/send-input-amount.vue deleted file mode 100644 index 535dcd24e..000000000 --- a/packages/extension/src/providers/polkadot/ui/send-transaction/components/send-input-amount.vue +++ /dev/null @@ -1,169 +0,0 @@ - - - - - diff --git a/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue b/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue index 927f75aa4..36e767183 100644 --- a/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue @@ -63,6 +63,7 @@ ) => { isOpenSelectToken.value = false; }; -const inputAmount = (number: string | undefined) => { +const inputAmount = (inputAmount: string) => { + if (inputAmount === "") { + inputAmount = "0"; + } + const inputAmountBn = new BigNumber(inputAmount); sendMax.value = false; - amount.value = number ? (parseFloat(number) < 0 ? "0" : number) : number; + amount.value = inputAmountBn.lt(0) ? "0" : inputAmount; validateFields(); }; @@ -423,12 +428,7 @@ const sendButtonTitle = computed(() => { return title; }); -const setSendMax = (max: boolean) => { - if (!max) { - sendMax.value = false; - return; - } - +const setSendMax = () => { if (selectedAsset.value) { const humanBalance = fromBase( selectedAsset.value.balance!, diff --git a/packages/extension/src/ui/action/views/swap/components/swap-token-amount-input/components/swap-token-amount-input.vue b/packages/extension/src/ui/action/views/swap/components/swap-token-amount-input/components/swap-token-amount-input.vue index 7b28fd736..c24bd72b3 100644 --- a/packages/extension/src/ui/action/views/swap/components/swap-token-amount-input/components/swap-token-amount-input.vue +++ b/packages/extension/src/ui/action/views/swap/components/swap-token-amount-input/components/swap-token-amount-input.vue @@ -2,19 +2,19 @@ diff --git a/yarn.lock b/yarn.lock index 1c1cb6333..28a0c92f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,29 +30,28 @@ __metadata: languageName: node linkType: hard -"@amplitude/analytics-browser@npm:2.5.3": - version: 2.5.3 - resolution: "@amplitude/analytics-browser@npm:2.5.3" - dependencies: - "@amplitude/analytics-client-common": ^2.1.1 - "@amplitude/analytics-core": ^2.2.2 - "@amplitude/analytics-types": ^2.5.0 - "@amplitude/plugin-page-view-tracking-browser": ^2.2.3 - "@amplitude/plugin-web-attribution-browser": ^2.1.4 +"@amplitude/analytics-browser@npm:2.8.0": + version: 2.8.0 + resolution: "@amplitude/analytics-browser@npm:2.8.0" + dependencies: + "@amplitude/analytics-client-common": ^2.2.0 + "@amplitude/analytics-core": ^2.2.8 + "@amplitude/analytics-types": ^2.5.1 + "@amplitude/plugin-page-view-tracking-browser": ^2.2.12 tslib: ^2.4.1 - checksum: 9d67fa579bbe06d7b1f4c5df152f9dd669716c4ef79f97f3ee9ed5c74b27b3092752434eca0beb5b557473d8cbfcc1c93cbf336e87039ae31197df8f73f1bbf4 + checksum: 3f7cbec435ef7aa1393f608afff374d42543a64fe5019b3849c137c98918246ef4b905079d85893a2a88fba510749b5a0ac0685848551620187c21cbac7a4ea6 languageName: node linkType: hard -"@amplitude/analytics-client-common@npm:^2.1.1, @amplitude/analytics-client-common@npm:^2.1.5": - version: 2.1.5 - resolution: "@amplitude/analytics-client-common@npm:2.1.5" +"@amplitude/analytics-client-common@npm:^2.2.0": + version: 2.2.0 + resolution: "@amplitude/analytics-client-common@npm:2.2.0" dependencies: "@amplitude/analytics-connector": ^1.4.8 - "@amplitude/analytics-core": ^2.2.6 - "@amplitude/analytics-types": ^2.5.0 + "@amplitude/analytics-core": ^2.2.8 + "@amplitude/analytics-types": ^2.5.1 tslib: ^2.4.1 - checksum: 1443f3c5bed5c18ebe88c9e4583ed4f8f75625c4eb3726c1f55f3f45910bc36df70ccef6e8606395c1550e4e05c8f845f1904ec220652e31cbff06b38a098c57 + checksum: eb9a7a122a6b02a16abcae6c9e112b04ed1e0c7430619334fea323e95ada9f894638dcd86c1e6cbcd7aeee6cdeb0f2e0ff13de1c10b7790774174b018a3d21ee languageName: node linkType: hard @@ -63,43 +62,31 @@ __metadata: languageName: node linkType: hard -"@amplitude/analytics-core@npm:^2.2.2, @amplitude/analytics-core@npm:^2.2.6": - version: 2.2.6 - resolution: "@amplitude/analytics-core@npm:2.2.6" +"@amplitude/analytics-core@npm:^2.2.8": + version: 2.2.8 + resolution: "@amplitude/analytics-core@npm:2.2.8" dependencies: - "@amplitude/analytics-types": ^2.5.0 + "@amplitude/analytics-types": ^2.5.1 tslib: ^2.4.1 - checksum: 6579044b7efdfb232320b5dd7ab1c43be7c29fba90a3978242ce8467e7437b6756a1298c7d8813bedabc55a00a1c1abeb2f952c56779f554544f6610ef5307b5 + checksum: a7a70b1124bf25bfb4fee74ec2d9124fce05bd31147a61ecf6dcfa307ba150e4114cd68fba336ddeb8d6b53ee6c2f4ed561fdc329dd652955daea848887baafc languageName: node linkType: hard -"@amplitude/analytics-types@npm:^2.5.0": - version: 2.5.0 - resolution: "@amplitude/analytics-types@npm:2.5.0" - checksum: c2f0d4514d4d1772794dd6209df2311368076aaa2555b03763a9fcc21d4d861996fd1c13cd1c29a8d9f801470b20e56b2d47c3c4f35e76a3f8ab9ce2de3efcd9 - languageName: node - linkType: hard - -"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.3": - version: 2.2.8 - resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.8" - dependencies: - "@amplitude/analytics-client-common": ^2.1.5 - "@amplitude/analytics-types": ^2.5.0 - tslib: ^2.4.1 - checksum: d6759f2df86765ca9488548bb80bf46b719c4a8a36ebd95ccc403ec70211a4e177df163e0765895a64314e8dafe1b69727a64924eb83f47e4c4eae478806257a +"@amplitude/analytics-types@npm:^2.5.1": + version: 2.5.1 + resolution: "@amplitude/analytics-types@npm:2.5.1" + checksum: 7b46ed1fbe856990ac71ee3d9a9185f16f286a17f5bbd93560d03b608a6696deeb6c7cf42b9937889b38266f97e8b22a59f132177cdfd682da4b30accb3ae1b4 languageName: node linkType: hard -"@amplitude/plugin-web-attribution-browser@npm:^2.1.4": - version: 2.1.9 - resolution: "@amplitude/plugin-web-attribution-browser@npm:2.1.9" +"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.12": + version: 2.2.12 + resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.12" dependencies: - "@amplitude/analytics-client-common": ^2.1.5 - "@amplitude/analytics-core": ^2.2.6 - "@amplitude/analytics-types": ^2.5.0 + "@amplitude/analytics-client-common": ^2.2.0 + "@amplitude/analytics-types": ^2.5.1 tslib: ^2.4.1 - checksum: 7b49abaaa479f2114f4dd8100e4c99fb0e84be338a80d07f614814396825064144ede2fea57789e0d8f0abcde21597b23851d7efc99a602df8633db0ff4970b7 + checksum: 5073f93fbf4e58e3907954b7d2070d936e67cdf8a9e5f665ea60777c970622a0c211767ade22326c5a5062d7c4149d5cd0a9688e88ff29beddb1cf61f28e6415 languageName: node linkType: hard @@ -2559,7 +2546,7 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/extension@workspace:packages/extension" dependencies: - "@amplitude/analytics-browser": 2.5.3 + "@amplitude/analytics-browser": 2.8.0 "@babel/plugin-transform-class-static-block": ^7.24.4 "@babel/runtime": ^7.24.5 "@enkryptcom/extension-bridge": "workspace:^" From 1f43f3b2bcb573b33878ff14e9538971b094c69e Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 28 May 2024 10:22:29 -0700 Subject: [PATCH 191/375] devop: prep for release --- packages/extension/package.json | 2 +- .../src/ui/onboard/user-analytics.vue | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/extension/package.json b/packages/extension/package.json index f1c563fe0..8d18f49b4 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/extension", - "version": "1.40.0", + "version": "1.40.1", "private": true, "scripts": { "zip": "cd dist; zip -r release.zip *;", diff --git a/packages/extension/src/ui/onboard/user-analytics.vue b/packages/extension/src/ui/onboard/user-analytics.vue index 8b73ee937..b964db721 100644 --- a/packages/extension/src/ui/onboard/user-analytics.vue +++ b/packages/extension/src/ui/onboard/user-analytics.vue @@ -1,12 +1,23 @@ @@ -172,6 +178,7 @@ const approvalAmount = ref(""); const network = ref(DEFAULT_EVM_NETWORK); const marketdata = new MarketData(); const gasCostValues = ref(defaultGasCostVals); +const errorMsg = ref(""); const account = ref({ name: "", address: "", @@ -236,52 +243,57 @@ onBeforeMount(async () => { Request.value.params![0] as EthereumTransaction, web3 ); - await tx.getGasCosts().then(async (gasvals) => { - let nativeVal = "0"; - if (network.value.coingeckoID) { - await marketdata - .getTokenValue("1", network.value.coingeckoID, "USD") - .then((val) => (nativeVal = val)); - } - const getConvertedVal = (type: GasPriceTypes) => - fromBase(gasvals[type], network.value.decimals); + await tx + .getGasCosts() + .then(async (gasvals) => { + let nativeVal = "0"; + if (network.value.coingeckoID) { + await marketdata + .getTokenValue("1", network.value.coingeckoID, "USD") + .then((val) => (nativeVal = val)); + } + const getConvertedVal = (type: GasPriceTypes) => + fromBase(gasvals[type], network.value.decimals); - gasCostValues.value = { - [GasPriceTypes.ECONOMY]: { - nativeValue: getConvertedVal(GasPriceTypes.ECONOMY), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.ECONOMY)) - .times(nativeVal) - .toString(), - nativeSymbol: network.value.currencyName, - fiatSymbol: "USD", - }, - [GasPriceTypes.REGULAR]: { - nativeValue: getConvertedVal(GasPriceTypes.REGULAR), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.REGULAR)) - .times(nativeVal) - .toString(), - nativeSymbol: network.value.currencyName, - fiatSymbol: "USD", - }, - [GasPriceTypes.FAST]: { - nativeValue: getConvertedVal(GasPriceTypes.FAST), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FAST)) - .times(nativeVal) - .toString(), - nativeSymbol: network.value.currencyName, - fiatSymbol: "USD", - }, - [GasPriceTypes.FASTEST]: { - nativeValue: getConvertedVal(GasPriceTypes.FASTEST), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FASTEST)) - .times(nativeVal) - .toString(), - nativeSymbol: network.value.currencyName, - fiatSymbol: "USD", - }, - }; - selectedFee.value = GasPriceTypes.REGULAR; - }); + gasCostValues.value = { + [GasPriceTypes.ECONOMY]: { + nativeValue: getConvertedVal(GasPriceTypes.ECONOMY), + fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.ECONOMY)) + .times(nativeVal) + .toString(), + nativeSymbol: network.value.currencyName, + fiatSymbol: "USD", + }, + [GasPriceTypes.REGULAR]: { + nativeValue: getConvertedVal(GasPriceTypes.REGULAR), + fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.REGULAR)) + .times(nativeVal) + .toString(), + nativeSymbol: network.value.currencyName, + fiatSymbol: "USD", + }, + [GasPriceTypes.FAST]: { + nativeValue: getConvertedVal(GasPriceTypes.FAST), + fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FAST)) + .times(nativeVal) + .toString(), + nativeSymbol: network.value.currencyName, + fiatSymbol: "USD", + }, + [GasPriceTypes.FASTEST]: { + nativeValue: getConvertedVal(GasPriceTypes.FASTEST), + fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FASTEST)) + .times(nativeVal) + .toString(), + nativeSymbol: network.value.currencyName, + fiatSymbol: "USD", + }, + }; + selectedFee.value = GasPriceTypes.REGULAR; + }) + .catch((e) => { + errorMsg.value = e.message; + }); }); const approve = async () => { From 6c610f06b77a30f4f81eb2c8121fca9490b5da08 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 24 Jul 2024 16:02:10 -0700 Subject: [PATCH 215/375] fix: telos and activity --- .../libs/activity-handlers/providers/etherscan/index.ts | 2 +- packages/extension/src/providers/ethereum/networks/tlos.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/index.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/index.ts index d5ec170c9..b0023ccdf 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/index.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/index.ts @@ -24,7 +24,7 @@ const getAddressActivity = async ( ).then((res) => { if (res.status === "0") return []; const results = res.result as EtherscanTxType[]; - const newResults = results.reverse().map((tx) => { + const newResults = results.map((tx) => { const rawTx: EthereumRawInfo = { blockHash: tx.blockHash, blockNumber: numberToHex(tx.blockNumber), diff --git a/packages/extension/src/providers/ethereum/networks/tlos.ts b/packages/extension/src/providers/ethereum/networks/tlos.ts index 25fa28cfb..65e1b1ab0 100644 --- a/packages/extension/src/providers/ethereum/networks/tlos.ts +++ b/packages/extension/src/providers/ethereum/networks/tlos.ts @@ -14,7 +14,7 @@ const ethOptions: EvmNetworkOptions = { isTestNetwork: false, currencyName: "TLOS", currencyNameLong: "Telos", - node: "wss://telos.drpc.org", + node: "https://mainnet-eu.telos.net/evm", icon: require("./icons/telos.svg"), coingeckoID: "telos", coingeckoPlatform: CoingeckoPlatform.Telos, From 8415a63a76d1f138e31e0c25f16412d357a8c164 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 30 Jul 2024 13:19:47 -0700 Subject: [PATCH 216/375] fix: background double init --- packages/extension-bridge/src/utils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/extension-bridge/src/utils.ts b/packages/extension-bridge/src/utils.ts index d98a024ab..fc6e87f64 100644 --- a/packages/extension-bridge/src/utils.ts +++ b/packages/extension-bridge/src/utils.ts @@ -36,7 +36,10 @@ export const getBackgroundPageType = (): RuntimeContext => { const url = new URL(browser.runtime.getURL(manifest.options_ui.page)); if (url.pathname === window.location.pathname) return "options"; } - if (window?.location?.pathname === "/index.html") { + if ( + window?.location?.pathname === "/index.html" || + window?.location?.pathname === "/onboard.html" + ) { return "new-window"; } return "background"; From 02cba1e64ea8cf3fc7a6973a5ab6aa9c431099fe Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 30 Jul 2024 16:30:58 -0700 Subject: [PATCH 217/375] devop: update packages --- package.json | 6 +- packages/extension-bridge/package.json | 8 +- packages/extension/package.json | 60 +- packages/hw-wallets/package.json | 24 +- packages/keyring/package.json | 12 +- packages/name-resolution/package.json | 10 +- packages/request/package.json | 12 +- packages/signers/bitcoin/package.json | 10 +- packages/signers/ethereum/package.json | 10 +- packages/signers/kadena/package.json | 12 +- packages/signers/polkadot/package.json | 14 +- packages/storage/package.json | 10 +- packages/swap/package.json | 14 +- packages/types/package.json | 4 +- packages/utils/package.json | 14 +- yarn.lock | 2740 +++++++++++++----------- 16 files changed, 1547 insertions(+), 1413 deletions(-) diff --git a/package.json b/package.json index 1dfed6c47..9042a6279 100644 --- a/package.json +++ b/package.json @@ -32,11 +32,11 @@ "devDependencies": { "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", - "@swc/core": "^1.6.3", + "@swc/core": "^1.7.3", "concurrently": "^8.2.2", - "husky": "^9.0.11", + "husky": "^9.1.4", "node-notifier": "^10.0.1", - "nodemon": "^3.1.3", + "nodemon": "^3.1.4", "ultra-runner": "^3.10.5" }, "resolutions": { diff --git a/packages/extension-bridge/package.json b/packages/extension-bridge/package.json index f0177e6e1..404a2cf24 100644 --- a/packages/extension-bridge/package.json +++ b/packages/extension-bridge/package.json @@ -40,8 +40,8 @@ }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@types/webextension-polyfill": "^0.10.7", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", @@ -55,8 +55,8 @@ "prettier": "^2.8.8", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", - "type-fest": "^4.20.1", + "tsup": "^8.2.3", + "type-fest": "^4.23.0", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" } diff --git a/packages/extension/package.json b/packages/extension/package.json index ef6d8fd59..19a09d208 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -21,8 +21,8 @@ "watch-vue-firefox": "cross-env BROWSER='firefox' vue-cli-service build --watch --no-clean" }, "dependencies": { - "@amplitude/analytics-browser": "^2.9.0", - "@babel/runtime": "^7.24.7", + "@amplitude/analytics-browser": "^2.9.3", + "@babel/runtime": "^7.25.0", "@enkryptcom/extension-bridge": "workspace:^", "@enkryptcom/hw-wallets": "workspace:^", "@enkryptcom/keyring": "workspace:^", @@ -34,25 +34,25 @@ "@ethereumjs/common": "^4.3.0", "@ethereumjs/tx": "^5.3.0", "@ethereumjs/util": "^9.0.3", - "@kadena/client": "^1.12.0", - "@ledgerhq/hw-transport-webusb": "^6.29.0", - "@metamask/eth-sig-util": "^7.0.2", + "@kadena/client": "^1.13.0", + "@ledgerhq/hw-transport-webusb": "^6.29.2", + "@metamask/eth-sig-util": "^7.0.3", "@rollup/plugin-replace": "^5.0.7", - "@types/chrome": "^0.0.268", + "@types/chrome": "^0.0.269", "@types/events": "^3.0.3", "@types/less": "^3.0.6", - "@types/lodash": "^4.17.5", + "@types/lodash": "^4.17.7", "@types/utf-8-validate": "^5.0.2", "@vueuse/core": "^10.11.0", "add": "^2.0.6", "bignumber.js": "^9.1.2", "bip39": "^3.1.0", "bitcoinjs-lib": "^6.1.6", - "chai": "^4.4.1", + "chai": "^4.5.0", "concurrently": "^8.2.2", "core-js": "^3.37.1", - "echarts": "^5.5.0", - "ethereum-cryptography": "^2.2.0", + "echarts": "^5.5.1", + "ethereum-cryptography": "^2.2.1", "ethereumjs-abi": "^0.6.8", "ethereumjs-wallet": "^1.0.2", "eventemitter3": "^5.0.1", @@ -61,14 +61,14 @@ "moment": "^2.30.1", "nanoevents": "^9.0.0", "pact-lang-api": "^4.3.6", - "pinia": "^2.1.7", + "pinia": "^2.2.0", "qrcode.vue": "^3.4.1", "switch-ts": "^1.1.1", "url-parse": "^1.5.10", "uuid": "^10.0.0", - "vue": "^3.4.29", - "vue-echarts": "6.7.3", - "vue-router": "4.3.3", + "vue": "^3.4.34", + "vue-echarts": "7.0.0-beta.0", + "vue-router": "4.4.0", "vue3-lottie": "^3.3.0", "vuedraggable": "^4.1.0", "web3-eth": "^1.10.4", @@ -78,24 +78,24 @@ }, "devDependencies": { "@babel/plugin-transform-class-static-block": "^7.24.7", - "@kadena/pactjs-cli": "^1.12.0", - "@polkadot/api": "^11.3.1", - "@polkadot/extension-inject": "^0.47.6", - "@polkadot/keyring": "^12.6.2", - "@polkadot/rpc-provider": "^11.3.1", - "@polkadot/types": "^11.3.1", - "@polkadot/types-known": "^11.3.1", - "@polkadot/ui-shared": "^3.6.6", - "@polkadot/util": "^12.6.2", + "@kadena/pactjs-cli": "^1.13.0", + "@polkadot/api": "^12.2.3", + "@polkadot/extension-inject": "^0.50.1", + "@polkadot/keyring": "^13.0.2", + "@polkadot/rpc-provider": "^12.2.3", + "@polkadot/types": "^12.2.3", + "@polkadot/types-known": "^12.2.3", + "@polkadot/ui-shared": "^3.8.2", + "@polkadot/util": "^13.0.2", "@polkadot/wasm-crypto": "^7.3.2", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-inject": "^5.0.5", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.6", "@types/ethereumjs-abi": "^0.6.5", - "@types/mocha": "^10.0.6", + "@types/mocha": "^10.0.7", "@types/url-parse": "^1.4.11", - "@types/uuid": "^9.0.8", + "@types/uuid": "^10.0.0", "@types/wif": "^2.0.5", "@types/zxcvbn": "^4.4.4", "@typescript-eslint/eslint-plugin": "^5.62.0", @@ -115,20 +115,20 @@ "https-browserify": "^1.0.0", "less": "^4.2.0", "less-loader": "^12.2.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "path-browserify": "^1.0.1", "prettier": "^2.8.8", - "rimraf": "^5.0.7", - "rollup": "^4.18.0", + "rimraf": "^6.0.1", + "rollup": "^4.19.1", "rollup-plugin-uglify": "^6.0.4", - "semver": "^7.6.2", + "semver": "^7.6.3", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", "systeminformation": "^5.22.11", "ts-mocha": "^10.0.0", "tsconfig-paths": "^4.2.0", "typescript": "^4.9.5", - "url": "^0.11.3", + "url": "^0.11.4", "webextension-polyfill": "^0.12.0" }, "installConfig": { diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 5514e888b..000bc7003 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -17,23 +17,23 @@ }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, @@ -50,14 +50,14 @@ "@ethereumjs/rlp": "^5.0.2", "@ethereumjs/tx": "^5.3.0", "@ethereumjs/util": "^9.0.3", - "@ledgerhq/hw-app-eth": "^6.37.0", - "@ledgerhq/hw-transport": "^6.31.0", - "@ledgerhq/hw-transport-webusb": "^6.29.0", + "@ledgerhq/hw-app-eth": "^6.37.3", + "@ledgerhq/hw-transport": "^6.31.2", + "@ledgerhq/hw-transport-webusb": "^6.29.2", "@ledgerhq/live-common": "^34.1.0", - "@polkadot/types": "^11.3.1", - "@polkadot/util": "^12.6.2", - "@trezor/connect-web": "^9.2.4", - "@zondax/ledger-substrate": "^0.44.2", + "@polkadot/types": "^12.2.3", + "@polkadot/util": "^13.0.2", + "@trezor/connect-web": "^9.3.0", + "@zondax/ledger-substrate": "^0.44.7", "hdkey": "^2.1.0", "webextension-polyfill": "^0.12.0" } diff --git a/packages/keyring/package.json b/packages/keyring/package.json index ded577548..8e2dfc696 100644 --- a/packages/keyring/package.json +++ b/packages/keyring/package.json @@ -24,29 +24,29 @@ "@enkryptcom/storage": "workspace:^", "@enkryptcom/types": "workspace:^", "@enkryptcom/utils": "workspace:^", - "@polkadot/util": "^12.6.2", + "@polkadot/util": "^13.0.2", "assert": "^2.1.0", "bip39": "^3.1.0" }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/name-resolution/package.json b/packages/name-resolution/package.json index 2f3c18eaa..247381d7e 100644 --- a/packages/name-resolution/package.json +++ b/packages/name-resolution/package.json @@ -17,23 +17,23 @@ }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/request/package.json b/packages/request/package.json index 6fd0fa59f..bf43ce92f 100644 --- a/packages/request/package.json +++ b/packages/request/package.json @@ -23,27 +23,27 @@ "node-fetch": "^2.7.0", "reconnecting-websocket": "^4.4.0", "uuid": "^10.0.0", - "ws": "^8.17.1" + "ws": "^8.18.0" }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/bitcoin/package.json b/packages/signers/bitcoin/package.json index d38f46a51..5735e2003 100644 --- a/packages/signers/bitcoin/package.json +++ b/packages/signers/bitcoin/package.json @@ -20,7 +20,7 @@ "@enkryptcom/utils": "workspace:^", "@noble/secp256k1": "1.7.1", "bip39": "^3.1.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "hdkey": "^2.1.0", "tweetnacl": "^1.0.3", "tweetnacl-util": "^0.15.1" @@ -29,8 +29,8 @@ "@enkryptcom/types": "workspace:^", "@types/chai": "^4.3.16", "@types/hdkey": "^2.0.3", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -39,12 +39,12 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^9.0.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/ethereum/package.json b/packages/signers/ethereum/package.json index d81c64826..7dd6b8acb 100644 --- a/packages/signers/ethereum/package.json +++ b/packages/signers/ethereum/package.json @@ -20,7 +20,7 @@ "@enkryptcom/utils": "workspace:^", "@ethereumjs/util": "^9.0.3", "bip39": "^3.1.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "hdkey": "^2.1.0", "tweetnacl": "^1.0.3", "tweetnacl-util": "^0.15.1" @@ -29,8 +29,8 @@ "@enkryptcom/types": "workspace:^", "@types/chai": "^4.3.16", "@types/hdkey": "^2.0.3", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -39,12 +39,12 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/kadena/package.json b/packages/signers/kadena/package.json index 5b205df0d..0c2386f57 100644 --- a/packages/signers/kadena/package.json +++ b/packages/signers/kadena/package.json @@ -19,16 +19,16 @@ "dependencies": { "@enkryptcom/utils": "workspace:^", "bip39": "^3.1.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "tweetnacl": "^1.0.3" }, "devDependencies": { "@enkryptcom/types": "workspace:^", - "@polkadot/util-crypto": "^12.6.2", + "@polkadot/util-crypto": "^13.0.2", "@types/chai": "^4.3.16", "@types/hdkey": "^2.0.3", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -37,12 +37,12 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^9.2.2", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^9.0.2", "ts-node": "^10.9.2", "tsconfig-paths": "^3.15.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/polkadot/package.json b/packages/signers/polkadot/package.json index 47430152e..7b7b835a1 100644 --- a/packages/signers/polkadot/package.json +++ b/packages/signers/polkadot/package.json @@ -19,17 +19,17 @@ "dependencies": { "@commitlint/cli": "^19.3.0", "@enkryptcom/utils": "workspace:^", - "@polkadot/util": "^12.6.2", - "@polkadot/util-crypto": "^12.6.2", + "@polkadot/util": "^13.0.2", + "@polkadot/util-crypto": "^13.0.2", "@polkadot/wasm-crypto": "^7.3.2", "assert": "^2.1.0", - "chai": "^4.4.1" + "chai": "^4.5.0" }, "devDependencies": { "@enkryptcom/types": "workspace:^", "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -38,12 +38,12 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/storage/package.json b/packages/storage/package.json index 36fc6d44b..051da9b82 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -18,13 +18,13 @@ "dependencies": { "@enkryptcom/types": "workspace:^", "@enkryptcom/utils": "workspace:^", - "chai": "^4.4.1", + "chai": "^4.5.0", "localforage": "^1.10.0" }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -33,12 +33,12 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/swap/package.json b/packages/swap/package.json index 1c2ea8b47..4cdf15dff 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -24,32 +24,32 @@ "json-rpc-2.0": "^1.7.0", "lodash": "^4.17.21", "node-fetch": "^2.7.0", - "rango-sdk-basic": "^0.1.49", + "rango-sdk-basic": "^0.1.51", "reconnecting-websocket": "^4.4.0", "uuid": "^10.0.0", "web3-eth": "^1.10.4", "web3-utils": "^1.10.4", - "ws": "^8.17.1" + "ws": "^8.18.0" }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "chai": "^4.4.1", + "chai": "^4.5.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/types/package.json b/packages/types/package.json index 8d205587f..d923580c0 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -18,7 +18,7 @@ "node": ">=14.15.0" }, "devDependencies": { - "@types/node": "^20.14.6", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -30,7 +30,7 @@ "prettier": "^2.8.8", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/utils/package.json b/packages/utils/package.json index 8199c818d..df8a32b9d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -19,16 +19,16 @@ "dependencies": { "@enkryptcom/types": "workspace:^", "@ethereumjs/util": "^9.0.3", - "@polkadot/util-crypto": "^12.6.2", + "@polkadot/util-crypto": "^13.0.2", "bip39": "^3.1.0", - "chai": "^4.4.1", - "ethereum-cryptography": "^2.2.0", + "chai": "^4.5.0", + "ethereum-cryptography": "^2.2.1", "web3-utils": "^1.10.4" }, "devDependencies": { "@types/chai": "^4.3.16", - "@types/mocha": "^10.0.6", - "@types/node": "^20.14.6", + "@types/mocha": "^10.0.7", + "@types/node": "^20.14.13", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -37,12 +37,12 @@ "eslint-import-resolver-alias": "^1.1.2", "eslint-plugin-import": "^2.29.1", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.4.0", + "mocha": "^10.7.0", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.1.0", + "tsup": "^8.2.3", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/yarn.lock b/yarn.lock index ff2ba5c0d..b1d307b7b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,28 +30,28 @@ __metadata: languageName: node linkType: hard -"@amplitude/analytics-browser@npm:^2.9.0": - version: 2.9.0 - resolution: "@amplitude/analytics-browser@npm:2.9.0" +"@amplitude/analytics-browser@npm:^2.9.3": + version: 2.9.3 + resolution: "@amplitude/analytics-browser@npm:2.9.3" dependencies: - "@amplitude/analytics-client-common": ^2.2.2 + "@amplitude/analytics-client-common": ^2.2.4 "@amplitude/analytics-core": ^2.3.0 "@amplitude/analytics-types": ^2.6.0 - "@amplitude/plugin-page-view-tracking-browser": ^2.2.14 + "@amplitude/plugin-page-view-tracking-browser": ^2.2.17 tslib: ^2.4.1 - checksum: 045113dbe96b3bc2b81f34b896c1a93b5757b85842cca4f4bf4f3ea48431bdbb89866c26140f8cd89eec838de06fc171e87785075e4952cd76eb8ed5759aeb4e + checksum: f7d858ec2e0a3657192e174f3de7d0775683bd9ed136a440d3caa7d346e89c8f2bb193954df51e55c6fa888947c24ca19de613c6fec3925aef4179dd0f751c55 languageName: node linkType: hard -"@amplitude/analytics-client-common@npm:^2.2.2": - version: 2.2.2 - resolution: "@amplitude/analytics-client-common@npm:2.2.2" +"@amplitude/analytics-client-common@npm:^2.2.4": + version: 2.2.4 + resolution: "@amplitude/analytics-client-common@npm:2.2.4" dependencies: "@amplitude/analytics-connector": ^1.4.8 "@amplitude/analytics-core": ^2.3.0 "@amplitude/analytics-types": ^2.6.0 tslib: ^2.4.1 - checksum: 7b1ee0440a1bd24fd22a0fa8055d5c1a2a914a21593eeb6dbc3258febf8d5eed77e8ea15e235c1bb52da76cb49284516f480ba0a25d2cabd01b713dc71eebe7b + checksum: 17f0c205b97ad6e4e778fa2664e72e04cc28a8e18ee51b4e5bd706bc572817d62c9bd20102daf8e1069a655eb7a3b55255f82bd01c4e21eeff3e1034cbd17c75 languageName: node linkType: hard @@ -79,14 +79,14 @@ __metadata: languageName: node linkType: hard -"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.14": - version: 2.2.14 - resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.14" +"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.17": + version: 2.2.17 + resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.17" dependencies: - "@amplitude/analytics-client-common": ^2.2.2 + "@amplitude/analytics-client-common": ^2.2.4 "@amplitude/analytics-types": ^2.6.0 tslib: ^2.4.1 - checksum: 0986b46e614c44a591e79e8c2fb8c23a825cc8d99c5e3d530e46923724ae1e879445f234ef18fd17e321a2d774eda0b50b56eebf94fa5bc37084d31eae101840 + checksum: 8b1e763b7a073361dd29d29a2f59b010e19262cfce0115f570702436e9f16569cd7babc305c6d32fe3fb4b92ffacdd425ab4c28b8089174d22135b175b710ed5 languageName: node linkType: hard @@ -1674,6 +1674,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/runtime@npm:7.25.0" + dependencies: + regenerator-runtime: ^0.14.0 + checksum: 4a2a374a58eb01aaa65c5762606e90b3a1f448e0c637d42278b6cc0b42a9f5399b5f381ba9f237ee087da2860d14dd2d1de7bddcbe18be6a3cafba97e44bed64 + languageName: node + linkType: hard + "@babel/template@npm:^7.0.0, @babel/template@npm:^7.16.7, @babel/template@npm:^7.22.15": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" @@ -2721,8 +2730,8 @@ __metadata: resolution: "@enkryptcom/extension-bridge@workspace:packages/extension-bridge" dependencies: "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@types/webextension-polyfill": ^0.10.7 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 @@ -2739,8 +2748,8 @@ __metadata: tiny-uid: ^1.1.2 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 - type-fest: ^4.20.1 + tsup: ^8.2.3 + type-fest: ^4.23.0 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 webextension-polyfill: ^0.12.0 @@ -2751,9 +2760,9 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/extension@workspace:packages/extension" dependencies: - "@amplitude/analytics-browser": ^2.9.0 + "@amplitude/analytics-browser": ^2.9.3 "@babel/plugin-transform-class-static-block": ^7.24.7 - "@babel/runtime": ^7.24.7 + "@babel/runtime": ^7.25.0 "@enkryptcom/extension-bridge": "workspace:^" "@enkryptcom/hw-wallets": "workspace:^" "@enkryptcom/keyring": "workspace:^" @@ -2765,33 +2774,33 @@ __metadata: "@ethereumjs/common": ^4.3.0 "@ethereumjs/tx": ^5.3.0 "@ethereumjs/util": ^9.0.3 - "@kadena/client": ^1.12.0 - "@kadena/pactjs-cli": ^1.12.0 - "@ledgerhq/hw-transport-webusb": ^6.29.0 - "@metamask/eth-sig-util": ^7.0.2 - "@polkadot/api": ^11.3.1 - "@polkadot/extension-inject": ^0.47.6 - "@polkadot/keyring": ^12.6.2 - "@polkadot/rpc-provider": ^11.3.1 - "@polkadot/types": ^11.3.1 - "@polkadot/types-known": ^11.3.1 - "@polkadot/ui-shared": ^3.6.6 - "@polkadot/util": ^12.6.2 + "@kadena/client": ^1.13.0 + "@kadena/pactjs-cli": ^1.13.0 + "@ledgerhq/hw-transport-webusb": ^6.29.2 + "@metamask/eth-sig-util": ^7.0.3 + "@polkadot/api": ^12.2.3 + "@polkadot/extension-inject": ^0.50.1 + "@polkadot/keyring": ^13.0.2 + "@polkadot/rpc-provider": ^12.2.3 + "@polkadot/types": ^12.2.3 + "@polkadot/types-known": ^12.2.3 + "@polkadot/ui-shared": ^3.8.2 + "@polkadot/util": ^13.0.2 "@polkadot/wasm-crypto": ^7.3.2 "@rollup/plugin-commonjs": ^26.0.1 "@rollup/plugin-inject": ^5.0.5 "@rollup/plugin-node-resolve": ^15.2.3 "@rollup/plugin-replace": ^5.0.7 "@rollup/plugin-typescript": ^11.1.6 - "@types/chrome": ^0.0.268 + "@types/chrome": ^0.0.269 "@types/ethereumjs-abi": ^0.6.5 "@types/events": ^3.0.3 "@types/less": ^3.0.6 - "@types/lodash": ^4.17.5 - "@types/mocha": ^10.0.6 + "@types/lodash": ^4.17.7 + "@types/mocha": ^10.0.7 "@types/url-parse": ^1.4.11 "@types/utf-8-validate": ^5.0.2 - "@types/uuid": ^9.0.8 + "@types/uuid": ^10.0.0 "@types/wif": ^2.0.5 "@types/zxcvbn": ^4.4.4 "@typescript-eslint/eslint-plugin": ^5.62.0 @@ -2807,17 +2816,17 @@ __metadata: bip39: ^3.1.0 bitcoinjs-lib: ^6.1.6 buffer: ^6.0.3 - chai: ^4.4.1 + chai: ^4.5.0 concurrently: ^8.2.2 core-js: ^3.37.1 cross-env: ^7.0.3 crypto-browserify: ^3.12.0 - echarts: ^5.5.0 + echarts: ^5.5.1 eslint: ^8.57.0 eslint-config-prettier: ^8.10.0 eslint-plugin-prettier: ^4.2.1 eslint-plugin-vue: ^8.7.1 - ethereum-cryptography: ^2.2.0 + ethereum-cryptography: ^2.2.1 ethereumjs-abi: ^0.6.8 ethereumjs-wallet: ^1.0.2 eventemitter3: ^5.0.1 @@ -2826,18 +2835,18 @@ __metadata: less-loader: ^12.2.0 lodash: ^4.17.21 memoize-one: ^6.0.0 - mocha: ^10.4.0 + mocha: ^10.7.0 moment: ^2.30.1 nanoevents: ^9.0.0 pact-lang-api: ^4.3.6 path-browserify: ^1.0.1 - pinia: ^2.1.7 + pinia: ^2.2.0 prettier: ^2.8.8 qrcode.vue: ^3.4.1 - rimraf: ^5.0.7 - rollup: ^4.18.0 + rimraf: ^6.0.1 + rollup: ^4.19.1 rollup-plugin-uglify: ^6.0.4 - semver: ^7.6.2 + semver: ^7.6.3 stream-browserify: ^3.0.0 stream-http: ^3.2.0 switch-ts: ^1.1.1 @@ -2845,12 +2854,12 @@ __metadata: ts-mocha: ^10.0.0 tsconfig-paths: ^4.2.0 typescript: ^4.9.5 - url: ^0.11.3 + url: ^0.11.4 url-parse: ^1.5.10 uuid: ^10.0.0 - vue: ^3.4.29 - vue-echarts: 6.7.3 - vue-router: 4.3.3 + vue: ^3.4.34 + vue-echarts: 7.0.0-beta.0 + vue-router: 4.4.0 vue3-lottie: ^3.3.0 vuedraggable: ^4.1.0 web3-eth: ^1.10.4 @@ -2870,20 +2879,20 @@ __metadata: "@ethereumjs/rlp": ^5.0.2 "@ethereumjs/tx": ^5.3.0 "@ethereumjs/util": ^9.0.3 - "@ledgerhq/hw-app-eth": ^6.37.0 - "@ledgerhq/hw-transport": ^6.31.0 - "@ledgerhq/hw-transport-webusb": ^6.29.0 + "@ledgerhq/hw-app-eth": ^6.37.3 + "@ledgerhq/hw-transport": ^6.31.2 + "@ledgerhq/hw-transport-webusb": ^6.29.2 "@ledgerhq/live-common": ^34.1.0 - "@polkadot/types": ^11.3.1 - "@polkadot/util": ^12.6.2 - "@trezor/connect-web": ^9.2.4 + "@polkadot/types": ^12.2.3 + "@polkadot/util": ^13.0.2 + "@trezor/connect-web": ^9.3.0 "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 - "@zondax/ledger-substrate": ^0.44.2 - chai: ^4.4.1 + "@zondax/ledger-substrate": ^0.44.7 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -2891,12 +2900,12 @@ __metadata: eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 hdkey: ^2.1.0 - mocha: ^10.4.0 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 webextension-polyfill: ^0.12.0 @@ -2914,27 +2923,27 @@ __metadata: "@enkryptcom/storage": "workspace:^" "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@polkadot/util": ^12.6.2 + "@polkadot/util": ^13.0.2 "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 assert: ^2.1.0 bip39: ^3.1.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 - mocha: ^10.4.0 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -2947,12 +2956,12 @@ __metadata: "@ensdomains/address-encoder": ^1.1.2 "@siddomains/sidjs": 0.1.29 "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 "@unstoppabledomains/resolution": ^9.2.2 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -2960,12 +2969,12 @@ __metadata: eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 ethers: ^5.7.2 - mocha: ^10.4.0 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -2977,11 +2986,11 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -2991,18 +3000,18 @@ __metadata: eventemitter3: ^5.0.1 isomorphic-ws: ^5.0.0 json-rpc-2.0: ^1.7.0 - mocha: ^10.4.0 + mocha: ^10.7.0 node-fetch: ^2.7.0 prettier: ^2.8.8 reconnecting-websocket: ^4.4.0 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 uuid: ^10.0.0 - ws: ^8.17.1 + ws: ^8.18.0 languageName: unknown linkType: soft @@ -3015,12 +3024,12 @@ __metadata: "@noble/secp256k1": 1.7.1 "@types/chai": ^4.3.16 "@types/hdkey": ^2.0.3 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -3028,12 +3037,12 @@ __metadata: eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 hdkey: ^2.1.0 - mocha: ^10.4.0 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^9.0.2 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 tweetnacl: ^1.0.3 tweetnacl-util: ^0.15.1 typescript: ^4.9.5 @@ -3050,12 +3059,12 @@ __metadata: "@ethereumjs/util": ^9.0.3 "@types/chai": ^4.3.16 "@types/hdkey": ^2.0.3 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -3063,12 +3072,12 @@ __metadata: eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 hdkey: ^2.1.0 - mocha: ^10.4.0 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 tweetnacl: ^1.0.3 tweetnacl-util: ^0.15.1 typescript: ^4.9.5 @@ -3082,27 +3091,27 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@polkadot/util-crypto": ^12.6.2 + "@polkadot/util-crypto": ^13.0.2 "@types/chai": ^4.3.16 "@types/hdkey": ^2.0.3 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 - mocha: ^9.2.2 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^9.0.2 ts-node: ^10.9.2 tsconfig-paths: ^3.15.0 - tsup: ^8.1.0 + tsup: ^8.2.3 tweetnacl: ^1.0.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 @@ -3116,28 +3125,28 @@ __metadata: "@commitlint/cli": ^19.3.0 "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@polkadot/util": ^12.6.2 - "@polkadot/util-crypto": ^12.6.2 + "@polkadot/util": ^13.0.2 + "@polkadot/util-crypto": ^13.0.2 "@polkadot/wasm-crypto": ^7.3.2 "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 assert: ^2.1.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 - mocha: ^10.4.0 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -3150,11 +3159,11 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -3162,12 +3171,12 @@ __metadata: eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 localforage: ^1.10.0 - mocha: ^10.4.0 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -3180,12 +3189,12 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bignumber.js: ^9.1.2 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -3196,21 +3205,21 @@ __metadata: isomorphic-ws: ^5.0.0 json-rpc-2.0: ^1.7.0 lodash: ^4.17.21 - mocha: ^10.4.0 + mocha: ^10.7.0 node-fetch: ^2.7.0 prettier: ^2.8.8 - rango-sdk-basic: ^0.1.49 + rango-sdk-basic: ^0.1.51 reconnecting-websocket: ^4.4.0 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 uuid: ^10.0.0 web3-eth: ^1.10.4 web3-utils: ^1.10.4 - ws: ^8.17.1 + ws: ^8.18.0 languageName: unknown linkType: soft @@ -3218,7 +3227,7 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/types@workspace:packages/types" dependencies: - "@types/node": ^20.14.6 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 eslint: ^8.57.0 @@ -3230,7 +3239,7 @@ __metadata: prettier: ^2.8.8 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -3242,27 +3251,27 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@ethereumjs/util": ^9.0.3 - "@polkadot/util-crypto": ^12.6.2 + "@polkadot/util-crypto": ^13.0.2 "@types/chai": ^4.3.16 - "@types/mocha": ^10.0.6 - "@types/node": ^20.14.6 + "@types/mocha": ^10.0.7 + "@types/node": ^20.14.13 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 - chai: ^4.4.1 + chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 eslint-plugin-import: ^2.29.1 eslint-plugin-module-resolver: ^1.5.0 - ethereum-cryptography: ^2.2.0 - mocha: ^10.4.0 + ethereum-cryptography: ^2.2.1 + mocha: ^10.7.0 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.1.0 + tsup: ^8.2.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 web3-utils: ^1.10.4 @@ -3389,9 +3398,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/aix-ppc64@npm:0.21.5" +"@esbuild/aix-ppc64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/aix-ppc64@npm:0.23.0" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -3403,9 +3412,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm64@npm:0.21.5" +"@esbuild/android-arm64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/android-arm64@npm:0.23.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -3417,9 +3426,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-arm@npm:0.21.5" +"@esbuild/android-arm@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/android-arm@npm:0.23.0" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -3431,9 +3440,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/android-x64@npm:0.21.5" +"@esbuild/android-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/android-x64@npm:0.23.0" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -3445,9 +3454,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-arm64@npm:0.21.5" +"@esbuild/darwin-arm64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/darwin-arm64@npm:0.23.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -3459,9 +3468,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/darwin-x64@npm:0.21.5" +"@esbuild/darwin-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/darwin-x64@npm:0.23.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -3473,9 +3482,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-arm64@npm:0.21.5" +"@esbuild/freebsd-arm64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/freebsd-arm64@npm:0.23.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -3487,9 +3496,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/freebsd-x64@npm:0.21.5" +"@esbuild/freebsd-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/freebsd-x64@npm:0.23.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -3501,9 +3510,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm64@npm:0.21.5" +"@esbuild/linux-arm64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-arm64@npm:0.23.0" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -3515,9 +3524,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-arm@npm:0.21.5" +"@esbuild/linux-arm@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-arm@npm:0.23.0" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -3529,9 +3538,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ia32@npm:0.21.5" +"@esbuild/linux-ia32@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-ia32@npm:0.23.0" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -3543,9 +3552,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-loong64@npm:0.21.5" +"@esbuild/linux-loong64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-loong64@npm:0.23.0" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -3557,9 +3566,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-mips64el@npm:0.21.5" +"@esbuild/linux-mips64el@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-mips64el@npm:0.23.0" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -3571,9 +3580,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-ppc64@npm:0.21.5" +"@esbuild/linux-ppc64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-ppc64@npm:0.23.0" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -3585,9 +3594,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-riscv64@npm:0.21.5" +"@esbuild/linux-riscv64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-riscv64@npm:0.23.0" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -3599,9 +3608,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-s390x@npm:0.21.5" +"@esbuild/linux-s390x@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-s390x@npm:0.23.0" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -3613,9 +3622,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/linux-x64@npm:0.21.5" +"@esbuild/linux-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/linux-x64@npm:0.23.0" conditions: os=linux & cpu=x64 languageName: node linkType: hard @@ -3627,13 +3636,20 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/netbsd-x64@npm:0.21.5" +"@esbuild/netbsd-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/netbsd-x64@npm:0.23.0" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard +"@esbuild/openbsd-arm64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/openbsd-arm64@npm:0.23.0" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/openbsd-x64@npm:0.20.2" @@ -3641,9 +3657,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/openbsd-x64@npm:0.21.5" +"@esbuild/openbsd-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/openbsd-x64@npm:0.23.0" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard @@ -3655,9 +3671,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/sunos-x64@npm:0.21.5" +"@esbuild/sunos-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/sunos-x64@npm:0.23.0" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -3669,9 +3685,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-arm64@npm:0.21.5" +"@esbuild/win32-arm64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/win32-arm64@npm:0.23.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -3683,9 +3699,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-ia32@npm:0.21.5" +"@esbuild/win32-ia32@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/win32-ia32@npm:0.23.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -3697,9 +3713,9 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.21.5": - version: 0.21.5 - resolution: "@esbuild/win32-x64@npm:0.21.5" +"@esbuild/win32-x64@npm:0.23.0": + version: 0.23.0 + resolution: "@esbuild/win32-x64@npm:0.23.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4574,7 +4590,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.5 resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: @@ -4654,28 +4670,28 @@ __metadata: languageName: node linkType: hard -"@kadena/chainweb-node-client@npm:0.6.2": - version: 0.6.2 - resolution: "@kadena/chainweb-node-client@npm:0.6.2" +"@kadena/chainweb-node-client@npm:0.6.3": + version: 0.6.3 + resolution: "@kadena/chainweb-node-client@npm:0.6.3" dependencies: "@kadena/cryptography-utils": 0.4.4 "@kadena/pactjs": 0.4.3 cross-fetch: ~3.1.5 - checksum: 6e95349b6f2917721833a31acb443840b85cb3adfcfd0062f7183bc15180c5169b65865515422d59282696a5835bb021b777767a84c2245130b3ea1d49aae88b + checksum: b305cc200d39ca2bc4405223b799aa824228fe3b63b8684d03432dff0bbc65ca115a68797fbba3014bffc61399b0bf40ad177bb0313e65a2b722fb848e4a4d2b languageName: node linkType: hard -"@kadena/client@npm:1.12.0, @kadena/client@npm:^1.12.0": - version: 1.12.0 - resolution: "@kadena/client@npm:1.12.0" +"@kadena/client@npm:1.13.0, @kadena/client@npm:^1.13.0": + version: 1.13.0 + resolution: "@kadena/client@npm:1.13.0" dependencies: - "@kadena/chainweb-node-client": 0.6.2 + "@kadena/chainweb-node-client": 0.6.3 "@kadena/cryptography-utils": 0.4.4 "@kadena/pactjs": 0.4.3 "@walletconnect/sign-client": ~2.8.1 cross-fetch: ~3.1.5 debug: 4.3.4 - checksum: bcdebc5b8300d6155a915fa34ac8ee090708b2b02587482e7f6b872c719f8d61896aa4ad369d0b99100fa1693983a173932620b8867a6babee3f730e2048a42a + checksum: cf8b886c1f8c3665f104d65dec127f434bd94c1f5d8acd420930372cc7d83766597798e1b61fb80edf61ec6be63ee04b67fe6d9972bb174eee5ec9bea6fee644 languageName: node linkType: hard @@ -4690,12 +4706,12 @@ __metadata: languageName: node linkType: hard -"@kadena/pactjs-cli@npm:^1.12.0": - version: 1.12.0 - resolution: "@kadena/pactjs-cli@npm:1.12.0" +"@kadena/pactjs-cli@npm:^1.13.0": + version: 1.13.0 + resolution: "@kadena/pactjs-cli@npm:1.13.0" dependencies: - "@kadena/client": 1.12.0 - "@kadena/pactjs-generator": 1.12.0 + "@kadena/client": 1.13.0 + "@kadena/pactjs-generator": 1.13.0 commander: ^11.0.0 cross-fetch: ~3.1.5 debug: 4.3.4 @@ -4705,18 +4721,18 @@ __metadata: zod: ~3.23.0 bin: pactjs: bin/pactjs.js - checksum: d2a627aafe442e3306b87d51d33d4970f85c9c1c899b7a45d8158f547531926ead510a18bd2185bcaea7edd255bbc621df984d0da14ec3f2bda29e2fdf872748 + checksum: 8fd293447ac4cbc0c78e15683b715854c4d3c7a9dd3c3a295fb82fb4d4dd203b703e5e479657efdc3cdc2d724689f8efb7620c95661b938a89bd94bcf69452d4 languageName: node linkType: hard -"@kadena/pactjs-generator@npm:1.12.0": - version: 1.12.0 - resolution: "@kadena/pactjs-generator@npm:1.12.0" +"@kadena/pactjs-generator@npm:1.13.0": + version: 1.13.0 + resolution: "@kadena/pactjs-generator@npm:1.13.0" dependencies: memfs: ~3.5.1 moo: ~0.5.1 nearley: ~2.20.1 - checksum: 7f8da8cbefaf0c203cea5403dbfdd0090e869f5be6f2829ff47d6520e3a00b1d6a1872bffe7e592939097407bf89e282e9e41bf90e9b95085f83c12569d15641 + checksum: 9f95fa6d58d6a85009ea647aab7887116d39dff526ae0ab3b6267df299752a73289770e0258a2ff33ff6342f5c9afd17d470ca3402aa6eae1938ecb7cdad8196 languageName: node linkType: hard @@ -4989,14 +5005,14 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/cryptoassets@npm:^13.1.0": - version: 13.1.0 - resolution: "@ledgerhq/cryptoassets@npm:13.1.0" +"@ledgerhq/cryptoassets@npm:^13.2.0": + version: 13.2.0 + resolution: "@ledgerhq/cryptoassets@npm:13.2.0" dependencies: axios: ^1.6.0 bs58check: ^2.1.2 invariant: 2 - checksum: 0d55b85d05aace7809f2217725b393c474ad5e4d255f74fc6fcfd8cb6bd0136f8b61b835a81b3d22de48fef82773977d9f22433acf584a7059c7806c34080ce4 + checksum: aec0547dcfc2e21241ede8fba154d11da306766ae73c7f1553f4cb445108c783d9b935481fa9e2cb67cb559ee63bc17507b2caec8c13bde613bb2b2bf9365013 languageName: node linkType: hard @@ -5064,15 +5080,15 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^8.4.0": - version: 8.4.0 - resolution: "@ledgerhq/devices@npm:8.4.0" +"@ledgerhq/devices@npm:^8.4.0, @ledgerhq/devices@npm:^8.4.2": + version: 8.4.2 + resolution: "@ledgerhq/devices@npm:8.4.2" dependencies: - "@ledgerhq/errors": ^6.17.0 + "@ledgerhq/errors": ^6.18.0 "@ledgerhq/logs": ^6.12.0 rxjs: ^7.8.1 semver: ^7.3.5 - checksum: 32a0fb1521ff48c53125bddb735f0d796bec867720888e2bf5841e1d15a9939d93de6065526db1a3c31feda30a7d53412a6a905c3cee1148d7c223c2ff65a660 + checksum: ff03c2cdb9cfef0eadd26c360f8023c3973f924832ad19e2ecd42800ea665ee9177f79f949f76cd26dcbc9d162c7901b81a28478943a3e391b7f2ec16d9f2c89 languageName: node linkType: hard @@ -5091,18 +5107,18 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/domain-service@npm:^1.2.0": - version: 1.2.0 - resolution: "@ledgerhq/domain-service@npm:1.2.0" +"@ledgerhq/domain-service@npm:^1.2.2": + version: 1.2.2 + resolution: "@ledgerhq/domain-service@npm:1.2.2" dependencies: - "@ledgerhq/errors": ^6.17.0 + "@ledgerhq/errors": ^6.18.0 "@ledgerhq/logs": ^6.12.0 - "@ledgerhq/types-live": ^6.48.0 + "@ledgerhq/types-live": ^6.49.0 axios: ^1.3.4 eip55: ^2.1.1 react: ^18.2.0 react-dom: ^18.2.0 - checksum: adde897a1e692b7fa1424e41f989f8d3baad168306555124ac2a0ace0f1ff52da8ca1ce69817a6afb4a063a7713d9ccec3c63e2a9a17ba79fca309d1921e46cd + checksum: 5a3aa9120e47a9e05270e41f4c1a5a57083218e7f45477ff31b4b371b6b5db4f280c6112ac80e79ce2ca0cb68c5eeb7edca7aa14d2cb1c3911e676ef99c4d793 languageName: node linkType: hard @@ -5127,10 +5143,10 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/errors@npm:^6.17.0": - version: 6.17.0 - resolution: "@ledgerhq/errors@npm:6.17.0" - checksum: 4558d2fa2c232aea951956fdc356afa3e0d4bb4cacb83d9ee9b7d6d65f0118881d700b9588891092578cfaa384b0731d856ee5e677bd255df2738b4358da2aa4 +"@ledgerhq/errors@npm:^6.17.0, @ledgerhq/errors@npm:^6.18.0": + version: 6.18.0 + resolution: "@ledgerhq/errors@npm:6.18.0" + checksum: 167f9530ca7498aa2ebfd3e036d3269f917bc27d95540f8a2a566b454896d41fc15026ac53951be0befdd1a05f9a9c2d03a6de8c78752e57aee9bc28838c8a48 languageName: node linkType: hard @@ -5147,16 +5163,16 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/evm-tools@npm:^1.1.0": - version: 1.1.0 - resolution: "@ledgerhq/evm-tools@npm:1.1.0" +"@ledgerhq/evm-tools@npm:^1.1.2": + version: 1.1.2 + resolution: "@ledgerhq/evm-tools@npm:1.1.2" dependencies: - "@ledgerhq/cryptoassets": ^13.1.0 + "@ledgerhq/cryptoassets": ^13.2.0 "@ledgerhq/live-env": ^2.1.0 axios: ^1.6.5 crypto-js: 4.2.0 ethers: 5.7.2 - checksum: 524f59d8a13fca1f7dc7108aa838c07d16fb0ecf9d9e21fdde4b55c1b5992b13e968bbc11a1964045897eb2bf1d46db931bde37b14fe51a64bd2c24db6c97e6f + checksum: 4ba7d891d8bc7b68701dbe55098c1bb5b4d6ea7ad18e56dc6b1eefb6f976346aa9b49aa8d34ce395b4049cbe1345417e532b71dfff74371bed14a1c73b03810f languageName: node linkType: hard @@ -5225,23 +5241,23 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-app-eth@npm:^6.37.0": - version: 6.37.0 - resolution: "@ledgerhq/hw-app-eth@npm:6.37.0" +"@ledgerhq/hw-app-eth@npm:^6.37.3": + version: 6.37.3 + resolution: "@ledgerhq/hw-app-eth@npm:6.37.3" dependencies: "@ethersproject/abi": ^5.5.0 "@ethersproject/rlp": ^5.5.0 - "@ledgerhq/cryptoassets": ^13.1.0 - "@ledgerhq/domain-service": ^1.2.0 - "@ledgerhq/errors": ^6.17.0 - "@ledgerhq/evm-tools": ^1.1.0 - "@ledgerhq/hw-transport": ^6.31.0 - "@ledgerhq/hw-transport-mocker": ^6.29.0 + "@ledgerhq/cryptoassets": ^13.2.0 + "@ledgerhq/domain-service": ^1.2.2 + "@ledgerhq/errors": ^6.18.0 + "@ledgerhq/evm-tools": ^1.1.2 + "@ledgerhq/hw-transport": ^6.31.2 + "@ledgerhq/hw-transport-mocker": ^6.29.2 "@ledgerhq/logs": ^6.12.0 - "@ledgerhq/types-live": ^6.48.0 + "@ledgerhq/types-live": ^6.49.0 axios: ^1.3.4 bignumber.js: ^9.1.2 - checksum: 013e0ad06ea61e2ffae36cf1b2c15d0761bcda136bd7214f9b860130b04b88bdc6ae7a00d4f78c9ac7e57e245829081352d277773c508abaa45b287358878251 + checksum: 93d46e4570d76f65f403db619dc35923282a762ef68f90ae32acbaef24f288c436b8c99abe7a293c1256558f10100a949484de9da83aea2ff932345445af0d6c languageName: node linkType: hard @@ -5369,14 +5385,14 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-transport-mocker@npm:^6.29.0": - version: 6.29.0 - resolution: "@ledgerhq/hw-transport-mocker@npm:6.29.0" +"@ledgerhq/hw-transport-mocker@npm:^6.29.2": + version: 6.29.2 + resolution: "@ledgerhq/hw-transport-mocker@npm:6.29.2" dependencies: - "@ledgerhq/hw-transport": ^6.31.0 + "@ledgerhq/hw-transport": ^6.31.2 "@ledgerhq/logs": ^6.12.0 rxjs: ^7.8.1 - checksum: 012ce1ff23e2b0ddedf3d1532d9f64b30fbc9a4669a28eb82d098ed3b5f5b7495d840bfdf60a62cd8955aced0787cfcacf78edcf200867985ebb7f9378526869 + checksum: 16d936cc6618301630214c2ee28f478b80a1c1f1ccbfeabf19199fb4962e096153b3ea32964d138b7b2507a20b27a0bfe3f81ee158ca827e6d095361b75fffcf languageName: node linkType: hard @@ -5417,15 +5433,15 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-transport-webusb@npm:^6.29.0": - version: 6.29.0 - resolution: "@ledgerhq/hw-transport-webusb@npm:6.29.0" +"@ledgerhq/hw-transport-webusb@npm:^6.29.2": + version: 6.29.2 + resolution: "@ledgerhq/hw-transport-webusb@npm:6.29.2" dependencies: - "@ledgerhq/devices": ^8.4.0 - "@ledgerhq/errors": ^6.17.0 - "@ledgerhq/hw-transport": ^6.31.0 + "@ledgerhq/devices": ^8.4.2 + "@ledgerhq/errors": ^6.18.0 + "@ledgerhq/hw-transport": ^6.31.2 "@ledgerhq/logs": ^6.12.0 - checksum: 7e6702b986c22bdb746d2087ea3920600fbabe487df2607c7e2e3cdf9bbdeaeb32471c47b8a3f7a18824c1fae19b8be4c71cfae66343feacc81e4554fd757af3 + checksum: cac07618fe21147a3cb3069b1d5a4d92e2d0a1cb700ac5264802d20651381192bf7568a18f3fe3e013e77129ec0777d0f864698de64e3786fd1a19d89dcae840 languageName: node linkType: hard @@ -5463,6 +5479,18 @@ __metadata: languageName: node linkType: hard +"@ledgerhq/hw-transport@npm:6.31.0": + version: 6.31.0 + resolution: "@ledgerhq/hw-transport@npm:6.31.0" + dependencies: + "@ledgerhq/devices": ^8.4.0 + "@ledgerhq/errors": ^6.17.0 + "@ledgerhq/logs": ^6.12.0 + events: ^3.3.0 + checksum: 97911686ed4de1aaedcde364616c36a9831278002d7a168ea8469c0ce79d1712ded53c1f6deec3b7a86b76cad8b7ad4ba819670e864b1acfeb873271a829ee36 + languageName: node + linkType: hard + "@ledgerhq/hw-transport@npm:^5.11.0, @ledgerhq/hw-transport@npm:^5.19.1, @ledgerhq/hw-transport@npm:^5.34.0": version: 5.51.1 resolution: "@ledgerhq/hw-transport@npm:5.51.1" @@ -5486,15 +5514,15 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^6.31.0": - version: 6.31.0 - resolution: "@ledgerhq/hw-transport@npm:6.31.0" +"@ledgerhq/hw-transport@npm:^6.31.2": + version: 6.31.2 + resolution: "@ledgerhq/hw-transport@npm:6.31.2" dependencies: - "@ledgerhq/devices": ^8.4.0 - "@ledgerhq/errors": ^6.17.0 + "@ledgerhq/devices": ^8.4.2 + "@ledgerhq/errors": ^6.18.0 "@ledgerhq/logs": ^6.12.0 events: ^3.3.0 - checksum: 97911686ed4de1aaedcde364616c36a9831278002d7a168ea8469c0ce79d1712ded53c1f6deec3b7a86b76cad8b7ad4ba819670e864b1acfeb873271a829ee36 + checksum: 61f9fc0c9576bd2247f8ac660efc32f50ffaf7c099d6f0270d8ea66e624dab00c8a58586aed14e4c56ff6462c76f01e4e5e5d3ca7d6920beafb51b29b840b3ad languageName: node linkType: hard @@ -5824,13 +5852,13 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/types-live@npm:^6.48.0": - version: 6.48.0 - resolution: "@ledgerhq/types-live@npm:6.48.0" +"@ledgerhq/types-live@npm:^6.49.0": + version: 6.49.0 + resolution: "@ledgerhq/types-live@npm:6.49.0" dependencies: bignumber.js: ^9.1.2 rxjs: ^7.8.1 - checksum: 88c60099e74b3458a6b7d0d98711b853d9d3185db298de5a8b8e2ec2dd76ad4ab2e9c8ee20bc5eb60192c4ffa3a75cb2cf518b6b6cd3b330c8f7342206a01378 + checksum: 1d09725cd1075e81a55e2d171322db21991bf4838981cad3cb923c8422493130ed5373a5ad06b9d3b3fe0231a39a3e600cc171a2a7e51d2c1fde6ce24d94a557 languageName: node linkType: hard @@ -5891,43 +5919,51 @@ __metadata: languageName: node linkType: hard -"@metamask/abi-utils@npm:^2.0.2": - version: 2.0.2 - resolution: "@metamask/abi-utils@npm:2.0.2" +"@metamask/abi-utils@npm:^2.0.4": + version: 2.0.4 + resolution: "@metamask/abi-utils@npm:2.0.4" dependencies: - "@metamask/utils": ^8.0.0 - superstruct: ^1.0.3 - checksum: 5ec153e7691a4e1dc8738a0ba1a99a354ddb13851fa88a40a19f002f6308310e71c2cee28c3a25d9f7f67e839c7dffe4760e93e308dd17fa725b08d0dc73a3d4 + "@metamask/superstruct": ^3.1.0 + "@metamask/utils": ^9.0.0 + checksum: 85b15419248ddec1ab59ec5f3e41276f7509dadd9ced871658fa3cc04805ad35ace96986416aaecd24e3630e92b0ed078328966c92383ffa9b1cc3f0f357ad6c languageName: node linkType: hard -"@metamask/eth-sig-util@npm:^7.0.2": - version: 7.0.2 - resolution: "@metamask/eth-sig-util@npm:7.0.2" +"@metamask/eth-sig-util@npm:^7.0.3": + version: 7.0.3 + resolution: "@metamask/eth-sig-util@npm:7.0.3" dependencies: "@ethereumjs/util": ^8.1.0 - "@metamask/abi-utils": ^2.0.2 - "@metamask/utils": ^8.1.0 + "@metamask/abi-utils": ^2.0.4 + "@metamask/utils": ^9.0.0 "@scure/base": ~1.1.3 ethereum-cryptography: ^2.1.2 tweetnacl: ^1.0.3 - checksum: f4aa8bf3dcfee0f99911e8e540cc3f6681e5d4b6d279ee2280062481492f45d57b0e4ce29165177b724ca75187dbb98471a679c6ba5f5244a14065596e45e255 + checksum: fd4d0710857525815b241ddecce64988dd12303a9638577429baf180c62cf9cef9403aed01bc046b4860b332d455604c84e4b2a9b5997db16f444125b4b39398 languageName: node linkType: hard -"@metamask/utils@npm:^8.0.0, @metamask/utils@npm:^8.1.0": - version: 8.3.0 - resolution: "@metamask/utils@npm:8.3.0" +"@metamask/superstruct@npm:^3.1.0": + version: 3.1.0 + resolution: "@metamask/superstruct@npm:3.1.0" + checksum: 00e4d0c0aae8b25ccc1885c1db0bb4ed1590010570140c255e4deee3bf8a10c859c8fce5e475b4ae09c8a56316207af87585b91f7f5a5c028d668ccd111f19e3 + languageName: node + linkType: hard + +"@metamask/utils@npm:^9.0.0": + version: 9.1.0 + resolution: "@metamask/utils@npm:9.1.0" dependencies: "@ethereumjs/tx": ^4.2.0 + "@metamask/superstruct": ^3.1.0 "@noble/hashes": ^1.3.1 "@scure/base": ^1.1.3 "@types/debug": ^4.1.7 debug: ^4.3.4 pony-cause: ^2.1.10 semver: ^7.5.4 - superstruct: ^1.0.3 - checksum: cd60c49b4c0397fb31e6b38937a0d9346cbb8337cb8add59db8db0e0e2156fb063ff4df93a26410157f0cc02aa9a9b785fc1b53cfc4ab73204462893ed11cacb + uuid: ^9.0.1 + checksum: 01f2c71a8f06158d5335bfe96bfd2f3aa39ec6b2323c5d0ff1d3136071a3e8ff7c1804d640ba1d4e07f96f3e68a95ff7729ddfcd34b373e5fefd86d6ef12d034 languageName: node linkType: hard @@ -6104,7 +6140,16 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.4.0, @noble/curves@npm:^1.0.0, @noble/curves@npm:^1.1.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.3.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:~1.4.0": +"@noble/curves@npm:1.4.2": + version: 1.4.2 + resolution: "@noble/curves@npm:1.4.2" + dependencies: + "@noble/hashes": 1.4.0 + checksum: c475a83c4263e2c970eaba728895b9b5d67e0ca880651e9c6e3efdc5f6a4f07ceb5b043bf71c399fc80fada0b8706e69d0772bffdd7b9de2483b988973a34cba + languageName: node + linkType: hard + +"@noble/curves@npm:^1.0.0, @noble/curves@npm:^1.1.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.3.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:~1.4.0": version: 1.4.0 resolution: "@noble/curves@npm:1.4.0" dependencies: @@ -6337,96 +6382,96 @@ __metadata: languageName: node linkType: hard -"@polkadot/api-augment@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/api-augment@npm:11.3.1" +"@polkadot/api-augment@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/api-augment@npm:12.2.3" dependencies: - "@polkadot/api-base": 11.3.1 - "@polkadot/rpc-augment": 11.3.1 - "@polkadot/types": 11.3.1 - "@polkadot/types-augment": 11.3.1 - "@polkadot/types-codec": 11.3.1 - "@polkadot/util": ^12.6.2 + "@polkadot/api-base": 12.2.3 + "@polkadot/rpc-augment": 12.2.3 + "@polkadot/types": 12.2.3 + "@polkadot/types-augment": 12.2.3 + "@polkadot/types-codec": 12.2.3 + "@polkadot/util": ^13.0.2 tslib: ^2.6.2 - checksum: 2910ab42ddb7787a5230cdd1a1c4ce8b0491fbdab44b349cf5523ad2f8c885db00c1caeb76cf96daec3a32461d970efd18ccaceed374294f0e2af6c8c093bb41 + checksum: bf40a0db154865f59c495ea938cb0aabcb16e7d14b3443655dcd73ea2b907ce1fb65a88ee6d9cfb0c1c5da25641de08a0cde62ca40c457e83aa7408766ca5322 languageName: node linkType: hard -"@polkadot/api-base@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/api-base@npm:11.3.1" +"@polkadot/api-base@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/api-base@npm:12.2.3" dependencies: - "@polkadot/rpc-core": 11.3.1 - "@polkadot/types": 11.3.1 - "@polkadot/util": ^12.6.2 + "@polkadot/rpc-core": 12.2.3 + "@polkadot/types": 12.2.3 + "@polkadot/util": ^13.0.2 rxjs: ^7.8.1 tslib: ^2.6.2 - checksum: 955c8c62fa4fc390a46570d3f86d5d1f828345c804b79e9344bf57fa2e986d053cec0b19bea7a95956a2216db319f0cc5ecb8f099b091a6f7fa5792037cca311 + checksum: 93671b0386f1cb7c4554ac1d287ced15aafe30ffffc79f356f21380bb71ec4202d17c6c120fc87d1a4fcccc032d96e9e3aa18ed3d794338d09223daf90039e77 languageName: node linkType: hard -"@polkadot/api-derive@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/api-derive@npm:11.3.1" +"@polkadot/api-derive@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/api-derive@npm:12.2.3" dependencies: - "@polkadot/api": 11.3.1 - "@polkadot/api-augment": 11.3.1 - "@polkadot/api-base": 11.3.1 - "@polkadot/rpc-core": 11.3.1 - "@polkadot/types": 11.3.1 - "@polkadot/types-codec": 11.3.1 - "@polkadot/util": ^12.6.2 - "@polkadot/util-crypto": ^12.6.2 + "@polkadot/api": 12.2.3 + "@polkadot/api-augment": 12.2.3 + "@polkadot/api-base": 12.2.3 + "@polkadot/rpc-core": 12.2.3 + "@polkadot/types": 12.2.3 + "@polkadot/types-codec": 12.2.3 + "@polkadot/util": ^13.0.2 + "@polkadot/util-crypto": ^13.0.2 rxjs: ^7.8.1 tslib: ^2.6.2 - checksum: 94c08ea8341fba531010a28331dede0567d6fe53d064ec4e4fdf13d0e446e25e490b493142213f231683f6da8353bb015a93b0c9a8c0a414c794594be689a790 - languageName: node - linkType: hard - -"@polkadot/api@npm:11.3.1, @polkadot/api@npm:^11.3.1": - version: 11.3.1 - resolution: "@polkadot/api@npm:11.3.1" - dependencies: - "@polkadot/api-augment": 11.3.1 - "@polkadot/api-base": 11.3.1 - "@polkadot/api-derive": 11.3.1 - "@polkadot/keyring": ^12.6.2 - "@polkadot/rpc-augment": 11.3.1 - "@polkadot/rpc-core": 11.3.1 - "@polkadot/rpc-provider": 11.3.1 - "@polkadot/types": 11.3.1 - "@polkadot/types-augment": 11.3.1 - "@polkadot/types-codec": 11.3.1 - "@polkadot/types-create": 11.3.1 - "@polkadot/types-known": 11.3.1 - "@polkadot/util": ^12.6.2 - "@polkadot/util-crypto": ^12.6.2 + checksum: 86af8b1c3b32f9c39ba0b9276163e82490034261a16ccd5e9cf1a1346bc9d30f9ee8141ed1e60d614ed9eb65f10879110cbce2aaa24d078bc261ccca782c261f + languageName: node + linkType: hard + +"@polkadot/api@npm:12.2.3, @polkadot/api@npm:^12.2.1, @polkadot/api@npm:^12.2.3": + version: 12.2.3 + resolution: "@polkadot/api@npm:12.2.3" + dependencies: + "@polkadot/api-augment": 12.2.3 + "@polkadot/api-base": 12.2.3 + "@polkadot/api-derive": 12.2.3 + "@polkadot/keyring": ^13.0.2 + "@polkadot/rpc-augment": 12.2.3 + "@polkadot/rpc-core": 12.2.3 + "@polkadot/rpc-provider": 12.2.3 + "@polkadot/types": 12.2.3 + "@polkadot/types-augment": 12.2.3 + "@polkadot/types-codec": 12.2.3 + "@polkadot/types-create": 12.2.3 + "@polkadot/types-known": 12.2.3 + "@polkadot/util": ^13.0.2 + "@polkadot/util-crypto": ^13.0.2 eventemitter3: ^5.0.1 rxjs: ^7.8.1 tslib: ^2.6.2 - checksum: 1cc81ef5bc9483744475f1fd5b268018cf528ffe47ab598555be8c16d69162606ef2f357cf9ffa27b9d7bbcaa95841fa4079a5d3fcb8f5520533378191ddf9bf + checksum: 08c1600b090b6d52ab20e7f662a80ab3a91dce39ecca68fae7985b6fa720fb86cb7603824d37ec8921d27e3c74dd1e8d1fec9acca91d10b6cd7054bb80a6b001 languageName: node linkType: hard -"@polkadot/extension-inject@npm:^0.47.6": - version: 0.47.6 - resolution: "@polkadot/extension-inject@npm:0.47.6" +"@polkadot/extension-inject@npm:^0.50.1": + version: 0.50.1 + resolution: "@polkadot/extension-inject@npm:0.50.1" dependencies: - "@polkadot/api": ^11.3.1 - "@polkadot/rpc-provider": ^11.3.1 - "@polkadot/types": ^11.3.1 - "@polkadot/util": ^12.6.2 - "@polkadot/util-crypto": ^12.6.2 - "@polkadot/x-global": ^12.6.2 + "@polkadot/api": ^12.2.1 + "@polkadot/rpc-provider": ^12.2.1 + "@polkadot/types": ^12.2.1 + "@polkadot/util": ^13.0.2 + "@polkadot/util-crypto": ^13.0.2 + "@polkadot/x-global": ^13.0.2 tslib: ^2.6.2 peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" - checksum: 504b630be5355b264e2a1b3fa99dc72c76f8185167d9bd1a8d68471649af414e4aa66bf02f1cc1c77a1307a42cceaa7a9c78af7424c23a1c5bc3c2284be7ea44 + checksum: 2cff1aca27e94778a38b0c51dc81c2437f64dfe07126061d1965c4d33cd620b62955e2266eb023798cd3472231083cbabb5f16de1c990dd9a413561545383efe languageName: node linkType: hard -"@polkadot/keyring@npm:^12.3.1, @polkadot/keyring@npm:^12.6.2": +"@polkadot/keyring@npm:^12.3.1": version: 12.6.2 resolution: "@polkadot/keyring@npm:12.6.2" dependencies: @@ -6440,6 +6485,20 @@ __metadata: languageName: node linkType: hard +"@polkadot/keyring@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/keyring@npm:13.0.2" + dependencies: + "@polkadot/util": 13.0.2 + "@polkadot/util-crypto": 13.0.2 + tslib: ^2.6.2 + peerDependencies: + "@polkadot/util": 13.0.2 + "@polkadot/util-crypto": 13.0.2 + checksum: 334aaee396e3f624341ac87bbf9288b3ae0b7c5d8ef222741b802563b1ae88c47f2b8ec2a1989cd62403e1ae0261b4380218c5e112d8a44674cf432216f5c3bb + languageName: node + linkType: hard + "@polkadot/networks@npm:12.5.1": version: 12.5.1 resolution: "@polkadot/networks@npm:12.5.1" @@ -6451,7 +6510,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/networks@npm:12.6.2, @polkadot/networks@npm:^12.3.1, @polkadot/networks@npm:^12.6.2": +"@polkadot/networks@npm:12.6.2, @polkadot/networks@npm:^12.3.1": version: 12.6.2 resolution: "@polkadot/networks@npm:12.6.2" dependencies: @@ -6462,45 +6521,56 @@ __metadata: languageName: node linkType: hard -"@polkadot/rpc-augment@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/rpc-augment@npm:11.3.1" +"@polkadot/networks@npm:13.0.2, @polkadot/networks@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/networks@npm:13.0.2" dependencies: - "@polkadot/rpc-core": 11.3.1 - "@polkadot/types": 11.3.1 - "@polkadot/types-codec": 11.3.1 - "@polkadot/util": ^12.6.2 + "@polkadot/util": 13.0.2 + "@substrate/ss58-registry": ^1.46.0 tslib: ^2.6.2 - checksum: 047f3a534e2017c8f486018aab56284e69ec8fd38985ef18f3b39f5b697d83a0793443d9ff012b554c35ad31852339da37eb938a37b99ef18dd8c906483abc0b + checksum: 4bc02ae6a95c0bf770ab2ba99af59013665edf4e759a228148289859dcc171be61d93359f6846a5d248707eb215bcbf2ca69ae9f63eb1720caa38ceb3dab7587 languageName: node linkType: hard -"@polkadot/rpc-core@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/rpc-core@npm:11.3.1" +"@polkadot/rpc-augment@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/rpc-augment@npm:12.2.3" dependencies: - "@polkadot/rpc-augment": 11.3.1 - "@polkadot/rpc-provider": 11.3.1 - "@polkadot/types": 11.3.1 - "@polkadot/util": ^12.6.2 + "@polkadot/rpc-core": 12.2.3 + "@polkadot/types": 12.2.3 + "@polkadot/types-codec": 12.2.3 + "@polkadot/util": ^13.0.2 + tslib: ^2.6.2 + checksum: 97d0b2c5451d5cb96e84569b0c5e2763abd83def4704def25f6ad728ca8eddc4c3872bd5afb26d9a8be28273f2bd927d1292b0e480727b0fe302548c5c432ae8 + languageName: node + linkType: hard + +"@polkadot/rpc-core@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/rpc-core@npm:12.2.3" + dependencies: + "@polkadot/rpc-augment": 12.2.3 + "@polkadot/rpc-provider": 12.2.3 + "@polkadot/types": 12.2.3 + "@polkadot/util": ^13.0.2 rxjs: ^7.8.1 tslib: ^2.6.2 - checksum: 031641f506349110339a18ed2eac789e6e24e1702792dee72a0270902420a483ee117153a1f3fbf48e2467b236bc72a41f9e9750f690f9d8efbd8d56715477b1 + checksum: bf0ff9d66ce3581751d0d0c26fd469e8b8d53bb50fdfd0e5da5cfbe1e811eefdf9c57cfbbb5f89e41ffc9ba44b0ea42ab8d73175d5a85ce73c1673c04e452003 languageName: node linkType: hard -"@polkadot/rpc-provider@npm:11.3.1, @polkadot/rpc-provider@npm:^11.3.1": - version: 11.3.1 - resolution: "@polkadot/rpc-provider@npm:11.3.1" +"@polkadot/rpc-provider@npm:12.2.3, @polkadot/rpc-provider@npm:^12.2.1, @polkadot/rpc-provider@npm:^12.2.3": + version: 12.2.3 + resolution: "@polkadot/rpc-provider@npm:12.2.3" dependencies: - "@polkadot/keyring": ^12.6.2 - "@polkadot/types": 11.3.1 - "@polkadot/types-support": 11.3.1 - "@polkadot/util": ^12.6.2 - "@polkadot/util-crypto": ^12.6.2 - "@polkadot/x-fetch": ^12.6.2 - "@polkadot/x-global": ^12.6.2 - "@polkadot/x-ws": ^12.6.2 + "@polkadot/keyring": ^13.0.2 + "@polkadot/types": 12.2.3 + "@polkadot/types-support": 12.2.3 + "@polkadot/util": ^13.0.2 + "@polkadot/util-crypto": ^13.0.2 + "@polkadot/x-fetch": ^13.0.2 + "@polkadot/x-global": ^13.0.2 + "@polkadot/x-ws": ^13.0.2 "@substrate/connect": 0.8.10 eventemitter3: ^5.0.1 mock-socket: ^9.3.1 @@ -6509,7 +6579,7 @@ __metadata: dependenciesMeta: "@substrate/connect": optional: true - checksum: c2019bcae03c0272d45683b542b6a6679cfb71bae94392c32f8d9c830ea68c07cd5d9ac5fe19cb4df7197f5c721120e068b690e33003853045c126f2275ccb95 + checksum: 88d7f7ce64c73bd2c118510aa0ae399707fd2e1b3420d593c76f7e5de570484ee48f0fbf4fcac9c0fe75da6d3beb0efe3d4f115dff16be509301819563f8cf52 languageName: node linkType: hard @@ -6525,15 +6595,15 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-augment@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/types-augment@npm:11.3.1" +"@polkadot/types-augment@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/types-augment@npm:12.2.3" dependencies: - "@polkadot/types": 11.3.1 - "@polkadot/types-codec": 11.3.1 - "@polkadot/util": ^12.6.2 + "@polkadot/types": 12.2.3 + "@polkadot/types-codec": 12.2.3 + "@polkadot/util": ^13.0.2 tslib: ^2.6.2 - checksum: f8b69e2d605078741be625919bc1f4a4bf22cc6d5f5e448abd199bc8d7dc95973dbbc38b32a0afb9bb576f2d40745b86cdd93aa003aa4a9318bfffa9c5dd0b49 + checksum: f5e47c7764f655f7275162ccd080426ab0c23572fa8905134a792ed5917b302c1c71180d3a8051a61825698f4f00b072b5d6e7e4f9daed3414a3b2c223e7e7ee languageName: node linkType: hard @@ -6548,14 +6618,14 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-codec@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/types-codec@npm:11.3.1" +"@polkadot/types-codec@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/types-codec@npm:12.2.3" dependencies: - "@polkadot/util": ^12.6.2 - "@polkadot/x-bigint": ^12.6.2 + "@polkadot/util": ^13.0.2 + "@polkadot/x-bigint": ^13.0.2 tslib: ^2.6.2 - checksum: 890deea0187dadaed6fadf16266a710d0c2f92f4b7b1a6e50641e21ade9dfdf3693b6aeb61faa2a04a50daf7431f1a6bb6d8564d7f68b936a666fb5d97e12150 + checksum: 6f1cd31a6356cfe6f3210060dd7078030236c8dc2dac44e80110e614e6076087b9b7204664de2ba9e23e1cb7249b1bba3bb022df28c7a61d855ebb9a0aa70bf1 languageName: node linkType: hard @@ -6570,14 +6640,14 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-create@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/types-create@npm:11.3.1" +"@polkadot/types-create@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/types-create@npm:12.2.3" dependencies: - "@polkadot/types-codec": 11.3.1 - "@polkadot/util": ^12.6.2 + "@polkadot/types-codec": 12.2.3 + "@polkadot/util": ^13.0.2 tslib: ^2.6.2 - checksum: 5bd73559990d59a1c1e7625d5ecc2b6a0821d105804138aba126d01bbc3aa66ebe3ce0c89ab9a6965c17bbd8e1a7987630e9eb6ec16dd4774b161a6152d3dcaf + checksum: 5397bf6f850552155e3381ea81b211e564fbf7c2271805e7bded6b1d7ad54409dcd1fd1354bf7be10bbc96f02576d8199ed7f6110b02935cdea7eb369d1cbaeb languageName: node linkType: hard @@ -6595,27 +6665,27 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-known@npm:11.3.1, @polkadot/types-known@npm:^11.3.1": - version: 11.3.1 - resolution: "@polkadot/types-known@npm:11.3.1" +"@polkadot/types-known@npm:12.2.3, @polkadot/types-known@npm:^12.2.3": + version: 12.2.3 + resolution: "@polkadot/types-known@npm:12.2.3" dependencies: - "@polkadot/networks": ^12.6.2 - "@polkadot/types": 11.3.1 - "@polkadot/types-codec": 11.3.1 - "@polkadot/types-create": 11.3.1 - "@polkadot/util": ^12.6.2 + "@polkadot/networks": ^13.0.2 + "@polkadot/types": 12.2.3 + "@polkadot/types-codec": 12.2.3 + "@polkadot/types-create": 12.2.3 + "@polkadot/util": ^13.0.2 tslib: ^2.6.2 - checksum: c0ebaa6a17daaf48871372a7d3126782c451d23c7f0f082075a1b0499d28a5bbaa29e2f36f508e9fc0e25eafd5d9f0322d0990049ef86ad579c8167bf49a8293 + checksum: e2499edb751d8e38925512ff0e1396c5fe456e42d71fbdf090af8fe8dc14ac381fd747cd0b6a8c2492f90f2e6d48a0fc26a1da2cc7c8166648782f09916fc956 languageName: node linkType: hard -"@polkadot/types-support@npm:11.3.1": - version: 11.3.1 - resolution: "@polkadot/types-support@npm:11.3.1" +"@polkadot/types-support@npm:12.2.3": + version: 12.2.3 + resolution: "@polkadot/types-support@npm:12.2.3" dependencies: - "@polkadot/util": ^12.6.2 + "@polkadot/util": ^13.0.2 tslib: ^2.6.2 - checksum: 09b66a2da40f654348dbf4784b117c25e6a6efc14cdf4ed254d8a1d5129359a3109bcdc604dff220d4c265e0810b2145bd8dfdb82f5f298a60febfd7e641289c + checksum: dc681525f49129b8a2201f81e64032ac01ec84add507beb2e44dc8046246657645e6e7ed92012a03dfc08ea1167d5c4704c650396e0614ed2bc694054fc0a1d0 languageName: node linkType: hard @@ -6635,32 +6705,32 @@ __metadata: languageName: node linkType: hard -"@polkadot/types@npm:11.3.1, @polkadot/types@npm:^11.3.1": - version: 11.3.1 - resolution: "@polkadot/types@npm:11.3.1" +"@polkadot/types@npm:12.2.3, @polkadot/types@npm:^12.2.1, @polkadot/types@npm:^12.2.3": + version: 12.2.3 + resolution: "@polkadot/types@npm:12.2.3" dependencies: - "@polkadot/keyring": ^12.6.2 - "@polkadot/types-augment": 11.3.1 - "@polkadot/types-codec": 11.3.1 - "@polkadot/types-create": 11.3.1 - "@polkadot/util": ^12.6.2 - "@polkadot/util-crypto": ^12.6.2 + "@polkadot/keyring": ^13.0.2 + "@polkadot/types-augment": 12.2.3 + "@polkadot/types-codec": 12.2.3 + "@polkadot/types-create": 12.2.3 + "@polkadot/util": ^13.0.2 + "@polkadot/util-crypto": ^13.0.2 rxjs: ^7.8.1 tslib: ^2.6.2 - checksum: f0137ff49e972dc4fa0bbc4bab3853024544a1985081f6a5034405882b7fb482f3a27dc2aabaed8526bc7f970bd0fbe92eeac4896c5bf83f4e5b8cdf482aaeb8 + checksum: 00b61ecb7a5d9c1ef1da568682c0fe65f28a5a16735944b0f7659943cf9dc15e6941824bd8e32920780ea507b5bf34472d393210cbf24dfe89c3fe84d1a5985d languageName: node linkType: hard -"@polkadot/ui-shared@npm:^3.6.6": - version: 3.6.6 - resolution: "@polkadot/ui-shared@npm:3.6.6" +"@polkadot/ui-shared@npm:^3.8.2": + version: 3.8.2 + resolution: "@polkadot/ui-shared@npm:3.8.2" dependencies: colord: ^2.9.3 tslib: ^2.6.2 peerDependencies: "@polkadot/util": "*" "@polkadot/util-crypto": "*" - checksum: 420d6c8d21481b7fb9c9eb69f9452e4138b6541186fc758eeacad4524f377b1312c2f997dfa81ec349562bf371729ce7740772dbebd4e2b6a823bad5e9b56a58 + checksum: bff0cc981583a805c7f27d4af9c0ae81d6f29c5130296b44297d03e3a4f62cc47f3e76e118b9fe1c6716dc5099400019da8ea8b7f2ef65faddce11f7c62fe9e4 languageName: node linkType: hard @@ -6684,7 +6754,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/util-crypto@npm:12.6.2, @polkadot/util-crypto@npm:^12.3.1, @polkadot/util-crypto@npm:^12.6.2": +"@polkadot/util-crypto@npm:12.6.2, @polkadot/util-crypto@npm:^12.3.1": version: 12.6.2 resolution: "@polkadot/util-crypto@npm:12.6.2" dependencies: @@ -6704,6 +6774,26 @@ __metadata: languageName: node linkType: hard +"@polkadot/util-crypto@npm:13.0.2, @polkadot/util-crypto@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/util-crypto@npm:13.0.2" + dependencies: + "@noble/curves": ^1.3.0 + "@noble/hashes": ^1.3.3 + "@polkadot/networks": 13.0.2 + "@polkadot/util": 13.0.2 + "@polkadot/wasm-crypto": ^7.3.2 + "@polkadot/wasm-util": ^7.3.2 + "@polkadot/x-bigint": 13.0.2 + "@polkadot/x-randomvalues": 13.0.2 + "@scure/base": ^1.1.5 + tslib: ^2.6.2 + peerDependencies: + "@polkadot/util": 13.0.2 + checksum: 025bb2179d77b73dd8af775192627fe31e985e365fbecf38d7903a663aa11b703fa3f23fbb65e53d0a9710cc087e0cb9a113b0a660d8e9b36de21c36c1bc40d7 + languageName: node + linkType: hard + "@polkadot/util@npm:12.5.1": version: 12.5.1 resolution: "@polkadot/util@npm:12.5.1" @@ -6719,7 +6809,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/util@npm:12.6.2, @polkadot/util@npm:^12.3.1, @polkadot/util@npm:^12.6.2": +"@polkadot/util@npm:12.6.2, @polkadot/util@npm:^12.3.1": version: 12.6.2 resolution: "@polkadot/util@npm:12.6.2" dependencies: @@ -6734,6 +6824,21 @@ __metadata: languageName: node linkType: hard +"@polkadot/util@npm:13.0.2, @polkadot/util@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/util@npm:13.0.2" + dependencies: + "@polkadot/x-bigint": 13.0.2 + "@polkadot/x-global": 13.0.2 + "@polkadot/x-textdecoder": 13.0.2 + "@polkadot/x-textencoder": 13.0.2 + "@types/bn.js": ^5.1.5 + bn.js: ^5.2.1 + tslib: ^2.6.2 + checksum: c7d71898395d2e9fb994ed53be10e9b44e9cb6f6bd502ce31a48848dda032a9e3f462a6039759798023425c6e17d5a7515784f0a8c0ab74c1a0a2691b0ef3660 + languageName: node + linkType: hard + "@polkadot/wasm-bridge@npm:7.3.2": version: 7.3.2 resolution: "@polkadot/wasm-bridge@npm:7.3.2" @@ -6824,7 +6929,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/x-bigint@npm:12.6.2, @polkadot/x-bigint@npm:^12.3.1, @polkadot/x-bigint@npm:^12.6.2": +"@polkadot/x-bigint@npm:12.6.2, @polkadot/x-bigint@npm:^12.3.1": version: 12.6.2 resolution: "@polkadot/x-bigint@npm:12.6.2" dependencies: @@ -6834,14 +6939,24 @@ __metadata: languageName: node linkType: hard -"@polkadot/x-fetch@npm:^12.6.2": - version: 12.6.2 - resolution: "@polkadot/x-fetch@npm:12.6.2" +"@polkadot/x-bigint@npm:13.0.2, @polkadot/x-bigint@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/x-bigint@npm:13.0.2" dependencies: - "@polkadot/x-global": 12.6.2 + "@polkadot/x-global": 13.0.2 + tslib: ^2.6.2 + checksum: a1c9d9ab3aa27f7a68a879c76cea38ca4757ae4802c6d2a7402dbfbf31468c4dd3c4f1e852e62c0a1bff18889fccac1ccbc38649bf96e9473948ea7d7c2899f3 + languageName: node + linkType: hard + +"@polkadot/x-fetch@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/x-fetch@npm:13.0.2" + dependencies: + "@polkadot/x-global": 13.0.2 node-fetch: ^3.3.2 tslib: ^2.6.2 - checksum: 2f0269b17ebbb907f4f4fa777898fd8ea16ecd37abfc2c0b69cfc49bd5ab0ed38cf836a4941e85f9100192f7005731a9a8c6b135799efd17b4261c3cc1ebf844 + checksum: 459948a2b95601b0a39a7eb55277e80bd33e2df1ecab133dbe9823e020d3d5f2a64056911fc2072d0c328550c510e7e0ec45327b354530ae83306d536c616e29 languageName: node linkType: hard @@ -6854,7 +6969,7 @@ __metadata: languageName: node linkType: hard -"@polkadot/x-global@npm:12.6.2, @polkadot/x-global@npm:^12.6.2": +"@polkadot/x-global@npm:12.6.2": version: 12.6.2 resolution: "@polkadot/x-global@npm:12.6.2" dependencies: @@ -6863,6 +6978,15 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-global@npm:13.0.2, @polkadot/x-global@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/x-global@npm:13.0.2" + dependencies: + tslib: ^2.6.2 + checksum: b487bf2a15d77681efae5e928364526102cff48207a871662515c500404ae58d9d08df813fd675c8bf0a2744dbf4648db6a0fe927993e597e8391349295560c8 + languageName: node + linkType: hard + "@polkadot/x-randomvalues@npm:12.5.1": version: 12.5.1 resolution: "@polkadot/x-randomvalues@npm:12.5.1" @@ -6889,6 +7013,19 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-randomvalues@npm:13.0.2": + version: 13.0.2 + resolution: "@polkadot/x-randomvalues@npm:13.0.2" + dependencies: + "@polkadot/x-global": 13.0.2 + tslib: ^2.6.2 + peerDependencies: + "@polkadot/util": 13.0.2 + "@polkadot/wasm-util": "*" + checksum: 3968ca273ccdc3055466a8bdeae64141ef20dd5451f7fc750eaef28465460e41d28cdd4eadedf3b4ca94024c9ebae023a8a04eb946b9fd17a1ff9c105ebfe39c + languageName: node + linkType: hard + "@polkadot/x-textdecoder@npm:12.5.1": version: 12.5.1 resolution: "@polkadot/x-textdecoder@npm:12.5.1" @@ -6909,6 +7046,16 @@ __metadata: languageName: node linkType: hard +"@polkadot/x-textdecoder@npm:13.0.2": + version: 13.0.2 + resolution: "@polkadot/x-textdecoder@npm:13.0.2" + dependencies: + "@polkadot/x-global": 13.0.2 + tslib: ^2.6.2 + checksum: 586c970c66a014471b5354d41a55aa6dbeaa4aec041153d294205d7f86f93cfb6cb5c274b6ef38b0923b515b531bc8608fea7cdc6116c6dc61c370d892b207e4 + languageName: node + linkType: hard + "@polkadot/x-textencoder@npm:12.5.1": version: 12.5.1 resolution: "@polkadot/x-textencoder@npm:12.5.1" @@ -6929,14 +7076,24 @@ __metadata: languageName: node linkType: hard -"@polkadot/x-ws@npm:^12.6.2": - version: 12.6.2 - resolution: "@polkadot/x-ws@npm:12.6.2" +"@polkadot/x-textencoder@npm:13.0.2": + version: 13.0.2 + resolution: "@polkadot/x-textencoder@npm:13.0.2" dependencies: - "@polkadot/x-global": 12.6.2 + "@polkadot/x-global": 13.0.2 + tslib: ^2.6.2 + checksum: b2db5ab0fd94b8a13816f028f9fb52e0f00c43df4a727c01911902b5fc11bec476b02b92aee5a98adabf4696907e828752c6e0eb9bece79f0440675e4eb030c9 + languageName: node + linkType: hard + +"@polkadot/x-ws@npm:^13.0.2": + version: 13.0.2 + resolution: "@polkadot/x-ws@npm:13.0.2" + dependencies: + "@polkadot/x-global": 13.0.2 tslib: ^2.6.2 - ws: ^8.15.1 - checksum: a6bddc7ac81690f222fbc192f87f2d9b951d67414ea31a0377fb20844db8fde05d7771df5291633417aa4616bf968a31005ff22d416b2d4fecda2109f820abf7 + ws: ^8.16.0 + checksum: c5aad76a3e121016dd740eddaf5601b2d98b7e568da51b6a0ffe4bced6dfb7373a15067d0c5c267e6daed40ea55014ef4b875c5eaf395c8b3fcd9e85047d2dd9 languageName: node linkType: hard @@ -7117,205 +7274,114 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.12.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm-eabi@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.18.0" +"@rollup/rollup-android-arm-eabi@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.19.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-android-arm64@npm:4.12.0" +"@rollup/rollup-android-arm64@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-android-arm64@npm:4.19.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-android-arm64@npm:4.18.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.12.0" +"@rollup/rollup-darwin-arm64@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.19.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.18.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.12.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.18.0" +"@rollup/rollup-darwin-x64@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.19.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.12.0" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.18.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.19.1" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.18.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.19.1" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.12.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.18.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.19.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.12.0" +"@rollup/rollup-linux-arm64-musl@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.19.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.18.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.18.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.19.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.12.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.19.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.18.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.18.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.19.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.12.0" +"@rollup/rollup-linux-x64-gnu@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.19.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.18.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.12.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.18.0" +"@rollup/rollup-linux-x64-musl@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.19.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.12.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.18.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.19.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.12.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.18.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.19.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.12.0": - version: 4.12.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.12.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.18.0": - version: 4.18.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.18.0" +"@rollup/rollup-win32-x64-msvc@npm:4.19.1": + version: 4.19.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.19.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -8000,92 +8066,99 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-darwin-arm64@npm:1.6.3" +"@substrate/ss58-registry@npm:^1.46.0": + version: 1.49.0 + resolution: "@substrate/ss58-registry@npm:1.49.0" + checksum: 917437915d5ba98c46c650dce2fbe1f6a7bbcf2a6fa058df2a751743c774db37d6b5dacab4c2ce8bdf9d52275b2d325fcc63f6f08d37e5428fa133ff72e19c56 + languageName: node + linkType: hard + +"@swc/core-darwin-arm64@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-darwin-arm64@npm:1.7.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-darwin-x64@npm:1.6.3" +"@swc/core-darwin-x64@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-darwin-x64@npm:1.7.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.6.3" +"@swc/core-linux-arm-gnueabihf@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.3" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-linux-arm64-gnu@npm:1.6.3" +"@swc/core-linux-arm64-gnu@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-linux-arm64-musl@npm:1.6.3" +"@swc/core-linux-arm64-musl@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-linux-x64-gnu@npm:1.6.3" +"@swc/core-linux-x64-gnu@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-linux-x64-musl@npm:1.6.3" +"@swc/core-linux-x64-musl@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-linux-x64-musl@npm:1.7.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-win32-arm64-msvc@npm:1.6.3" +"@swc/core-win32-arm64-msvc@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-win32-ia32-msvc@npm:1.6.3" +"@swc/core-win32-ia32-msvc@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.6.3": - version: 1.6.3 - resolution: "@swc/core-win32-x64-msvc@npm:1.6.3" +"@swc/core-win32-x64-msvc@npm:1.7.3": + version: 1.7.3 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.6.3": - version: 1.6.3 - resolution: "@swc/core@npm:1.6.3" - dependencies: - "@swc/core-darwin-arm64": 1.6.3 - "@swc/core-darwin-x64": 1.6.3 - "@swc/core-linux-arm-gnueabihf": 1.6.3 - "@swc/core-linux-arm64-gnu": 1.6.3 - "@swc/core-linux-arm64-musl": 1.6.3 - "@swc/core-linux-x64-gnu": 1.6.3 - "@swc/core-linux-x64-musl": 1.6.3 - "@swc/core-win32-arm64-msvc": 1.6.3 - "@swc/core-win32-ia32-msvc": 1.6.3 - "@swc/core-win32-x64-msvc": 1.6.3 +"@swc/core@npm:^1.7.3": + version: 1.7.3 + resolution: "@swc/core@npm:1.7.3" + dependencies: + "@swc/core-darwin-arm64": 1.7.3 + "@swc/core-darwin-x64": 1.7.3 + "@swc/core-linux-arm-gnueabihf": 1.7.3 + "@swc/core-linux-arm64-gnu": 1.7.3 + "@swc/core-linux-arm64-musl": 1.7.3 + "@swc/core-linux-x64-gnu": 1.7.3 + "@swc/core-linux-x64-musl": 1.7.3 + "@swc/core-win32-arm64-msvc": 1.7.3 + "@swc/core-win32-ia32-msvc": 1.7.3 + "@swc/core-win32-x64-msvc": 1.7.3 "@swc/counter": ^0.1.3 - "@swc/types": ^0.1.8 + "@swc/types": ^0.1.12 peerDependencies: "@swc/helpers": "*" dependenciesMeta: @@ -8112,7 +8185,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: c632e545ea494480b8273d0adc0cac5986576a3e9eda95c550c06e402f924d9948fe71bff14809455da7ff86f043a7444a71bff2e0ff05fad76689f69067057e + checksum: af7850035057ea1f7412cf7bf7b27d13e0d55e79a5c6e37319cbdca6a962134718d8a8355cfd4926b4fc8d25d67afca567ca63bb3f8d2c8cab869b37bb7cd0ed languageName: node linkType: hard @@ -8132,12 +8205,12 @@ __metadata: languageName: node linkType: hard -"@swc/types@npm:^0.1.8": - version: 0.1.8 - resolution: "@swc/types@npm:0.1.8" +"@swc/types@npm:^0.1.12": + version: 0.1.12 + resolution: "@swc/types@npm:0.1.12" dependencies: "@swc/counter": ^0.1.3 - checksum: e564d0e37b0e28546973c6d50c7a179395912a97168d695cfe9cf1051199c8b828680cdafcb8d43948f76d3703873bafb88dfb5bc2dfe0596b4ad18fcaf90c80 + checksum: cf7f89e46f859864075d7965582baea9c5f98830f45b1046251568c9bdf1ca484b1bf37f6d3c32b7c82ecf8cd5df89d22f05268c391819c44e49911bb1a8e71a languageName: node linkType: hard @@ -8260,136 +8333,134 @@ __metadata: languageName: node linkType: hard -"@trezor/analytics@npm:1.0.17": - version: 1.0.17 - resolution: "@trezor/analytics@npm:1.0.17" +"@trezor/analytics@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/analytics@npm:1.1.0" dependencies: - "@trezor/env-utils": 1.0.17 - "@trezor/utils": 9.0.24 + "@trezor/env-utils": 1.1.0 + "@trezor/utils": 9.1.0 peerDependencies: tslib: ^2.6.2 - checksum: eccabc26d736ec59a6d24f587a715648fbcec155c716467ccff21715a6879b6ee0c625c260280877fc4b7cbe1b62568fc684b563f890848604c223772082130d + checksum: 6a5b426c12b7ba7bfbbb955ac003733ca0b36a33f52d49c13a37ab341ae6f9c38a5aa0696f60dd31da650b01326a93d27d06ef830190a608159cc833451a413b languageName: node linkType: hard -"@trezor/blockchain-link-types@npm:1.0.17": - version: 1.0.17 - resolution: "@trezor/blockchain-link-types@npm:1.0.17" +"@trezor/blockchain-link-types@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/blockchain-link-types@npm:1.1.0" dependencies: "@solana/web3.js": ^1.91.6 - "@trezor/type-utils": 1.0.5 - "@trezor/utxo-lib": 2.0.10 + "@trezor/type-utils": 1.1.0 + "@trezor/utxo-lib": 2.1.0 socks-proxy-agent: 6.1.1 peerDependencies: tslib: ^2.6.2 - checksum: abccef885b76508120608531a3ef5ab2349a190eb021c79cbeaef1b53f92c81ecb344b2cb374d8bea1f13660b961205ac34cf57054211a9283c69a394721dd7a + checksum: 1834c7841189a560f3ddba1863b5501ed7249ce1f138879d493f6c6b9f0e2d1d60cf8a44e4fdd986e8324fbf6e7940c823e692ba646b235e06c4af90967142a4 languageName: node linkType: hard -"@trezor/blockchain-link-utils@npm:1.0.18": - version: 1.0.18 - resolution: "@trezor/blockchain-link-utils@npm:1.0.18" +"@trezor/blockchain-link-utils@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/blockchain-link-utils@npm:1.1.0" dependencies: "@mobily/ts-belt": ^3.13.1 "@solana/web3.js": ^1.91.6 - "@trezor/env-utils": 1.0.17 - "@trezor/utils": 9.0.24 + "@trezor/env-utils": 1.1.0 + "@trezor/utils": 9.1.0 peerDependencies: tslib: ^2.6.2 - checksum: 3f9ad44e9f840680f5f8421ef998b86cfcebb0bbaee48204fff4ca496902479445f0ec45bd17a1bcd99668b7fe510754ae5758287dd73bb8b907ebd2f5b62da5 + checksum: 314ff6ccd4eccc91324410b3f46967effef766d45fcd7165026a909059519ecb04d5e3df470ec8c62b0ad345d3be6c727b9e98b92d3f4e12c81d3a283dd005b2 languageName: node linkType: hard -"@trezor/blockchain-link@npm:2.1.30": - version: 2.1.30 - resolution: "@trezor/blockchain-link@npm:2.1.30" +"@trezor/blockchain-link@npm:2.2.0": + version: 2.2.0 + resolution: "@trezor/blockchain-link@npm:2.2.0" dependencies: "@solana/buffer-layout": ^4.0.1 "@solana/web3.js": ^1.90.2 - "@trezor/blockchain-link-types": 1.0.17 - "@trezor/blockchain-link-utils": 1.0.18 - "@trezor/utils": 9.0.24 - "@trezor/utxo-lib": 2.0.10 + "@trezor/blockchain-link-types": 1.1.0 + "@trezor/blockchain-link-utils": 1.1.0 + "@trezor/utils": 9.1.0 + "@trezor/utxo-lib": 2.1.0 "@types/web": ^0.0.138 events: ^3.3.0 ripple-lib: ^1.10.1 socks-proxy-agent: 6.1.1 - ws: ^8.16.0 + ws: ^8.17.1 peerDependencies: tslib: ^2.6.2 - checksum: d10bfedf0530aa054bc24cb2916d719bc30a6017dc71f63ad3b02f3082165e190d6e30d42af0c9e2cd3f6bd959971c311b97827003cfa37d50002a5f09d20239 + checksum: 6aa09f60d2ca8c9688505f68955a29df574cec869d1ffd5f332ddf1e5dcb4fa45be4e22e2ce1269b7b2dff8214202767ce7b1d9af6d8672013f6dc29506b5bf8 languageName: node linkType: hard -"@trezor/connect-analytics@npm:1.0.15": - version: 1.0.15 - resolution: "@trezor/connect-analytics@npm:1.0.15" +"@trezor/connect-analytics@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/connect-analytics@npm:1.1.0" dependencies: - "@trezor/analytics": 1.0.17 + "@trezor/analytics": 1.1.0 peerDependencies: tslib: ^2.6.2 - checksum: 302de8ca7178bf14775a5a3055ae7d572191f91f2c43aef7dbc869529a48f248592debbeb9bf7d78a3eaa508d7324c196917f3eba08efc0ebf9c9a956daef4dd + checksum: e6beecb036be00d3c62af7f4f4ff96a6756df698ac19807a1b4be3fb0bd50a702780ee9a47e7e64ffebfab353ee532b07d0b5e7efdb3b611f88b9d8f9bb40157 languageName: node linkType: hard -"@trezor/connect-common@npm:0.0.33": - version: 0.0.33 - resolution: "@trezor/connect-common@npm:0.0.33" +"@trezor/connect-common@npm:0.1.0": + version: 0.1.0 + resolution: "@trezor/connect-common@npm:0.1.0" dependencies: - "@trezor/env-utils": 1.0.17 - "@trezor/utils": 9.0.24 + "@trezor/env-utils": 1.1.0 + "@trezor/utils": 9.1.0 peerDependencies: tslib: ^2.6.2 - checksum: 7084e9527da7d9dbf0d05b41258911fad088617249c56b398606ae92d29b195117e99c29ce45842b27153fd82ed7c70bcc9a3885f7eafa91fd574f284c8fc07a + checksum: 4ad56ad4b0d7ccca01ecb89093b23bb013f58d709a23b74a50e982282a2fe0d014b3400ef569d3cde5407c6d16933b6987b43b81b72380d3b340ea317956f1ed languageName: node linkType: hard -"@trezor/connect-web@npm:^9.2.4": - version: 9.2.4 - resolution: "@trezor/connect-web@npm:9.2.4" +"@trezor/connect-web@npm:^9.3.0": + version: 9.3.0 + resolution: "@trezor/connect-web@npm:9.3.0" dependencies: - "@trezor/connect": 9.2.4 - "@trezor/connect-common": 0.0.33 - "@trezor/utils": 9.0.24 - events: ^3.3.0 + "@trezor/connect": 9.3.0 + "@trezor/connect-common": 0.1.0 + "@trezor/utils": 9.1.0 peerDependencies: tslib: ^2.6.2 - checksum: 0234cae2d77d91410aabee57cfba384d727552d00157adcc5ef465db5e87da6b8364ac915c7bc4c643f5067698855803a23d01c74ceb2d726a7724d44c84b204 + checksum: e887f9eb9429f9da899a79ef4fb37b1505f8da506e7c7ad86a89e27c981fb61eafdb55b950c3cbe09f06828361019fa8bcd95fdbcf0328a20c3de8e86198902c languageName: node linkType: hard -"@trezor/connect@npm:9.2.4": - version: 9.2.4 - resolution: "@trezor/connect@npm:9.2.4" +"@trezor/connect@npm:9.3.0": + version: 9.3.0 + resolution: "@trezor/connect@npm:9.3.0" dependencies: "@babel/preset-typescript": ^7.23.3 "@ethereumjs/common": ^4.2.0 "@ethereumjs/tx": ^5.2.1 "@fivebinaries/coin-selection": 2.2.1 - "@trezor/blockchain-link": 2.1.30 - "@trezor/blockchain-link-types": 1.0.17 - "@trezor/connect-analytics": 1.0.15 - "@trezor/connect-common": 0.0.33 - "@trezor/protobuf": 1.0.13 - "@trezor/protocol": 1.0.9 - "@trezor/schema-utils": 1.0.4 - "@trezor/transport": 1.1.29 - "@trezor/utils": 9.0.24 - "@trezor/utxo-lib": 2.0.10 + "@trezor/blockchain-link": 2.2.0 + "@trezor/blockchain-link-types": 1.1.0 + "@trezor/connect-analytics": 1.1.0 + "@trezor/connect-common": 0.1.0 + "@trezor/protobuf": 1.1.0 + "@trezor/protocol": 1.1.0 + "@trezor/schema-utils": 1.1.0 + "@trezor/transport": 1.2.0 + "@trezor/utils": 9.1.0 + "@trezor/utxo-lib": 2.1.0 blakejs: ^1.2.1 bs58: ^5.0.0 bs58check: ^3.0.1 cross-fetch: ^4.0.0 - events: ^3.3.0 peerDependencies: tslib: ^2.6.2 - checksum: b934bfadccf88ec409132b42315864c978c08d8753cf159fb1ec568dfbed2071a0ba4317f3742af5b29ddca915d50b99a68d7d72458abcdd0d3daa55ded00c20 + checksum: 957a9fd376ff323be894a85d6d481a66d909d7222bf12f6d8bf6014f9aff116b318f22ec94c720759c9d4f277a515699158097ec26f38b6b9e640f4c5b0311ca languageName: node linkType: hard -"@trezor/env-utils@npm:1.0.17": - version: 1.0.17 - resolution: "@trezor/env-utils@npm:1.0.17" +"@trezor/env-utils@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/env-utils@npm:1.1.0" dependencies: ua-parser-js: ^1.0.37 peerDependencies: @@ -8404,51 +8475,50 @@ __metadata: optional: true react-native: optional: true - checksum: 933ec2bfa45c6803cf974993d902605e5d5f4fceb2b562913bab8dedab15e8d4221628ba7b960980872d30f6038ba51295e203528b47021408169f6af6f9d200 + checksum: 1b09c9ebc6070396528d5f1f9f44085b0465356cfcb936a7d69cff0b26ee024d90f0bf4e531cc927a5744651d70d3fddbd4d8e5aa771a9b62b86c29d08d2682d languageName: node linkType: hard -"@trezor/protobuf@npm:1.0.13": - version: 1.0.13 - resolution: "@trezor/protobuf@npm:1.0.13" +"@trezor/protobuf@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/protobuf@npm:1.1.0" dependencies: - "@trezor/schema-utils": 1.0.4 - long: ^4.0.0 + "@trezor/schema-utils": 1.1.0 protobufjs: 7.2.6 peerDependencies: tslib: ^2.6.2 - checksum: f30f3416de24ece9b4ed35808a58c3a32ec3feaf1d9f0f1f71a00332324435d0eb49e8fa9721b19354e5677ae89a817840ff8bb58f723bb178569d51eeba88b2 + checksum: 14ba5c3ead6b0ad277742cc26e16a5048ee956f25a88919c04c153eb802d11c3d00b31e54e0d7b72e23e2f442f4fd6c589694430adb3348d10ca7b6e4acb5ec3 languageName: node linkType: hard -"@trezor/protocol@npm:1.0.9": - version: 1.0.9 - resolution: "@trezor/protocol@npm:1.0.9" +"@trezor/protocol@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/protocol@npm:1.1.0" peerDependencies: tslib: ^2.6.2 - checksum: 87b499a4c9f62eb8dc87183e9db0f0ca8ea64a8a5e2a9d4f66900b7b008c90b8fcecc8b28769506347f9b13e70d1ab6af92a184dcb3d8114d4d10e8161fefa09 + checksum: 860601a91621561d8e8b5c4004d3d6f6ef5ab34a2c793ce9554ff0989d4a8f57465f5f1d93a8c3f828366449254d8357efa661770d2ed135d70a88de6b7d36c8 languageName: node linkType: hard -"@trezor/schema-utils@npm:1.0.4": - version: 1.0.4 - resolution: "@trezor/schema-utils@npm:1.0.4" +"@trezor/schema-utils@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/schema-utils@npm:1.1.0" dependencies: "@sinclair/typebox": ^0.31.28 ts-mixer: ^6.0.3 peerDependencies: tslib: ^2.6.2 - checksum: e15ecda7d90b6ef9ef518f76340993bc87bf38ab04937b54a35f53a4cfedc8950ef92ffd43b4cdaaafa7f2dd2ef91a8fd702b94bcdccb44f0b57dc9ff4a903c0 + checksum: c84ce18f4dd0cb22daec8fc469a4c0622af279829602993573ade6a14346491f11e73c9f6fa37c68a7249380790e599084fa5c4ddd16c9d08a987da1f808db51 languageName: node linkType: hard -"@trezor/transport@npm:1.1.29": - version: 1.1.29 - resolution: "@trezor/transport@npm:1.1.29" +"@trezor/transport@npm:1.2.0": + version: 1.2.0 + resolution: "@trezor/transport@npm:1.2.0" dependencies: - "@trezor/protobuf": 1.0.13 - "@trezor/protocol": 1.0.9 - "@trezor/utils": 9.0.24 + "@trezor/protobuf": 1.1.0 + "@trezor/protocol": 1.1.0 + "@trezor/utils": 9.1.0 cross-fetch: ^4.0.0 json-stable-stringify: ^1.1.1 long: ^4.0.0 @@ -8456,33 +8526,33 @@ __metadata: usb: ^2.11.0 peerDependencies: tslib: ^2.6.2 - checksum: d3b1afd1f4568c5c59dd806b6d5bb00068d8ec1b0a2853911bbefa20bcb2473fcd5c4b6a796e777ef3a26ddf6c06d7cfc071029307a821500a7096d95fef766b + checksum: f60aa061df51a4566b922bb86cef541af939b538aec7ab25b1a7590d685a33f7180c9162611f56db4254b15f0f0d1403fb18e7f79ad9db6c10449ed1fe466d56 languageName: node linkType: hard -"@trezor/type-utils@npm:1.0.5": - version: 1.0.5 - resolution: "@trezor/type-utils@npm:1.0.5" - checksum: c934a566d2067d3da9d2dca47a1e974fde2396e1d5a745f4765ce29d271a7701120f367355e9fa41b7c0a9e14883c32f2ed1bcb1d71c31a85583799949de2927 +"@trezor/type-utils@npm:1.1.0": + version: 1.1.0 + resolution: "@trezor/type-utils@npm:1.1.0" + checksum: 382bac3c2a382d42fc5da3edfa0d8a955ca25a5adb165594af4ecaf2ff3a2090108ad53ee2ad75673dd9ebabd5bfcfe036564576a3c62926a44d99ba102d0583 languageName: node linkType: hard -"@trezor/utils@npm:9.0.24": - version: 9.0.24 - resolution: "@trezor/utils@npm:9.0.24" +"@trezor/utils@npm:9.1.0": + version: 9.1.0 + resolution: "@trezor/utils@npm:9.1.0" dependencies: bignumber.js: ^9.1.2 peerDependencies: tslib: ^2.6.2 - checksum: 5e8c5b83e65a4fceb7db496388e37a7352ba83bcfeb8de0adf150f423561097cdae1d835b45ba72a891c86ed9e4e496f7dd44848ef364eb98106daff407065e9 + checksum: 59590dcbb7c062991cbe0075a1b5e3b683929f2251ade96f90da12b2a01accbe14a12ef8d52e028934c97466aaeeb971b82669f0ecc69c52c42eb25f68ba92b3 languageName: node linkType: hard -"@trezor/utxo-lib@npm:2.0.10": - version: 2.0.10 - resolution: "@trezor/utxo-lib@npm:2.0.10" +"@trezor/utxo-lib@npm:2.1.0": + version: 2.1.0 + resolution: "@trezor/utxo-lib@npm:2.1.0" dependencies: - "@trezor/utils": 9.0.24 + "@trezor/utils": 9.1.0 bchaddrjs: ^0.5.2 bech32: ^2.0.0 bip66: ^1.1.5 @@ -8492,7 +8562,6 @@ __metadata: bn.js: ^5.2.1 bs58: ^5.0.0 bs58check: ^3.0.1 - create-hash: ^1.2.0 create-hmac: ^1.1.7 int64-buffer: ^1.0.1 pushdata-bitcoin: ^1.0.1 @@ -8502,7 +8571,7 @@ __metadata: wif: ^4.0.0 peerDependencies: tslib: ^2.6.2 - checksum: 2fe6feca33f674da68c69cb9e555f8d995c07efc72dbfabca16419db2086977fc697d8a90f291f6873abee452c9a07983d9a73a4b65faf50563d7f82059ab48c + checksum: b6626cba8316ed46b641bc973e575b3b32caaeb5791ea1ef684c5562227dc698a70ee67d4dc681a8f8b57c09dd3771c66bece2fb8c8a2f4484043bb9c5358bb2 languageName: node linkType: hard @@ -8738,13 +8807,13 @@ __metadata: languageName: node linkType: hard -"@types/chrome@npm:^0.0.268": - version: 0.0.268 - resolution: "@types/chrome@npm:0.0.268" +"@types/chrome@npm:^0.0.269": + version: 0.0.269 + resolution: "@types/chrome@npm:0.0.269" dependencies: "@types/filesystem": "*" "@types/har-format": "*" - checksum: c7ae2479b225beea673681df0a6022f251e98bdf1c162c84363d52efb32edf5d26cf8007d6ed92d497837212a1c2cfa6ad9c3c1c0d0169e0a5189fa084555ee4 + checksum: bd48365b9e5f022855e6c3f1febcad2e20250adc0a718b6029380638b848acdc5bcc01161a13b48f9232ff2f620eb23101c284bdc89b1d01f0a52e7d24443e2b languageName: node linkType: hard @@ -9020,10 +9089,10 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.17.5": - version: 4.17.5 - resolution: "@types/lodash@npm:4.17.5" - checksum: 3c9bb15772509f0ecb40428531863dbc3f064f2bf34bbccc2ce2b2923c69fb0868aec7e357b1d97fd0d7f7e435a014ea5c1adef8a64715529887179c97a5a823 +"@types/lodash@npm:^4.17.7": + version: 4.17.7 + resolution: "@types/lodash@npm:4.17.7" + checksum: 09e58a119cd8a70acfb33f8623dc2fc54f74cdce3b3429b879fc2daac4807fe376190a04b9e024dd300f9a3ee1876d6623979cefe619f70654ca0fe0c47679a7 languageName: node linkType: hard @@ -9065,10 +9134,10 @@ __metadata: languageName: node linkType: hard -"@types/mocha@npm:^10.0.6": - version: 10.0.6 - resolution: "@types/mocha@npm:10.0.6" - checksum: f7c836cf6cf27dc0f5970d262591b56f2a3caeaec8cfdc612c12e1cfbb207f601f710ece207e935164d4e3343b93be5054d0db5544f31f453b3923775d82099f +"@types/mocha@npm:^10.0.7": + version: 10.0.7 + resolution: "@types/mocha@npm:10.0.7" + checksum: 5e411ed8aa19228e322b2fb0075c4d822322fb157d1adfc8620a798748035d430dc16421bdc7d7f84f118481b8c8c63ec86b95757a8acc926ddc3d737fbffc3a languageName: node linkType: hard @@ -9135,12 +9204,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.14.6": - version: 20.14.6 - resolution: "@types/node@npm:20.14.6" +"@types/node@npm:^20.14.13": + version: 20.14.13 + resolution: "@types/node@npm:20.14.13" dependencies: undici-types: ~5.26.4 - checksum: f0ba22b181cfa799e090e5198621d8bf2b35f2c18ce880b8cdf88a69f9db5a4cc56627fe2dfeca44b6a55895c0abf03df04810cabd9509b9c9b752189d37aa1f + checksum: 928e877aadfea75f3a14c38223674b3a9fb206340ab7b2af3ffe7040c384a55678f235860f6652d18026fd59e44c237d060e3f5ce7b62b1b9e6fb593c9ef39b9 languageName: node linkType: hard @@ -9315,6 +9384,13 @@ __metadata: languageName: node linkType: hard +"@types/uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "@types/uuid@npm:10.0.0" + checksum: e3958f8b0fe551c86c14431f5940c3470127293280830684154b91dc7eb3514aeb79fe3216968833cf79d4d1c67f580f054b5be2cd562bebf4f728913e73e944 + languageName: node + linkType: hard + "@types/uuid@npm:^8.3.4": version: 8.3.4 resolution: "@types/uuid@npm:8.3.4" @@ -9322,13 +9398,6 @@ __metadata: languageName: node linkType: hard -"@types/uuid@npm:^9.0.8": - version: 9.0.8 - resolution: "@types/uuid@npm:9.0.8" - checksum: b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 - languageName: node - linkType: hard - "@types/w3c-web-usb@npm:^1.0.6": version: 1.0.6 resolution: "@types/w3c-web-usb@npm:1.0.6" @@ -9535,13 +9604,6 @@ __metadata: languageName: node linkType: hard -"@ungap/promise-all-settled@npm:1.1.2": - version: 1.1.2 - resolution: "@ungap/promise-all-settled@npm:1.1.2" - checksum: 08d37fdfa23a6fe8139f1305313562ebad973f3fac01bcce2773b2bda5bcb0146dfdcf3cb6a722cf0a5f2ca0bc56a827eac8f1e7b3beddc548f654addf1fc34c - languageName: node - linkType: hard - "@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" @@ -9949,26 +10011,26 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-core@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/compiler-core@npm:3.4.29" +"@vue/compiler-core@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/compiler-core@npm:3.4.34" dependencies: "@babel/parser": ^7.24.7 - "@vue/shared": 3.4.29 + "@vue/shared": 3.4.34 entities: ^4.5.0 estree-walker: ^2.0.2 source-map-js: ^1.2.0 - checksum: 49c5a5a1a4f713a17537580dff3b06cf78479021ebae53aee8460e286bf50623bc40afe7aeae9766ae5ae6ec48f0ed8bb0e2e3ac5c48ae281909d97fba1bcba8 + checksum: 397e76fec66bb5481b32823aa9530e9810bb39c33b5ac78b4488e8814f5779bbc4d1d85cac98fe96c3036e83105ccad0fb813e15cb8b5d201343dfef99750041 languageName: node linkType: hard -"@vue/compiler-dom@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/compiler-dom@npm:3.4.29" +"@vue/compiler-dom@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/compiler-dom@npm:3.4.34" dependencies: - "@vue/compiler-core": 3.4.29 - "@vue/shared": 3.4.29 - checksum: c967881dcd9e687d968cee3f286e0e9f85674b8e43617236c3f990772357d66a71de992e815549bebfc770ef29aa3d301f504438f1494d55c6a8d4d016d13969 + "@vue/compiler-core": 3.4.34 + "@vue/shared": 3.4.34 + checksum: 6ba068d0274048eb25e3ef9665bbe6e4f9a65841ab4fd22336a6c5b760e9474c8260b31f514fbce3f3bf23e55e452c4be58cf35efafdb42c6a2d524e27cec1ca languageName: node linkType: hard @@ -9983,30 +10045,30 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-sfc@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/compiler-sfc@npm:3.4.29" +"@vue/compiler-sfc@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/compiler-sfc@npm:3.4.34" dependencies: "@babel/parser": ^7.24.7 - "@vue/compiler-core": 3.4.29 - "@vue/compiler-dom": 3.4.29 - "@vue/compiler-ssr": 3.4.29 - "@vue/shared": 3.4.29 + "@vue/compiler-core": 3.4.34 + "@vue/compiler-dom": 3.4.34 + "@vue/compiler-ssr": 3.4.34 + "@vue/shared": 3.4.34 estree-walker: ^2.0.2 magic-string: ^0.30.10 - postcss: ^8.4.38 + postcss: ^8.4.39 source-map-js: ^1.2.0 - checksum: 4e9ed7f2fb0628de34983482f05789e080b8f1794325ea6fd28bcdb2a724f68a37c569fb313bf0951576d7da90ad1f8d9b80d095e8abd2632e5b7f9fc2a58aea + checksum: e9fc4ee40372d7b5e18eb8921aa469bf224a6e6fbc33fe1a73dd16ee89c914f5ceb912e4e61453841de00e2a1dbc52e92b556e62436342637efbc19129d97eb2 languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/compiler-ssr@npm:3.4.29" +"@vue/compiler-ssr@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/compiler-ssr@npm:3.4.34" dependencies: - "@vue/compiler-dom": 3.4.29 - "@vue/shared": 3.4.29 - checksum: 41d7a1c7e3dc3e847228013c42f3de75d329901ed274e2e1b80012f04298fae470c73df8cab66b67e6ed5304d86576a89f9343c1115d009a799b5532dba32d12 + "@vue/compiler-dom": 3.4.34 + "@vue/shared": 3.4.34 + checksum: f066036859f6de1882a941e1fce7904d3bb091f858ab1ad40926e9d5bbb92ece883835e267a93b07d938c048480d51109cb776047d02b8bbe47fe4282d1bb78e languageName: node linkType: hard @@ -10030,13 +10092,20 @@ __metadata: languageName: node linkType: hard -"@vue/devtools-api@npm:^6.5.0, @vue/devtools-api@npm:^6.5.1": +"@vue/devtools-api@npm:^6.5.1": version: 6.6.1 resolution: "@vue/devtools-api@npm:6.6.1" checksum: cf12b5ebcc7729725087072289410107b55bb82e0b86b8442e4e85516977110a8a3f4e1dec763be8b567a59173703b4e9c0ac1b0489bb2bb81363af7ea258a27 languageName: node linkType: hard +"@vue/devtools-api@npm:^6.6.3": + version: 6.6.3 + resolution: "@vue/devtools-api@npm:6.6.3" + checksum: 4dc7e980bc50557b128655ca447d2f10ccda896a88d0560eec2c391a8b97ddb63547d79d30d76a6e9e2ec5368ee73c4a66bc44367cc607c0262c328fe648de8a + languageName: node + linkType: hard + "@vue/eslint-config-typescript@npm:^11.0.3": version: 11.0.3 resolution: "@vue/eslint-config-typescript@npm:11.0.3" @@ -10055,53 +10124,53 @@ __metadata: languageName: node linkType: hard -"@vue/reactivity@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/reactivity@npm:3.4.29" +"@vue/reactivity@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/reactivity@npm:3.4.34" dependencies: - "@vue/shared": 3.4.29 - checksum: 0dcdb5e4be19de6f6053fa4bd315df54eee950d2bb0f2e7e4243668cb71ec15ed74e07fa428644467be4db0248faba454da45607170ab9394a23ccc19d935a43 + "@vue/shared": 3.4.34 + checksum: 946111110d548d4a69482b5e36f9e988649eb04188eef63d29241be6a9c7a9f932ed8dbf8a0cc543d0865c6d4cbef39c4b5520246f9d791d5aca85e8d0d4c88a languageName: node linkType: hard -"@vue/runtime-core@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/runtime-core@npm:3.4.29" +"@vue/runtime-core@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/runtime-core@npm:3.4.34" dependencies: - "@vue/reactivity": 3.4.29 - "@vue/shared": 3.4.29 - checksum: 03fbf6cb418fa5329b6a88f8ef3148f97a2affb22e59886e3af1f0cd148c523290b04722ed685bb22a5e2e6582ec04773573dd3bce35f3cd3837cddcd9c7f8b0 + "@vue/reactivity": 3.4.34 + "@vue/shared": 3.4.34 + checksum: b9b30900885798c0aabffb0ce560ac901d8ef8451f7550012a9884760326ce1d240bbfeebd41db7d50e88c8ee22cb53604ecfe878ac7d9fc6aa02083847ca812 languageName: node linkType: hard -"@vue/runtime-dom@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/runtime-dom@npm:3.4.29" +"@vue/runtime-dom@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/runtime-dom@npm:3.4.34" dependencies: - "@vue/reactivity": 3.4.29 - "@vue/runtime-core": 3.4.29 - "@vue/shared": 3.4.29 + "@vue/reactivity": 3.4.34 + "@vue/runtime-core": 3.4.34 + "@vue/shared": 3.4.34 csstype: ^3.1.3 - checksum: 3db1ed7b7b27e373a17b1c5f9e3bec8d3cf2ed0ba5b14a3d7df4c7502f8c5cd72e24485035c77e25a0026a7133047acb8ac99bcc12b011d4b6535f1c55207213 + checksum: de62363ac410512fc699be4ba62e1139a1ad58371faa48e8f6e2141736e3264ea42739af7f19261fa2285dd7a2f121db58cd8a59fda93b15f718e4b3250f81d2 languageName: node linkType: hard -"@vue/server-renderer@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/server-renderer@npm:3.4.29" +"@vue/server-renderer@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/server-renderer@npm:3.4.34" dependencies: - "@vue/compiler-ssr": 3.4.29 - "@vue/shared": 3.4.29 + "@vue/compiler-ssr": 3.4.34 + "@vue/shared": 3.4.34 peerDependencies: - vue: 3.4.29 - checksum: e176da876f4be93f71d05b68aa8ce4b5cc65d735af2b1512f4404d381432d66dfd53477390d0ea30333ac1f37b3662827c8ac55cfba985f15fc756dca9fe211c + vue: 3.4.34 + checksum: 86baafeb88174e0798d0f2f91d8eca0a8278bb13cbdcd2516ffdd35767f78a43aff0da6f39e98f4a9148bb8196a4ec782aae0807e211717919be719ce52492cd languageName: node linkType: hard -"@vue/shared@npm:3.4.29": - version: 3.4.29 - resolution: "@vue/shared@npm:3.4.29" - checksum: 399c4fb43382eeb8d94b6b61454434d24f874bccde9673b4a73c8648758cb1f9fb5b67fb75e8250d8298e88e51d226c1e74f49bb64294f8a24e834c033f5ed4a +"@vue/shared@npm:3.4.34": + version: 3.4.34 + resolution: "@vue/shared@npm:3.4.34" + checksum: 6383d05a23137b66a9f2b4e18ca7da874eab4b059db1ce62c0f1220c99670a8349987ef9f376e832b208afa521041323c0b6860f7e1dd55974b78c128df74fc7 languageName: node linkType: hard @@ -10680,14 +10749,14 @@ __metadata: languageName: node linkType: hard -"@zondax/ledger-substrate@npm:^0.44.2": - version: 0.44.2 - resolution: "@zondax/ledger-substrate@npm:0.44.2" +"@zondax/ledger-substrate@npm:^0.44.7": + version: 0.44.7 + resolution: "@zondax/ledger-substrate@npm:0.44.7" dependencies: - "@ledgerhq/hw-transport": 6.30.6 + "@ledgerhq/hw-transport": 6.31.0 "@zondax/ledger-js": ^0.8.2 - axios: ^1.6.8 - checksum: 1f0035725c88335c8e1c234fc75ebdbc39666d8567bb3d77734ed861f85a49b87d358f520bef76287ff2e75914f790a5454cb27b7814489292100730023a9541 + axios: ^1.7.2 + checksum: e42a64278598410a705ee93a18ccb509afa0811295b6319de9576a5f9018810cf93152f4da5437282178088c762cc1750407b98f0367fdba8e0e275db763d1f4 languageName: node linkType: hard @@ -10973,10 +11042,10 @@ __metadata: languageName: node linkType: hard -"ansi-colors@npm:4.1.1": - version: 4.1.1 - resolution: "ansi-colors@npm:4.1.1" - checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0 +"ansi-colors@npm:^4.1.3": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e languageName: node linkType: hard @@ -12101,7 +12170,7 @@ __metadata: languageName: node linkType: hard -"browser-stdout@npm:1.3.1": +"browser-stdout@npm:^1.3.1": version: 1.3.1 resolution: "browser-stdout@npm:1.3.1" checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 @@ -12415,14 +12484,14 @@ __metadata: languageName: node linkType: hard -"bundle-require@npm:^4.0.0": - version: 4.0.0 - resolution: "bundle-require@npm:4.0.0" +"bundle-require@npm:^5.0.0": + version: 5.0.0 + resolution: "bundle-require@npm:5.0.0" dependencies: load-tsconfig: ^0.2.3 peerDependencies: - esbuild: ">=0.17" - checksum: 83dd37c59694c1e6606f451dc84bcbea6a540e689402d710714a868f011b27863d79f8dd23783bc05354793cdbe9d5534a0702361370032a577300ac19b747bd + esbuild: ">=0.18" + checksum: c5b31e2782546c21649cfc6e4bbdbaa0a41764e0d73b31c95f0a40efe961f83bc5cdc92308ad26aee735cf82b438cf945cc96dfefa16c5d8fc61a7cca67fa3fb languageName: node linkType: hard @@ -12481,7 +12550,7 @@ __metadata: languageName: node linkType: hard -"cac@npm:^6.7.12, cac@npm:^6.7.14": +"cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" checksum: 45a2496a9443abbe7f52a49b22fbe51b1905eff46e03fd5e6c98e3f85077be3f8949685a1849b1a9cd2bc3e5567dfebcf64f01ce01847baf918f1b37c839791a @@ -12569,6 +12638,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + languageName: node + linkType: hard + "call-me-maybe@npm:^1.0.1": version: 1.0.1 resolution: "call-me-maybe@npm:1.0.1" @@ -12729,7 +12811,7 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.2.0, chai@npm:^4.3.4, chai@npm:^4.4.1": +"chai@npm:^4.2.0, chai@npm:^4.3.4": version: 4.4.1 resolution: "chai@npm:4.4.1" dependencies: @@ -12744,6 +12826,21 @@ __metadata: languageName: node linkType: hard +"chai@npm:^4.5.0": + version: 4.5.0 + resolution: "chai@npm:4.5.0" + dependencies: + assertion-error: ^1.1.0 + check-error: ^1.0.3 + deep-eql: ^4.1.3 + get-func-name: ^2.0.2 + loupe: ^2.3.6 + pathval: ^1.1.1 + type-detect: ^4.1.0 + checksum: 70e5a8418a39e577e66a441cc0ce4f71fd551a650a71de30dd4e3e31e75ed1f5aa7119cf4baf4a2cb5e85c0c6befdb4d8a05811fad8738c1a6f3aa6a23803821 + languageName: node + linkType: hard + "chainweb@npm:^2.0.4": version: 2.0.4 resolution: "chainweb@npm:2.0.4" @@ -12872,7 +12969,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3, chokidar@npm:^3.4.2, chokidar@npm:^3.5.1, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": +"chokidar@npm:^3.4.2, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -14163,18 +14260,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:4.3.3": - version: 4.3.3 - resolution: "debug@npm:4.3.3" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 14472d56fe4a94dbcfaa6dbed2dd3849f1d72ba78104a1a328047bb564643ca49df0224c3a17fa63533fd11dd3d4c8636cd861191232a2c6735af00cc2d4de16 - languageName: node - linkType: hard - "debug@npm:^3.1.1, debug@npm:^3.2.6, debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -14184,6 +14269,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.3.5": + version: 4.3.6 + resolution: "debug@npm:4.3.6" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 1630b748dea3c581295e02137a9f5cbe2c1d85fea35c1e6597a65ca2b16a6fce68cec61b299d480787ef310ba927dc8c92d3061faba0ad06c6a724672f66be7f + languageName: node + linkType: hard + "decamelize@npm:^1.1.1": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -14303,6 +14400,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -14469,13 +14577,6 @@ __metadata: languageName: node linkType: hard -"diff@npm:5.0.0": - version: 5.0.0 - resolution: "diff@npm:5.0.0" - checksum: f19fe29284b633afdb2725c2a8bb7d25761ea54d321d8e67987ac851c5294be4afeab532bd84531e02583a3fe7f4014aa314a3eda84f5590e7a9e6b371ef3b46 - languageName: node - linkType: hard - "diff@npm:^3.1.0": version: 3.5.0 resolution: "diff@npm:3.5.0" @@ -14490,6 +14591,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -14760,13 +14868,13 @@ __metadata: languageName: node linkType: hard -"echarts@npm:^5.5.0": - version: 5.5.0 - resolution: "echarts@npm:5.5.0" +"echarts@npm:^5.5.1": + version: 5.5.1 + resolution: "echarts@npm:5.5.1" dependencies: tslib: 2.3.0 - zrender: 5.5.0 - checksum: 181600d21bc4ad6a877bac419800501345c4103ae49ef05a4db495c8dde91f0a5f7ff02eb94581190c59518526f7931e8410ce3fe5da1e0f1e60cd1aeec04a52 + zrender: 5.6.0 + checksum: 1b8e00a9492157d6faa58483add07bac7560e273e8716bd62d6e75777809dbe43106cd5bceb7e0deebf36ae100356395e2be07ce3a21442496241e25a219482f languageName: node linkType: hard @@ -14877,11 +14985,11 @@ __metadata: dependencies: "@commitlint/cli": ^19.3.0 "@commitlint/config-conventional": ^19.2.2 - "@swc/core": ^1.6.3 + "@swc/core": ^1.7.3 concurrently: ^8.2.2 - husky: ^9.0.11 + husky: ^9.1.4 node-notifier: ^10.0.1 - nodemon: ^3.1.3 + nodemon: ^3.1.4 ultra-runner: ^3.10.5 languageName: unknown linkType: soft @@ -14997,6 +15105,22 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + "es-module-lexer@npm:^0.9.0": version: 0.9.3 resolution: "es-module-lexer@npm:0.9.3" @@ -15083,33 +15207,34 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.21.4": - version: 0.21.5 - resolution: "esbuild@npm:0.21.5" - dependencies: - "@esbuild/aix-ppc64": 0.21.5 - "@esbuild/android-arm": 0.21.5 - "@esbuild/android-arm64": 0.21.5 - "@esbuild/android-x64": 0.21.5 - "@esbuild/darwin-arm64": 0.21.5 - "@esbuild/darwin-x64": 0.21.5 - "@esbuild/freebsd-arm64": 0.21.5 - "@esbuild/freebsd-x64": 0.21.5 - "@esbuild/linux-arm": 0.21.5 - "@esbuild/linux-arm64": 0.21.5 - "@esbuild/linux-ia32": 0.21.5 - "@esbuild/linux-loong64": 0.21.5 - "@esbuild/linux-mips64el": 0.21.5 - "@esbuild/linux-ppc64": 0.21.5 - "@esbuild/linux-riscv64": 0.21.5 - "@esbuild/linux-s390x": 0.21.5 - "@esbuild/linux-x64": 0.21.5 - "@esbuild/netbsd-x64": 0.21.5 - "@esbuild/openbsd-x64": 0.21.5 - "@esbuild/sunos-x64": 0.21.5 - "@esbuild/win32-arm64": 0.21.5 - "@esbuild/win32-ia32": 0.21.5 - "@esbuild/win32-x64": 0.21.5 +"esbuild@npm:^0.23.0": + version: 0.23.0 + resolution: "esbuild@npm:0.23.0" + dependencies: + "@esbuild/aix-ppc64": 0.23.0 + "@esbuild/android-arm": 0.23.0 + "@esbuild/android-arm64": 0.23.0 + "@esbuild/android-x64": 0.23.0 + "@esbuild/darwin-arm64": 0.23.0 + "@esbuild/darwin-x64": 0.23.0 + "@esbuild/freebsd-arm64": 0.23.0 + "@esbuild/freebsd-x64": 0.23.0 + "@esbuild/linux-arm": 0.23.0 + "@esbuild/linux-arm64": 0.23.0 + "@esbuild/linux-ia32": 0.23.0 + "@esbuild/linux-loong64": 0.23.0 + "@esbuild/linux-mips64el": 0.23.0 + "@esbuild/linux-ppc64": 0.23.0 + "@esbuild/linux-riscv64": 0.23.0 + "@esbuild/linux-s390x": 0.23.0 + "@esbuild/linux-x64": 0.23.0 + "@esbuild/netbsd-x64": 0.23.0 + "@esbuild/openbsd-arm64": 0.23.0 + "@esbuild/openbsd-x64": 0.23.0 + "@esbuild/sunos-x64": 0.23.0 + "@esbuild/win32-arm64": 0.23.0 + "@esbuild/win32-ia32": 0.23.0 + "@esbuild/win32-x64": 0.23.0 dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -15147,6 +15272,8 @@ __metadata: optional: true "@esbuild/netbsd-x64": optional: true + "@esbuild/openbsd-arm64": + optional: true "@esbuild/openbsd-x64": optional: true "@esbuild/sunos-x64": @@ -15159,7 +15286,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 2911c7b50b23a9df59a7d6d4cdd3a4f85855787f374dce751148dbb13305e0ce7e880dde1608c2ab7a927fc6cec3587b80995f7fc87a64b455f8b70b55fd8ec1 + checksum: 22138538225d5ce79f84fc0d3d3e31b57a91ef50ef00f2d6a9c8a4be4ed28d4b1d0ed14239e54341d1b9a7079f25e69761d0266f3c255da94e647b079b790421 languageName: node linkType: hard @@ -15264,13 +15391,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:4.0.0, escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - "escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" @@ -15285,6 +15405,13 @@ __metadata: languageName: node linkType: hard +"escape-string-regexp@npm:^4.0.0": + version: 4.0.0 + resolution: "escape-string-regexp@npm:4.0.0" + checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + languageName: node + linkType: hard + "escodegen@npm:^1.13.0": version: 1.14.3 resolution: "escodegen@npm:1.14.3" @@ -15698,15 +15825,15 @@ __metadata: languageName: node linkType: hard -"ethereum-cryptography@npm:^2.2.0": - version: 2.2.0 - resolution: "ethereum-cryptography@npm:2.2.0" +"ethereum-cryptography@npm:^2.2.1": + version: 2.2.1 + resolution: "ethereum-cryptography@npm:2.2.1" dependencies: - "@noble/curves": 1.4.0 + "@noble/curves": 1.4.2 "@noble/hashes": 1.4.0 "@scure/bip32": 1.4.0 "@scure/bip39": 1.3.0 - checksum: 529d05a47fe0ff86ab36022a286c3a280e09d386fc92ff183aa4b095e97d190dd875022a004898686a798bac56e73601dd91356298edc56e5eeded7846f8ec12 + checksum: 1466e4c417b315a6ac67f95088b769fafac8902b495aada3c6375d827e5a7882f9e0eea5f5451600d2250283d9198b8a3d4d996e374e07a80a324e29136f25c6 languageName: node linkType: hard @@ -16018,7 +16145,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^5.0.0": +"execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" dependencies: @@ -16333,16 +16460,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:5.0.0, find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - "find-up@npm:^1.0.0": version: 1.1.2 resolution: "find-up@npm:1.1.2" @@ -16363,6 +16480,16 @@ __metadata: languageName: node linkType: hard +"find-up@npm:^5.0.0": + version: 5.0.0 + resolution: "find-up@npm:5.0.0" + dependencies: + locate-path: ^6.0.0 + path-exists: ^4.0.0 + checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 + languageName: node + linkType: hard + "find-up@npm:^7.0.0": version: 7.0.0 resolution: "find-up@npm:7.0.0" @@ -16788,6 +16915,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + languageName: node + linkType: hard + "get-stream@npm:^3.0.0": version: 3.0.0 resolution: "get-stream@npm:3.0.0" @@ -16911,45 +17051,19 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.6": - version: 7.1.6 - resolution: "glob@npm:7.1.6" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 351d549dd90553b87c2d3f90ce11aed9e1093c74130440e7ae0592e11bbcd2ce7f0ebb8ba6bfe63aaf9b62166a7f4c80cb84490ae5d78408bb2572bf7d4ee0a6 - languageName: node - linkType: hard - -"glob@npm:7.2.0, glob@npm:^7.0.5, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": - version: 7.2.0 - resolution: "glob@npm:7.2.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 - languageName: node - linkType: hard - -"glob@npm:8.1.0, glob@npm:^8.0.0": - version: 8.1.0 - resolution: "glob@npm:8.1.0" +"glob@npm:^10.3.10": + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + foreground-child: ^3.1.0 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + package-json-from-dist: ^1.0.0 + path-scurry: ^1.11.1 + bin: + glob: dist/esm/bin.mjs + checksum: 0bc725de5e4862f9f387fd0f2b274baf16850dcd2714502ccf471ee401803997983e2c05590cb65f9675a3c6f2a58e7a53f9e365704108c6ad3cbf1d60934c4a languageName: node linkType: hard @@ -16984,6 +17098,36 @@ __metadata: languageName: node linkType: hard +"glob@npm:^11.0.0": + version: 11.0.0 + resolution: "glob@npm:11.0.0" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^4.0.1 + minimatch: ^10.0.0 + minipass: ^7.1.2 + package-json-from-dist: ^1.0.0 + path-scurry: ^2.0.0 + bin: + glob: dist/esm/bin.mjs + checksum: 8a2dd914d5776987be5244624d9491bbcaf19f2387e06783737003ff696ebfd2264190c47014f8709c1c02d8bc892f17660cf986c587b107e194c0a3151ab333 + languageName: node + linkType: hard + +"glob@npm:^7.0.5, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": + version: 7.2.0 + resolution: "glob@npm:7.2.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 78a8ea942331f08ed2e055cb5b9e40fe6f46f579d7fd3d694f3412fe5db23223d29b7fee1575440202e9a7ff9a72ab106a39fee39934c7bedafe5e5f8ae20134 + languageName: node + linkType: hard + "glob@npm:^7.1.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -16994,7 +17138,21 @@ __metadata: minimatch: ^3.1.1 once: ^1.3.0 path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:^8.0.0, glob@npm:^8.1.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^3.0.4 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 languageName: node linkType: hard @@ -17148,13 +17306,6 @@ __metadata: languageName: node linkType: hard -"growl@npm:1.10.5": - version: 1.10.5 - resolution: "growl@npm:1.10.5" - checksum: 4b86685de6831cebcbb19f93870bea624afee61124b0a20c49017013987cd129e73a8c4baeca295728f41d21265e1f859d25ef36731b142ca59c655fea94bb1a - languageName: node - linkType: hard - "growly@npm:^1.3.0": version: 1.3.0 resolution: "growly@npm:1.3.0" @@ -17225,6 +17376,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -17360,7 +17520,7 @@ __metadata: languageName: node linkType: hard -"he@npm:1.2.0, he@npm:^1.2.0": +"he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" bin: @@ -17711,12 +17871,12 @@ __metadata: languageName: node linkType: hard -"husky@npm:^9.0.11": - version: 9.0.11 - resolution: "husky@npm:9.0.11" +"husky@npm:^9.1.4": + version: 9.1.4 + resolution: "husky@npm:9.1.4" bin: - husky: bin.mjs - checksum: 1aebc3334dc7ac6288ff5e1fb72cfb447cfa474e72cf7ba692e8c5698c573ab725c28c6a5088c9f8e6aca5f47d40fa7261beffbc07a4d307ca21656dc4571f07 + husky: bin.js + checksum: 7608a6dfac264876a2ff37f2db8520e0f9f0ea2b810a9ca151548327e9eca0b7ed58a63e0a208d20d3f43b191d8f111edcab46c3c8132c95e10ef7bd7115ee9b languageName: node linkType: hard @@ -18587,6 +18747,19 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^4.0.1": + version: 4.0.1 + resolution: "jackspeak@npm:4.0.1" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 7989d19eddeff0631ef653df413e26290db77dc3791438bd12b56bed1c0b24d5d535fdfec13cf35775cd5b47f8ee57d36fd0bceaf2df672b1f523533fd4184cc + languageName: node + linkType: hard + "javascript-stringify@npm:^2.0.1": version: 2.1.0 resolution: "javascript-stringify@npm:2.1.0" @@ -18722,7 +18895,7 @@ __metadata: languageName: node linkType: hard -"joycon@npm:^3.0.1, joycon@npm:^3.1.1": +"joycon@npm:^3.1.1": version: 3.1.1 resolution: "joycon@npm:3.1.1" checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 @@ -18843,7 +19016,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:4.1.0, js-yaml@npm:^4.1.0": +"js-yaml@npm:^4.1.0": version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: @@ -19423,10 +19596,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:^3.0.0": - version: 3.1.1 - resolution: "lilconfig@npm:3.1.1" - checksum: dc8a4f4afde3f0fac6bd36163cc4777a577a90759b8ef1d0d766b19ccf121f723aa79924f32af5b954f3965268215e046d0f237c41c76e5ef01d4e6d1208a15e +"lilconfig@npm:^3.1.1": + version: 3.1.2 + resolution: "lilconfig@npm:3.1.2" + checksum: 4e8b83ddd1d0ad722600994e6ba5d858ddca14f0587aa6b9c8185e17548149b5e13d4d583d811e9e9323157fa8c6a527e827739794c7502b59243c58e210b8c3 languageName: node linkType: hard @@ -19671,7 +19844,7 @@ __metadata: languageName: node linkType: hard -"log-symbols@npm:4.1.0, log-symbols@npm:^4.1.0": +"log-symbols@npm:^4.1.0": version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: @@ -19800,6 +19973,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^11.0.0": + version: 11.0.0 + resolution: "lru-cache@npm:11.0.0" + checksum: c29385f9369b1a566e1db9eda9a4b12f6507de906e5720ca12844dd775b7139c42b8e5837e7d5162bcc292ce4d3eecfa74ec2856c6afcc0caa2e3c9ea3a17f27 + languageName: node + linkType: hard + "lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.2": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -20215,21 +20395,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:4.2.1": - version: 4.2.1 - resolution: "minimatch@npm:4.2.1" - dependencies: - brace-expansion: ^1.1.7 - checksum: 2b1514e3d0f29a549912f0db7ae7b82c5cab4a8f2dd0369f1c6451a325b3f12b2cf473c95873b6157bb8df183d6cf6db82ff03614b6adaaf1d7e055beccdfd01 - languageName: node - linkType: hard - -"minimatch@npm:5.0.1": - version: 5.0.1 - resolution: "minimatch@npm:5.0.1" +"minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" dependencies: brace-expansion: ^2.0.1 - checksum: b34b98463da4754bc526b244d680c69d4d6089451ebe512edaf6dd9eeed0279399cfa3edb19233513b8f830bf4bfcad911dddcdf125e75074100d52f724774f0 + checksum: f5b63c2f30606091a057c5f679b067f84a2cd0ffbd2dbc9143bda850afd353c7be81949ff11ae0c86988f07390eeca64efd7143ee05a0dab37f6c6b38a2ebb6c languageName: node linkType: hard @@ -20242,7 +20413,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.1.0": +"minimatch@npm:^5.1.0, minimatch@npm:^5.1.6": version: 5.1.6 resolution: "minimatch@npm:5.1.6" dependencies: @@ -20453,69 +20624,34 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^10.4.0": - version: 10.4.0 - resolution: "mocha@npm:10.4.0" +"mocha@npm:^10.7.0": + version: 10.7.0 + resolution: "mocha@npm:10.7.0" dependencies: - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 8.1.0 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 5.0.1 - ms: 2.1.3 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - workerpool: 6.2.1 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 + ansi-colors: ^4.1.3 + browser-stdout: ^1.3.1 + chokidar: ^3.5.3 + debug: ^4.3.5 + diff: ^5.2.0 + escape-string-regexp: ^4.0.0 + find-up: ^5.0.0 + glob: ^8.1.0 + he: ^1.2.0 + js-yaml: ^4.1.0 + log-symbols: ^4.1.0 + minimatch: ^5.1.6 + ms: ^2.1.3 + serialize-javascript: ^6.0.2 + strip-json-comments: ^3.1.1 + supports-color: ^8.1.1 + workerpool: ^6.5.1 + yargs: ^16.2.0 + yargs-parser: ^20.2.9 + yargs-unparser: ^2.0.0 bin: _mocha: bin/_mocha mocha: bin/mocha.js - checksum: 090771d6d42a65a934c7ed448d524bcc663836351af9f0678578caa69943b01a9535a73192d24fd625b3fdb5979cce5834dfe65e3e1ee982444d65e19975b81c - languageName: node - linkType: hard - -"mocha@npm:^9.2.2": - version: 9.2.2 - resolution: "mocha@npm:9.2.2" - dependencies: - "@ungap/promise-all-settled": 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3 - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - bin: - _mocha: bin/_mocha - mocha: bin/mocha - checksum: 4d5ca4ce33fc66627e63acdf09a634e2358c9a00f61de7788b1091b6aad430da04f97f9ecb82d56dc034b623cb833b65576136fd010d77679c03fcea5bc1e12d + checksum: e04c4ce7a61cacf0edd66a8e5ce04b14c1adaaac66c1c7765d5408f3c27b75583e104baa92709c40f207b7ff51bc80b85c4aa7b4e5ce25dbddd1e55d66aa774b languageName: node linkType: hard @@ -20607,7 +20743,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -20754,15 +20890,6 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:3.3.1": - version: 3.3.1 - resolution: "nanoid@npm:3.3.1" - bin: - nanoid: bin/nanoid.cjs - checksum: 4ef0969e1bbe866fc223eb32276cbccb0961900bfe79104fa5abe34361979dead8d0e061410a5c03bc3d47455685adf32c09d6f27790f4a6898fb51f7df7ec86 - languageName: node - linkType: hard - "nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" @@ -21075,9 +21202,9 @@ __metadata: languageName: node linkType: hard -"nodemon@npm:^3.1.3": - version: 3.1.3 - resolution: "nodemon@npm:3.1.3" +"nodemon@npm:^3.1.4": + version: 3.1.4 + resolution: "nodemon@npm:3.1.4" dependencies: chokidar: ^3.5.2 debug: ^4 @@ -21091,7 +21218,7 @@ __metadata: undefsafe: ^2.0.5 bin: nodemon: bin/nodemon.js - checksum: ac2fa8865ab292b7ddf66731487acca4b4282b2728361e0de633c0c74cd705d6a0852b52f785c09469d959241d038ba824f50375622e687a2a318be747d9cd9d + checksum: 3f003fc2c7bdaba559108320f188b7cb063220455e5da218ff3bf4f7468ad7059852da6e35a52b8c690cc27f6e36a433a9ad1f1bdb8096ec1ee3d930629cbeca languageName: node linkType: hard @@ -21987,6 +22114,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: ^11.0.0 + minipass: ^7.1.2 + checksum: 9953ce3857f7e0796b187a7066eede63864b7e1dfc14bf0484249801a5ab9afb90d9a58fc533ebb1b552d23767df8aa6a2c6c62caf3f8a65f6ce336a97bbb484 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -22074,6 +22211,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -22109,12 +22253,12 @@ __metadata: languageName: node linkType: hard -"pinia@npm:^2.1.7": - version: 2.1.7 - resolution: "pinia@npm:2.1.7" +"pinia@npm:^2.2.0": + version: 2.2.0 + resolution: "pinia@npm:2.2.0" dependencies: - "@vue/devtools-api": ^6.5.0 - vue-demi: ">=0.14.5" + "@vue/devtools-api": ^6.6.3 + vue-demi: ^0.14.8 peerDependencies: "@vue/composition-api": ^1.4.0 typescript: ">=4.4.4" @@ -22124,7 +22268,7 @@ __metadata: optional: true typescript: optional: true - checksum: 1b7882aab2828ad209d3e76e06918c8811d04699c9308d372094cde6df485d7e7785f25a3bb5c6a3724aeaee3fb0082fae03c41a6657acd3486c7965a0a09d34 + checksum: a63231147370b640adcdea2c55fe7ecdc6c55adfe31ae61d141dd9593a6d996c2495c9ed89574cc4c2bcb222454d9c6f4a0936add3f5edd42908592b4ae269da languageName: node linkType: hard @@ -22373,21 +22517,26 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^4.0.1": - version: 4.0.2 - resolution: "postcss-load-config@npm:4.0.2" +"postcss-load-config@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-load-config@npm:6.0.1" dependencies: - lilconfig: ^3.0.0 - yaml: ^2.3.4 + lilconfig: ^3.1.1 peerDependencies: + jiti: ">=1.21.0" postcss: ">=8.0.9" - ts-node: ">=9.0.0" + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: + optional: true + yaml: optional: true - checksum: 7c27dd3801db4eae207a5116fed2db6b1ebb780b40c3dd62a3e57e087093a8e6a14ee17ada729fee903152d6ef4826c6339eb135bee6208e0f3140d7e8090185 + checksum: 701061264cce7646e53e4cecd14aa95432a9bd508f30520a31dfa4c86fe9252d5d8d0204fdbfbddc1559c9b8791556e9c4b92c56070f5fca0a6c60e5ee9ad0fd languageName: node linkType: hard @@ -22718,14 +22867,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.38": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" +"postcss@npm:^8.4.39": + version: 8.4.40 + resolution: "postcss@npm:8.4.40" dependencies: nanoid: ^3.3.7 - picocolors: ^1.0.0 + picocolors: ^1.0.1 source-map-js: ^1.2.0 - checksum: 649f9e60a763ca4b5a7bbec446a069edf07f057f6d780a5a0070576b841538d1ecf7dd888f2fbfd1f76200e26c969e405aeeae66332e6927dbdc8bdcb90b9451 + checksum: afd0cc49d2169dcd96c0f17e155c5d75de048956306a3017f1cfa6a7d66b941592245bed20f7796ceeccb2d8967749b623be2c7b010a74f67ea10fb5bdb8ba28 languageName: node linkType: hard @@ -23192,6 +23341,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:^6.12.3": + version: 6.12.3 + resolution: "qs@npm:6.12.3" + dependencies: + side-channel: ^1.0.6 + checksum: 9a9228a623bc36d41648237667d7342fb8d64d1cfeb29e474b0c44591ba06ac507e2d726f60eca5af8dc420e5dd23370af408ef8c28e0405675c7187b736a693 + languageName: node + linkType: hard + "qs@npm:~6.5.2": version: 6.5.3 resolution: "qs@npm:6.5.3" @@ -23300,24 +23458,24 @@ __metadata: languageName: node linkType: hard -"rango-sdk-basic@npm:^0.1.49": - version: 0.1.49 - resolution: "rango-sdk-basic@npm:0.1.49" +"rango-sdk-basic@npm:^0.1.51": + version: 0.1.51 + resolution: "rango-sdk-basic@npm:0.1.51" dependencies: axios: ^1.7.2 bignumber.js: ^9.1.1 eth-rpc-errors: ^4.0.3 ethers: ^5.7.2 - rango-types: ^0.1.69 + rango-types: ^0.1.71 uuid-random: ^1.3.2 - checksum: cdde2789d4abff5f3bfa45f80117e1b2687ac63fa265e52781cca5e882ea1775e67c7a1f6b941e5663c50dddc06cd3613309c1d9f04dc07d01c4a2d68df8600c + checksum: c58b88e8294ecf592925256aa5c9470c2df6ff29fac6d58e711bd774bf30f83bf481e633f5faccddb765b5aa159884a794336099036143b6f89cbdb1aa87c824 languageName: node linkType: hard -"rango-types@npm:^0.1.69": - version: 0.1.69 - resolution: "rango-types@npm:0.1.69" - checksum: b8056efd52c379e472e2a5d3b1f4ad84b5a694b3c816bbc79d5dae64b8f36e283b4418742aa09447009e4a2ac39d93da46e1604d64dfd7a3e1d26418dc58443c +"rango-types@npm:^0.1.71": + version: 0.1.71 + resolution: "rango-types@npm:0.1.71" + checksum: 5cd3522830c1216df215754cefa3b2750b1e99bc3bb112a52ec46eba13a8f573ee7134542709a60d34fc3106e15cede6fe2720a0008e174fbd43d450e687ab41 languageName: node linkType: hard @@ -23716,13 +23874,6 @@ __metadata: languageName: node linkType: hard -"resize-detector@npm:^0.3.0": - version: 0.3.0 - resolution: "resize-detector@npm:0.3.0" - checksum: 06c5f321b9349e34b71020b945cbd90c5300ca49d3e204fbc236c0827ad133a2d0cd48b9943a8b50723e4e16b67c106d9b8e1eba6240a6e136d1926373bacb2e - languageName: node - linkType: hard - "resolve-alpn@npm:^1.2.0": version: 1.2.1 resolution: "resolve-alpn@npm:1.2.1" @@ -23891,14 +24042,15 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^5.0.7": - version: 5.0.7 - resolution: "rimraf@npm:5.0.7" +"rimraf@npm:^6.0.1": + version: 6.0.1 + resolution: "rimraf@npm:6.0.1" dependencies: - glob: ^10.3.7 + glob: ^11.0.0 + package-json-from-dist: ^1.0.0 bin: rimraf: dist/esm/bin.mjs - checksum: 884852abf8aefd4667448d87bdab04120a8641266c828cf382ac811713547eda18f81799d2146ffec3178f357d83d44ec01c10095949c82e23551660732bf14f + checksum: 8ba5b84131c1344e9417cb7e8c05d8368bb73cbe5dd4c1d5eb49fc0b558209781658d18c450460e30607d0b7865bb067482839a2f343b186b07ae87715837e66 languageName: node linkType: hard @@ -24049,80 +24201,26 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.0.2": - version: 4.12.0 - resolution: "rollup@npm:4.12.0" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.12.0 - "@rollup/rollup-android-arm64": 4.12.0 - "@rollup/rollup-darwin-arm64": 4.12.0 - "@rollup/rollup-darwin-x64": 4.12.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.12.0 - "@rollup/rollup-linux-arm64-gnu": 4.12.0 - "@rollup/rollup-linux-arm64-musl": 4.12.0 - "@rollup/rollup-linux-riscv64-gnu": 4.12.0 - "@rollup/rollup-linux-x64-gnu": 4.12.0 - "@rollup/rollup-linux-x64-musl": 4.12.0 - "@rollup/rollup-win32-arm64-msvc": 4.12.0 - "@rollup/rollup-win32-ia32-msvc": 4.12.0 - "@rollup/rollup-win32-x64-msvc": 4.12.0 - "@types/estree": 1.0.5 - fsevents: ~2.3.2 - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: a7398f072cf50804e9bdaf363792d0b7801800640434e7867c10b4e2e7be421ca2dc614ae0fc7392044eaf77d5c3a66f76a6fa2246bef97a7bc55926a8d60982 - languageName: node - linkType: hard - -"rollup@npm:^4.18.0": - version: 4.18.0 - resolution: "rollup@npm:4.18.0" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.18.0 - "@rollup/rollup-android-arm64": 4.18.0 - "@rollup/rollup-darwin-arm64": 4.18.0 - "@rollup/rollup-darwin-x64": 4.18.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.18.0 - "@rollup/rollup-linux-arm-musleabihf": 4.18.0 - "@rollup/rollup-linux-arm64-gnu": 4.18.0 - "@rollup/rollup-linux-arm64-musl": 4.18.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.18.0 - "@rollup/rollup-linux-riscv64-gnu": 4.18.0 - "@rollup/rollup-linux-s390x-gnu": 4.18.0 - "@rollup/rollup-linux-x64-gnu": 4.18.0 - "@rollup/rollup-linux-x64-musl": 4.18.0 - "@rollup/rollup-win32-arm64-msvc": 4.18.0 - "@rollup/rollup-win32-ia32-msvc": 4.18.0 - "@rollup/rollup-win32-x64-msvc": 4.18.0 +"rollup@npm:^4.19.0, rollup@npm:^4.19.1": + version: 4.19.1 + resolution: "rollup@npm:4.19.1" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.19.1 + "@rollup/rollup-android-arm64": 4.19.1 + "@rollup/rollup-darwin-arm64": 4.19.1 + "@rollup/rollup-darwin-x64": 4.19.1 + "@rollup/rollup-linux-arm-gnueabihf": 4.19.1 + "@rollup/rollup-linux-arm-musleabihf": 4.19.1 + "@rollup/rollup-linux-arm64-gnu": 4.19.1 + "@rollup/rollup-linux-arm64-musl": 4.19.1 + "@rollup/rollup-linux-powerpc64le-gnu": 4.19.1 + "@rollup/rollup-linux-riscv64-gnu": 4.19.1 + "@rollup/rollup-linux-s390x-gnu": 4.19.1 + "@rollup/rollup-linux-x64-gnu": 4.19.1 + "@rollup/rollup-linux-x64-musl": 4.19.1 + "@rollup/rollup-win32-arm64-msvc": 4.19.1 + "@rollup/rollup-win32-ia32-msvc": 4.19.1 + "@rollup/rollup-win32-x64-msvc": 4.19.1 "@types/estree": 1.0.5 fsevents: ~2.3.2 dependenciesMeta: @@ -24162,7 +24260,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 54cde921e763017ce952ba76ec77d58dd9c01e3536c3be628d4af8c59d9b2f0e1e6a11b30fda44845c7b74098646cd972feb3bcd2f4a35d3293366f2eeb0a39e + checksum: b431700a5248563c0e1d03521b8262aad9adc46007159b2792569ff56e5b11cbaa555809b90765f291484dad726f2250270112943bcbd8a067608804d96fa3d5 languageName: node linkType: hard @@ -24505,12 +24603,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.6.2": - version: 7.6.2 - resolution: "semver@npm:7.6.2" +"semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 40f6a95101e8d854357a644da1b8dd9d93ce786d5c6a77227bc69dbb17bea83d0d1d1d7c4cd5920a6df909f48e8bd8a5909869535007f90278289f2451d0292d + checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 languageName: node linkType: hard @@ -24554,7 +24652,14 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:6.0.0, serialize-javascript@npm:^6.0.0": +"serialize-javascript@npm:^2.1.2": + version: 2.1.2 + resolution: "serialize-javascript@npm:2.1.2" + checksum: 16ce4e4886aff10d5cbbc46149cae3a63f31ea1578f218ef3a363ae413fa245dde61ab039f6733cc86db7b3ff940bfcba9b5a4bfc7b5dd1b3967737c0bbc017e + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.0": version: 6.0.0 resolution: "serialize-javascript@npm:6.0.0" dependencies: @@ -24563,10 +24668,12 @@ __metadata: languageName: node linkType: hard -"serialize-javascript@npm:^2.1.2": - version: 2.1.2 - resolution: "serialize-javascript@npm:2.1.2" - checksum: 16ce4e4886aff10d5cbbc46149cae3a63f31ea1578f218ef3a363ae413fa245dde61ab039f6733cc86db7b3ff940bfcba9b5a4bfc7b5dd1b3967737c0bbc017e +"serialize-javascript@npm:^6.0.2": + version: 6.0.2 + resolution: "serialize-javascript@npm:6.0.2" + dependencies: + randombytes: ^2.1.0 + checksum: c4839c6206c1d143c0f80763997a361310305751171dd95e4b57efee69b8f6edd8960a0b7fbfc45042aadff98b206d55428aee0dc276efe54f100899c7fa8ab7 languageName: node linkType: hard @@ -24629,6 +24736,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -24788,6 +24909,18 @@ __metadata: languageName: node linkType: hard +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -25490,7 +25623,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -25525,12 +25658,13 @@ __metadata: languageName: node linkType: hard -"sucrase@npm:^3.20.3": - version: 3.21.0 - resolution: "sucrase@npm:3.21.0" +"sucrase@npm:^3.35.0": + version: 3.35.0 + resolution: "sucrase@npm:3.35.0" dependencies: + "@jridgewell/gen-mapping": ^0.3.2 commander: ^4.0.0 - glob: 7.1.6 + glob: ^10.3.10 lines-and-columns: ^1.1.6 mz: ^2.7.0 pirates: ^4.0.1 @@ -25538,7 +25672,7 @@ __metadata: bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: d686f255af65bab2cb4e685287a7a4fe00f241a891a2ddea8c6218ff8f412780339d4d544e4a582e93e3994d1ebbe2fbce6a555474e80641958319a2b249e836 + checksum: 9fc5792a9ab8a14dcf9c47dcb704431d35c1cdff1d17d55d382a31c2e8e3063870ad32ce120a80915498486246d612e30cda44f1624d9d9a10423e1a43487ad1 languageName: node linkType: hard @@ -25568,13 +25702,6 @@ __metadata: languageName: node linkType: hard -"superstruct@npm:^1.0.3": - version: 1.0.3 - resolution: "superstruct@npm:1.0.3" - checksum: 761790bb111e6e21ddd608299c252f3be35df543263a7ebbc004e840d01fcf8046794c274bcb351bdf3eae4600f79d317d085cdbb19ca05803a4361840cc9bb1 - languageName: node - linkType: hard - "superstruct@npm:^1.0.4": version: 1.0.4 resolution: "superstruct@npm:1.0.4" @@ -25582,15 +25709,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:8.1.1, supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 - languageName: node - linkType: hard - "supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -25618,6 +25736,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.0.0, supports-color@npm:^8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -26305,23 +26432,25 @@ __metadata: languageName: node linkType: hard -"tsup@npm:^8.1.0": - version: 8.1.0 - resolution: "tsup@npm:8.1.0" +"tsup@npm:^8.2.3": + version: 8.2.3 + resolution: "tsup@npm:8.2.3" dependencies: - bundle-require: ^4.0.0 - cac: ^6.7.12 - chokidar: ^3.5.1 - debug: ^4.3.1 - esbuild: ^0.21.4 - execa: ^5.0.0 - globby: ^11.0.3 - joycon: ^3.0.1 - postcss-load-config: ^4.0.1 + bundle-require: ^5.0.0 + cac: ^6.7.14 + chokidar: ^3.6.0 + consola: ^3.2.3 + debug: ^4.3.5 + esbuild: ^0.23.0 + execa: ^5.1.1 + globby: ^11.1.0 + joycon: ^3.1.1 + picocolors: ^1.0.1 + postcss-load-config: ^6.0.1 resolve-from: ^5.0.0 - rollup: ^4.0.2 + rollup: ^4.19.0 source-map: 0.8.0-beta.0 - sucrase: ^3.20.3 + sucrase: ^3.35.0 tree-kill: ^1.2.2 peerDependencies: "@microsoft/api-extractor": ^7.36.0 @@ -26340,7 +26469,7 @@ __metadata: bin: tsup: dist/cli-default.js tsup-node: dist/cli-node.js - checksum: 15b759e01313f62edbf6900de547ba2942e15c49b3b699bafe0e544530072a548c0e52799861c2ff7322a1c2454dd013ace55695d5e95e8987e6003f28e9b0c0 + checksum: 432b1a51ae804429c48d52aed9d61c3867d3209bf13928607282a5c8664fe55193e18f76be62bd0908a4978eb894930f9429145b7c482ade3513f3c7a71d0977 languageName: node linkType: hard @@ -26433,6 +26562,13 @@ __metadata: languageName: node linkType: hard +"type-detect@npm:^4.1.0": + version: 4.1.0 + resolution: "type-detect@npm:4.1.0" + checksum: 3b32f873cd02bc7001b00a61502b7ddc4b49278aabe68d652f732e1b5d768c072de0bc734b427abf59d0520a5f19a2e07309ab921ef02018fa1cb4af155cdb37 + languageName: node + linkType: hard + "type-fest@npm:^0.11.0": version: 0.11.0 resolution: "type-fest@npm:0.11.0" @@ -26482,10 +26618,10 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^4.20.1": - version: 4.20.1 - resolution: "type-fest@npm:4.20.1" - checksum: 8cc8d86c900be4a803a4b252840b761153541f18b03c5bcc02fa2684d0237d48895cc675cd234049f110004d9ce63770242255c04890b85a133f72643c49e342 +"type-fest@npm:^4.23.0": + version: 4.23.0 + resolution: "type-fest@npm:4.23.0" + checksum: 75466563be2d3d116a0b70ffe76a7f72947e3350ceacbc8509a7d841670dddc2fbb008109f0307888137794cf25681fd50f65bf8873bcdc17bc7ac8912c70114 languageName: node linkType: hard @@ -26959,7 +27095,17 @@ __metadata: languageName: node linkType: hard -"url@npm:^0.11.3, url@npm:~0.11.0": +"url@npm:^0.11.4": + version: 0.11.4 + resolution: "url@npm:0.11.4" + dependencies: + punycode: ^1.4.1 + qs: ^6.12.3 + checksum: c25e587723d343d5d4248892393bfa5039ded9c2c07095a9d005bc64b7cb8956d623c0d8da8d1a28f71986a7a8d80fc2e9f9cf84235e48fa435a5cb4451062c6 + languageName: node + linkType: hard + +"url@npm:~0.11.0": version: 0.11.3 resolution: "url@npm:0.11.3" dependencies: @@ -27215,9 +27361,9 @@ __metadata: languageName: node linkType: hard -"vue-demi@npm:>=0.14.5": - version: 0.14.5 - resolution: "vue-demi@npm:0.14.5" +"vue-demi@npm:>=0.14.8": + version: 0.14.8 + resolution: "vue-demi@npm:0.14.8" peerDependencies: "@vue/composition-api": ^1.0.0-rc.1 vue: ^3.0.0-0 || ^2.6.0 @@ -27227,13 +27373,13 @@ __metadata: bin: vue-demi-fix: bin/vue-demi-fix.js vue-demi-switch: bin/vue-demi-switch.js - checksum: ff44b9372b8224590514252a2f73363cced6062205f9628a6b130dccb80e2023d55cd9d1da94aeb68d5539b7ea9eedcecf88ab281a3a9ff48b8db4c5366b9643 + checksum: e9ac4fd09dc1846cf840de34dc335dba810e5d47a488e66abc14102013ff2b2c13a4aa34c5f398a7c5e1ee1a40d0d52ef3901242487579f8caa0b410e8c7f4fb languageName: node linkType: hard -"vue-demi@npm:>=0.14.8": - version: 0.14.8 - resolution: "vue-demi@npm:0.14.8" +"vue-demi@npm:^0.13.11": + version: 0.13.11 + resolution: "vue-demi@npm:0.13.11" peerDependencies: "@vue/composition-api": ^1.0.0-rc.1 vue: ^3.0.0-0 || ^2.6.0 @@ -27243,13 +27389,13 @@ __metadata: bin: vue-demi-fix: bin/vue-demi-fix.js vue-demi-switch: bin/vue-demi-switch.js - checksum: e9ac4fd09dc1846cf840de34dc335dba810e5d47a488e66abc14102013ff2b2c13a4aa34c5f398a7c5e1ee1a40d0d52ef3901242487579f8caa0b410e8c7f4fb + checksum: 0fbe9bf8ab7fe498ffa2bbd0cfc8f6f43a6bbaa5eda3e20ef1b70dca7c8b0ddb216a7ff2f632b694fe0735805638975abb441c621ec0bd2e6d4656353f316c15 languageName: node linkType: hard -"vue-demi@npm:^0.13.11": - version: 0.13.11 - resolution: "vue-demi@npm:0.13.11" +"vue-demi@npm:^0.14.8": + version: 0.14.10 + resolution: "vue-demi@npm:0.14.10" peerDependencies: "@vue/composition-api": ^1.0.0-rc.1 vue: ^3.0.0-0 || ^2.6.0 @@ -27259,27 +27405,23 @@ __metadata: bin: vue-demi-fix: bin/vue-demi-fix.js vue-demi-switch: bin/vue-demi-switch.js - checksum: 0fbe9bf8ab7fe498ffa2bbd0cfc8f6f43a6bbaa5eda3e20ef1b70dca7c8b0ddb216a7ff2f632b694fe0735805638975abb441c621ec0bd2e6d4656353f316c15 + checksum: 9b4106f99be3b0c1dd4a6dc5725f5e8f79c6b98d1eeb849bf2c54416cd77f4aa344960b202768865245cfa82d57f49a9d96f67f5d8e256604b9dac1c5df9a8d6 languageName: node linkType: hard -"vue-echarts@npm:6.7.3": - version: 6.7.3 - resolution: "vue-echarts@npm:6.7.3" +"vue-echarts@npm:7.0.0-beta.0": + version: 7.0.0-beta.0 + resolution: "vue-echarts@npm:7.0.0-beta.0" dependencies: - resize-detector: ^0.3.0 vue-demi: ^0.13.11 peerDependencies: - "@vue/composition-api": ^1.0.5 "@vue/runtime-core": ^3.0.0 - echarts: ^5.4.1 - vue: ^2.6.12 || ^3.1.1 + echarts: ^5.5.1 + vue: ^2.7.0 || ^3.1.1 peerDependenciesMeta: - "@vue/composition-api": - optional: true "@vue/runtime-core": optional: true - checksum: 341ce3ad9313684aab62e7b54f8770d20ef3b902955d7f60530ad819dbc278c9bdf48c92844507064031f5a653c57b28c6cf2a928dc04da69835eda50fb48073 + checksum: bfddf0d83ce450f2583ef6cc75b4d3a4311e18d21e7ac692b1c88025b1cb33c70e5180373601553b14c6c732a9bf14cb6222666cab97b1fc98f5ab0a01dde044 languageName: node linkType: hard @@ -27337,14 +27479,14 @@ __metadata: languageName: node linkType: hard -"vue-router@npm:4.3.3": - version: 4.3.3 - resolution: "vue-router@npm:4.3.3" +"vue-router@npm:4.4.0": + version: 4.4.0 + resolution: "vue-router@npm:4.4.0" dependencies: "@vue/devtools-api": ^6.5.1 peerDependencies: vue: ^3.2.0 - checksum: fef0a8cb103de3273efd78b650a9910f6d88b0ced2cdc697bb9398eff0cc8ea9313a7872a57d2e8fc628ab45358cbb8080b5b3683c018d12b482f77fa1fc3d63 + checksum: 33b351cc140d1769193e326d77d2bf0fd9d0fd8b871cad848b6c73df0a6d3b7c8fec5657dbe45d7ad486a003033f3b2957e8b0adc9ae06b51cb129054cebb427 languageName: node linkType: hard @@ -27398,21 +27540,21 @@ __metadata: languageName: node linkType: hard -"vue@npm:^3.4.29": - version: 3.4.29 - resolution: "vue@npm:3.4.29" +"vue@npm:^3.4.34": + version: 3.4.34 + resolution: "vue@npm:3.4.34" dependencies: - "@vue/compiler-dom": 3.4.29 - "@vue/compiler-sfc": 3.4.29 - "@vue/runtime-dom": 3.4.29 - "@vue/server-renderer": 3.4.29 - "@vue/shared": 3.4.29 + "@vue/compiler-dom": 3.4.34 + "@vue/compiler-sfc": 3.4.34 + "@vue/runtime-dom": 3.4.34 + "@vue/server-renderer": 3.4.34 + "@vue/shared": 3.4.34 peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - checksum: e6b4f0e34084729818e9bdd7bb2927a72d2013d74d0322d2920f14c0db603592479cee20e8c88f1937eb734733ec027c5a2b73a4e89dad4e852bcb569cd58231 + checksum: badbf3a1eed2a62c0a5049171e98926ef073107cc2695d1d8432497ddd2782f6fea673d776167a8a8ba5bc45381d17ed4db2b2d4026397d7cd511c7d64721717 languageName: node linkType: hard @@ -28806,25 +28948,25 @@ __metadata: languageName: node linkType: hard -"which@npm:2.0.2, which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" +"which@npm:^1.2.9": + version: 1.3.1 + resolution: "which@npm:1.3.1" dependencies: isexe: ^2.0.0 bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + which: ./bin/which + checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 languageName: node linkType: hard -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" +"which@npm:^2.0.1, which@npm:^2.0.2": + version: 2.0.2 + resolution: "which@npm:2.0.2" dependencies: isexe: ^2.0.0 bin: - which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 languageName: node linkType: hard @@ -28908,17 +29050,10 @@ __metadata: languageName: node linkType: hard -"workerpool@npm:6.2.0": - version: 6.2.0 - resolution: "workerpool@npm:6.2.0" - checksum: 3493b4f0ef979a23d2c1583d7ef85f62fc9463cc02f82829d3e7e663b517f8ae9707da0249b382e46ac58986deb0ca2232ee1081713741211bda9254b429c9bb - languageName: node - linkType: hard - -"workerpool@npm:6.2.1": - version: 6.2.1 - resolution: "workerpool@npm:6.2.1" - checksum: c2c6eebbc5225f10f758d599a5c016fa04798bcc44e4c1dffb34050cd361d7be2e97891aa44419e7afe647b1f767b1dc0b85a5e046c409d890163f655028b09d +"workerpool@npm:^6.5.1": + version: 6.5.1 + resolution: "workerpool@npm:6.5.1" + checksum: f86d13f9139c3a57c5a5867e81905cd84134b499849405dec2ffe5b1acd30dabaa1809f6f6ee603a7c65e1e4325f21509db6b8398eaf202c8b8f5809e26a2e16 languageName: node linkType: hard @@ -29027,7 +29162,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.15.1, ws@npm:^8.16.0, ws@npm:^8.4.2, ws@npm:^8.5.0, ws@npm:^8.8.1": +"ws@npm:^8.16.0, ws@npm:^8.4.2, ws@npm:^8.5.0, ws@npm:^8.8.1": version: 8.16.0 resolution: "ws@npm:8.16.0" peerDependencies: @@ -29057,6 +29192,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.0": + version: 8.18.0 + resolution: "ws@npm:8.18.0" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 + languageName: node + linkType: hard + "xhr-request-promise@npm:^0.1.2": version: 0.1.3 resolution: "xhr-request-promise@npm:0.1.3" @@ -29189,15 +29339,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.3.4": - version: 2.4.0 - resolution: "yaml@npm:2.4.0" - bin: - yaml: bin.mjs - checksum: 3c25ebae34ee702af772ebbd1855a980b1487cd21d6220d952592edb4f7d89322aafd14753d99924ba7076eb4c5b3d809c64bb532402b01af280f7af674277f1 - languageName: node - linkType: hard - "yamljs@npm:^0.3.0": version: 0.3.0 resolution: "yamljs@npm:0.3.0" @@ -29211,13 +29352,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:20.2.4": - version: 20.2.4 - resolution: "yargs-parser@npm:20.2.4" - checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 - languageName: node - linkType: hard - "yargs-parser@npm:^2.4.1": version: 2.4.1 resolution: "yargs-parser@npm:2.4.1" @@ -29228,7 +29362,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2": +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.9": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 @@ -29242,7 +29376,7 @@ __metadata: languageName: node linkType: hard -"yargs-unparser@npm:2.0.0": +"yargs-unparser@npm:^2.0.0": version: 2.0.0 resolution: "yargs-unparser@npm:2.0.0" dependencies: @@ -29254,7 +29388,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:16.2.0, yargs@npm:^16.0.0, yargs@npm:^16.2.0": +"yargs@npm:^16.0.0, yargs@npm:^16.2.0": version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: @@ -29370,12 +29504,12 @@ __metadata: languageName: node linkType: hard -"zrender@npm:5.5.0": - version: 5.5.0 - resolution: "zrender@npm:5.5.0" +"zrender@npm:5.6.0": + version: 5.6.0 + resolution: "zrender@npm:5.6.0" dependencies: tslib: 2.3.0 - checksum: 89e4f9e95b586af66ebf5c0504d5f8da73678e18c5b888124943ca81ecea7cff12f23009d64048df91e4dc670e9c51fa66c357834d9347e367f3b5cc02a24d35 + checksum: 58875a8ed8b813c739f6b6e727eb5eead39b66278143ff231cdd270349a5743af034f7f20567c7895eecb1cadbdae499e17708d96f1faae958ad3acdb3d46687 languageName: node linkType: hard From 958e59e5953d34d3a6cbe137f103623f2d86d20c Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 31 Jul 2024 15:22:40 -0700 Subject: [PATCH 218/375] devop: solana tokens --- packages/extension/package.json | 2 + .../src/libs/keyring/public-keyring.ts | 10 + .../libs/assets-handlers/assetinfo-mew.ts | 19 +- .../libs/assets-handlers/solanachain.ts | 58 ++++ .../libs/assets-handlers/token-lists.ts | 6 +- .../libs/assets-handlers/tomochain.ts | 2 +- .../assets-handlers/types/tokenbalance-mew.ts | 3 +- .../src/providers/solana/libs/api.ts | 41 ++- .../src/providers/solana/networks/solana.ts | 6 +- .../src/providers/solana/types/sol-network.ts | 79 +++-- .../src/providers/solana/types/sol-token.ts | 2 +- packages/types/src/networks.ts | 1 + yarn.lock | 302 +++++++++++++++++- 13 files changed, 485 insertions(+), 46 deletions(-) create mode 100644 packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts diff --git a/packages/extension/package.json b/packages/extension/package.json index 211835aff..506c44793 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -38,6 +38,8 @@ "@ledgerhq/hw-transport-webusb": "^6.29.2", "@metamask/eth-sig-util": "^7.0.3", "@rollup/plugin-replace": "^5.0.7", + "@solana/spl-token": "^0.4.8", + "@solana/web3.js": "^1.95.2", "@types/chrome": "^0.0.269", "@types/events": "^3.0.3", "@types/less": "^3.0.6", diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index c9a2048e8..a815015e8 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -77,6 +77,16 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; + allKeys["7VHUFJHWu2CuExkJcJrzhQPJ2oygupTWkL2A2For4BmE"] = { + address: "7VHUFJHWu2CuExkJcJrzhQPJ2oygupTWkL2A2For4BmE", + basePath: "m/501'/2'/0'/1", + name: "fake sol account #1", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.ed25519sol, + walletType: WalletType.mnemonic, + isHardware: false, + }; } return allKeys; } diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..7e9a738cf 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -21,6 +21,7 @@ import { getKnownNetworkTokens } from "./token-lists"; import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; import { NATIVE_TOKEN_ADDRESS } from "../common"; import getTomoBalances from "./tomochain"; +import getSolBalances from "./solanachain"; import { CoinGeckoTokenMarket } from "@/libs/market-data/types"; const API_ENPOINT = "https://tokenbalance.mewapi.io/"; @@ -135,14 +136,21 @@ const supportedNetworks: Record = { tbName: "degen", cgPlatform: CoingeckoPlatform.Degen, }, + [NetworkNames.Solana]: { + tbName: "", + cgPlatform: CoingeckoPlatform.Solana, + }, }; const getTokens = ( - chain: SupportedNetworkNames, + network: BaseNetwork, address: string ): Promise => { + const chain = network.name as SupportedNetworkNames; if (chain === NetworkNames.TomoChain) { return getTomoBalances(chain, address); + } else if (chain === NetworkNames.Solana) { + return getSolBalances(network, address); } let url = ""; if (chain === NetworkNames.Ethereum || chain === NetworkNames.Binance) @@ -178,7 +186,7 @@ export default ( if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("TOKENBALANCE-MEW: network not supported"); const networkName = network.name as SupportedNetworkNames; - return getTokens(networkName, address).then(async (tokens) => { + return getTokens(network, address).then(async (tokens) => { const balances: Record = tokens.reduce( (obj, cur) => ({ ...obj, [cur.contract]: cur }), {} @@ -197,6 +205,7 @@ export default ( (obj, cur) => ({ ...obj, [cur.contract]: null }), {} as Record ); + console.log(marketInfo); if (network.coingeckoID) { const nativeMarket = await marketData.getMarketData([ network.coingeckoID, @@ -224,11 +233,11 @@ export default ( const tokenInfo: Record = await getKnownNetworkTokens( network.name ); - + console.log(tokenInfo); tokenInfo[NATIVE_TOKEN_ADDRESS] = { chainId: (network as EvmNetwork).chainID, name: network.name_long, - decimals: 18, + decimals: network.decimals, address: NATIVE_TOKEN_ADDRESS, logoURI: network.icon, symbol: network.currencyName, @@ -237,6 +246,7 @@ export default ( const unknownTokens: string[] = []; let nativeAsset: AssetsType | null = null; for (const [address, market] of Object.entries(marketInfo)) { + console.log(address, market, tokenInfo[address]); if (market && tokenInfo[address]) { const userBalance = fromBase( balances[address].balance, @@ -279,6 +289,7 @@ export default ( const promises = unknownTokens.map((t) => api.getTokenInfo(t)); await Promise.all(promises).then((tokenMeta) => { tokenMeta.forEach((tInfo, idx) => { + if (tInfo.symbol === "UNKNWN") return; const userBalance = fromBase( balances[unknownTokens[idx]].balance, tInfo.decimals diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts new file mode 100644 index 000000000..babb42ba5 --- /dev/null +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts @@ -0,0 +1,58 @@ +import { TokenBalance } from "./types/tokenbalance-mew"; +import { NATIVE_TOKEN_ADDRESS } from "../common"; +import { numberToHex } from "@enkryptcom/utils"; +import { BaseNetwork } from "@/types/base-network"; +import { + Connection, + GetProgramAccountsFilter, + PublicKey, +} from "@solana/web3.js"; +import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { BNType } from "@/providers/common/types"; +import { toBN } from "web3-utils"; + +const getBalances = (network: BaseNetwork, address: string) => { + const solConnection = new Connection(network.node); + const filters: GetProgramAccountsFilter[] = [ + { + dataSize: 165, + }, + { + memcmp: { + offset: 32, + bytes: address, + }, + }, + ]; + return solConnection + .getParsedProgramAccounts(TOKEN_PROGRAM_ID, { filters: filters }) + .then((accounts) => { + const balances: TokenBalance[] = []; + const balanceObj = {} as Record; + accounts.forEach((acc) => { + const balance = numberToHex( + (acc.account.data as any).parsed.info.tokenAmount.amount + ); + const contract = (acc.account.data as any).parsed.info.mint; + if (!balanceObj[contract]) balanceObj[contract] = toBN(0); + balanceObj[contract] = balanceObj[contract].add(toBN(balance)); + }); + Object.keys(balanceObj).forEach((contract) => { + balances.push({ + balance: numberToHex(balanceObj[contract]), + contract, + }); + }); + return solConnection + .getBalance(new PublicKey(address)) + .then((balance) => { + balances.unshift({ + balance: numberToHex(balance), + contract: NATIVE_TOKEN_ADDRESS, + }); + return balances; + }); + }); +}; + +export default getBalances; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..6e38d2c0a 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -30,6 +30,7 @@ const TokenList: Record = { [NetworkNames.Blast]: `https://tokens.coingecko.com/${CoingeckoPlatform.Blast}/all.json`, [NetworkNames.Sanko]: `https://tokens.coingecko.com/${CoingeckoPlatform.Sanko}/all.json`, [NetworkNames.Degen]: `https://tokens.coingecko.com/${CoingeckoPlatform.Degen}/all.json`, + [NetworkNames.Solana]: `https://tokens.coingecko.com/${CoingeckoPlatform.Solana}/all.json`, }; const getKnownNetworkTokens = async ( @@ -46,7 +47,10 @@ const getKnownNetworkTokens = async ( const tokens: CGToken[] = json.tokens; const tObject: Record = {}; tokens.forEach((t) => { - t.address = t.address.toLowerCase(); + t.address = + networkName !== NetworkNames.Solana + ? t.address.toLowerCase() + : t.address; tObject[t.address] = t; }); return tObject; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/tomochain.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/tomochain.ts index 064e1968a..ea20a2a56 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/tomochain.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/tomochain.ts @@ -1,6 +1,6 @@ import { SupportedNetworkNames, TokenBalance } from "./types/tokenbalance-mew"; import { NATIVE_TOKEN_ADDRESS } from "../common"; -import { numberToHex } from "web3-utils"; +import { numberToHex } from "@enkryptcom/utils"; interface TokenBalanceType { token: string; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..9a8130872 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -52,4 +52,5 @@ export type SupportedNetworkNames = | NetworkNames.Rollux | NetworkNames.Sanko | NetworkNames.Degen - | NetworkNames.Blast; + | NetworkNames.Blast + | NetworkNames.Solana; diff --git a/packages/extension/src/providers/solana/libs/api.ts b/packages/extension/src/providers/solana/libs/api.ts index 5abc5900d..62b7a2916 100644 --- a/packages/extension/src/providers/solana/libs/api.ts +++ b/packages/extension/src/providers/solana/libs/api.ts @@ -1,12 +1,18 @@ import { SOLRawInfo } from "@/types/activity"; import { ProviderAPIInterface } from "@/types/provider"; import { getAddress as getSolAddress } from "../types/sol-network"; +import { Connection, PublicKey } from "@solana/web3.js"; +import { numberToHex } from "@enkryptcom/utils"; +import { ERC20TokenInfo } from "@/providers/ethereum/types"; +import cacheFetch from "@/libs/cache-fetch"; class API implements ProviderAPIInterface { node: string; + web3: Connection; constructor(node: string) { this.node = node; + this.web3 = new Connection(this.node); } public get api() { @@ -22,12 +28,43 @@ class API implements ProviderAPIInterface { return null; } async getBalance(pubkey: string): Promise { - console.log(pubkey, "getbalance"); - return "0"; + const balance = await this.web3.getBalance( + new PublicKey(this.getAddress(pubkey)) + ); + return numberToHex(balance); } async broadcastTx(rawtx: string): Promise { console.log(rawtx, "broadcasttx"); return true; } + getTokenInfo = async (contractAddress: string): Promise => { + const allTokensResponse = await cacheFetch( + { + url: "https://utl.solcast.dev/solana-tokenlist.json", + }, + 10 * 60 * 1000 + ); + const allTokens = allTokensResponse.tokens as { + address: string; + decimals: number; + name: string; + symbol: string; + }[]; + for (const t of allTokens) { + if (t.address === contractAddress) { + console.log(t, contractAddress); + return { + name: t.name, + symbol: t.symbol, + decimals: t.decimals, + }; + } + } + return { + name: "Unknown", + symbol: "UNKNWN", + decimals: 9, + }; + }; } export default API; diff --git a/packages/extension/src/providers/solana/networks/solana.ts b/packages/extension/src/providers/solana/networks/solana.ts index e5a2cc12b..9e9098465 100644 --- a/packages/extension/src/providers/solana/networks/solana.ts +++ b/packages/extension/src/providers/solana/networks/solana.ts @@ -1,6 +1,7 @@ import { NetworkNames } from "@enkryptcom/types"; import { SolanaNetwork, SolanaNetworkOptions } from "../types/sol-network"; import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; const solanaOptions: SolanaNetworkOptions = { name: NetworkNames.Solana, @@ -12,11 +13,12 @@ const solanaOptions: SolanaNetworkOptions = { currencyName: "SOL", currencyNameLong: "Solana", icon: require("./icons/sol.svg"), - decimals: 8, - node: "https://node.mewapi.io/ws/sol", + decimals: 9, + node: "https://nodes.mewapi.io/rpc/sol", coingeckoID: "solana", activityHandler: wrapActivityHandler(() => Promise.resolve([])), basePath: "m/44'/501'", + assetsInfoHandler, }; const bitcoin = new SolanaNetwork(solanaOptions); diff --git a/packages/extension/src/providers/solana/types/sol-network.ts b/packages/extension/src/providers/solana/types/sol-network.ts index 25366a41c..1161c5955 100644 --- a/packages/extension/src/providers/solana/types/sol-network.ts +++ b/packages/extension/src/providers/solana/types/sol-network.ts @@ -18,6 +18,7 @@ import { SOLToken } from "./sol-token"; import { NFTCollection } from "@/types/nft"; import { fromBase, hexToBuffer } from "@enkryptcom/utils"; import bs58 from "bs58"; +import getBalances from "@/providers/ethereum/libs/assets-handlers/solanachain"; export interface SolanaNetworkOptions { name: NetworkNames; @@ -41,9 +42,14 @@ export interface SolanaNetworkOptions { network: BaseNetwork, address: string ) => Promise; + assetsInfoHandler?: ( + network: BaseNetwork, + address: string + ) => Promise; } export const getAddress = (pubkey: string) => { + if (pubkey.length === 44) return pubkey; return bs58.encode(hexToBuffer(pubkey)); }; @@ -57,6 +63,10 @@ export class SolanaNetwork extends BaseNetwork { network: BaseNetwork, address: string ) => Promise; + assetsInfoHandler?: ( + network: BaseNetwork, + address: string + ) => Promise; constructor(options: SolanaNetworkOptions) { const api = async () => { const api = new SolAPI(options.node); @@ -75,6 +85,7 @@ export class SolanaNetwork extends BaseNetwork { super(baseOptions); this.activityHandler = options.activityHandler; this.NFTHandler = options.NFTHandler; + this.assetsInfoHandler = options.assetsInfoHandler; } public async getAllTokens(pubkey: string): Promise { @@ -94,38 +105,44 @@ export class SolanaNetwork extends BaseNetwork { } public async getAllTokenInfo(pubkey: string): Promise { - const balance = await (await this.api()).getBalance(pubkey); - let marketData: (CoinGeckoTokenMarket | null)[] = []; - if (this.coingeckoID) { - const market = new MarketData(); - marketData = await market.getMarketData([this.coingeckoID]); + if (this.assetsInfoHandler) { + return this.assetsInfoHandler(this, getAddress(pubkey)); + } else { + const balance = await (await this.api()).getBalance(pubkey); + let marketData: (CoinGeckoTokenMarket | null)[] = []; + if (this.coingeckoID) { + const market = new MarketData(); + marketData = await market.getMarketData([this.coingeckoID]); + } + const userBalance = fromBase(balance, this.decimals); + const usdBalance = new BigNumber(userBalance).times( + marketData.length ? marketData[0]!.current_price : 0 + ); + const nativeAsset: AssetsType = { + balance: balance, + balancef: formatFloatingPointValue(userBalance).value, + balanceUSD: usdBalance.toNumber(), + balanceUSDf: formatFiatValue(usdBalance.toString()).value, + icon: this.icon, + name: this.name_long, + symbol: this.currencyName, + value: marketData.length + ? marketData[0]!.current_price.toString() + : "0", + valuef: formatFiatValue( + marketData.length ? marketData[0]!.current_price.toString() : "0" + ).value, + contract: "", + decimals: this.decimals, + sparkline: marketData.length + ? new Sparkline(marketData[0]!.sparkline_in_7d.price, 25).dataValues + : "", + priceChangePercentage: marketData.length + ? marketData[0]!.price_change_percentage_7d_in_currency + : 0, + }; + return [nativeAsset]; } - const userBalance = fromBase(balance, this.decimals); - const usdBalance = new BigNumber(userBalance).times( - marketData.length ? marketData[0]!.current_price : 0 - ); - const nativeAsset: AssetsType = { - balance: balance, - balancef: formatFloatingPointValue(userBalance).value, - balanceUSD: usdBalance.toNumber(), - balanceUSDf: formatFiatValue(usdBalance.toString()).value, - icon: this.icon, - name: this.name_long, - symbol: this.currencyName, - value: marketData.length ? marketData[0]!.current_price.toString() : "0", - valuef: formatFiatValue( - marketData.length ? marketData[0]!.current_price.toString() : "0" - ).value, - contract: "", - decimals: this.decimals, - sparkline: marketData.length - ? new Sparkline(marketData[0]!.sparkline_in_7d.price, 25).dataValues - : "", - priceChangePercentage: marketData.length - ? marketData[0]!.price_change_percentage_7d_in_currency - : 0, - }; - return [nativeAsset]; } public getAllActivity(address: string): Promise { return this.activityHandler(this, address); diff --git a/packages/extension/src/providers/solana/types/sol-token.ts b/packages/extension/src/providers/solana/types/sol-token.ts index 296e08103..1d20938d5 100644 --- a/packages/extension/src/providers/solana/types/sol-token.ts +++ b/packages/extension/src/providers/solana/types/sol-token.ts @@ -14,6 +14,6 @@ export class SOLToken extends BaseToken { } public async send(): Promise { - throw new Error("EVM-send is not implemented here"); + throw new Error("sol-send is not implemented here"); } } diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 6aa1b9b2a..602d672e7 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -124,4 +124,5 @@ export enum CoingeckoPlatform { Blast = "blast", Sanko = "sanko", Degen = "degen", + Solana = "solana", } diff --git a/yarn.lock b/yarn.lock index c7f161b77..debac56a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1674,7 +1674,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.25.0": +"@babel/runtime@npm:^7.24.8, @babel/runtime@npm:^7.25.0": version: 7.25.0 resolution: "@babel/runtime@npm:7.25.0" dependencies: @@ -2792,6 +2792,8 @@ __metadata: "@rollup/plugin-node-resolve": ^15.2.3 "@rollup/plugin-replace": ^5.0.7 "@rollup/plugin-typescript": ^11.1.6 + "@solana/spl-token": ^0.4.8 + "@solana/web3.js": ^1.95.2 "@types/bs58": ^4.0.4 "@types/chrome": ^0.0.269 "@types/ethereumjs-abi": ^0.6.5 @@ -6142,7 +6144,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:1.4.2": +"@noble/curves@npm:1.4.2, @noble/curves@npm:^1.4.2": version: 1.4.2 resolution: "@noble/curves@npm:1.4.2" dependencies: @@ -7591,6 +7593,202 @@ __metadata: languageName: node linkType: hard +"@solana/codecs-core@npm:2.0.0-preview.2": + version: 2.0.0-preview.2 + resolution: "@solana/codecs-core@npm:2.0.0-preview.2" + dependencies: + "@solana/errors": 2.0.0-preview.2 + checksum: 7b618645d61cc7ef7ed0da00deb852f282ef8eaa8de5070a86523fdb1c3dec8e0a93c3989038056e088ea00e07ed5fd93f0f325d86f1961767310ad227e17871 + languageName: node + linkType: hard + +"@solana/codecs-core@npm:2.0.0-preview.4": + version: 2.0.0-preview.4 + resolution: "@solana/codecs-core@npm:2.0.0-preview.4" + dependencies: + "@solana/errors": 2.0.0-preview.4 + peerDependencies: + typescript: ">=5" + checksum: 5dca4b46b0380153494620353208eebdbaefab8702c6fd8aa82738c5ba6832ec54d02035a339c4972e1996bd7796a4c08c39d678d82d96a558991989467d7a6d + languageName: node + linkType: hard + +"@solana/codecs-data-structures@npm:2.0.0-preview.2": + version: 2.0.0-preview.2 + resolution: "@solana/codecs-data-structures@npm:2.0.0-preview.2" + dependencies: + "@solana/codecs-core": 2.0.0-preview.2 + "@solana/codecs-numbers": 2.0.0-preview.2 + "@solana/errors": 2.0.0-preview.2 + checksum: 6cad16fa2fd17f22f1cee191a96c2ed85d809587c87e9191ef12c5e928512e69a065bb573264d93f6c11565b0e1a6541f961216502a4336636445d1c6d949559 + languageName: node + linkType: hard + +"@solana/codecs-data-structures@npm:2.0.0-preview.4": + version: 2.0.0-preview.4 + resolution: "@solana/codecs-data-structures@npm:2.0.0-preview.4" + dependencies: + "@solana/codecs-core": 2.0.0-preview.4 + "@solana/codecs-numbers": 2.0.0-preview.4 + "@solana/errors": 2.0.0-preview.4 + peerDependencies: + typescript: ">=5" + checksum: 1af74509e91bfc1492e44ebb0e21cf8a5e59f77b4a78fdabd1b76beef01c243d1f987c7f6773ada1063c21b97b598107a0c8d7191eee23a58304ba5b57f05453 + languageName: node + linkType: hard + +"@solana/codecs-numbers@npm:2.0.0-preview.2": + version: 2.0.0-preview.2 + resolution: "@solana/codecs-numbers@npm:2.0.0-preview.2" + dependencies: + "@solana/codecs-core": 2.0.0-preview.2 + "@solana/errors": 2.0.0-preview.2 + checksum: 9f132a8ed54d31548437c0e337e3f3e2a076b3081cd7652c0e5fca16416cf0b3265744f206495bd3761c53bad7542c4f08e6ab02688660f355705b63df981f97 + languageName: node + linkType: hard + +"@solana/codecs-numbers@npm:2.0.0-preview.4": + version: 2.0.0-preview.4 + resolution: "@solana/codecs-numbers@npm:2.0.0-preview.4" + dependencies: + "@solana/codecs-core": 2.0.0-preview.4 + "@solana/errors": 2.0.0-preview.4 + peerDependencies: + typescript: ">=5" + checksum: f7eb51b70a277ed096c9259b943c7ad50fb82dd8ce81b3262a22e8501774e3237fa0b6367221834dad2c16a75ec47bfd7a30d9f99d0c84325e7f2220f11bade4 + languageName: node + linkType: hard + +"@solana/codecs-strings@npm:2.0.0-preview.2": + version: 2.0.0-preview.2 + resolution: "@solana/codecs-strings@npm:2.0.0-preview.2" + dependencies: + "@solana/codecs-core": 2.0.0-preview.2 + "@solana/codecs-numbers": 2.0.0-preview.2 + "@solana/errors": 2.0.0-preview.2 + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + checksum: 0df48a64ac2baa92c4c671380a4c506dd6ceec0c326c2bc59485298813e2fa659ceeb6fb26ef95be5a15b5b18262d33fde4520f09fe73b5d90da6abbd9e0a3a0 + languageName: node + linkType: hard + +"@solana/codecs-strings@npm:2.0.0-preview.4": + version: 2.0.0-preview.4 + resolution: "@solana/codecs-strings@npm:2.0.0-preview.4" + dependencies: + "@solana/codecs-core": 2.0.0-preview.4 + "@solana/codecs-numbers": 2.0.0-preview.4 + "@solana/errors": 2.0.0-preview.4 + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ">=5" + checksum: 979503d4964acb6d6a28b2465949b16e308f173960f0ead45ab87107c900c3aa54d6b81fe27aa6076392b9fa8d5d1e74211fd132648ebe3dfe96c9877726a3e8 + languageName: node + linkType: hard + +"@solana/codecs@npm:2.0.0-preview.2": + version: 2.0.0-preview.2 + resolution: "@solana/codecs@npm:2.0.0-preview.2" + dependencies: + "@solana/codecs-core": 2.0.0-preview.2 + "@solana/codecs-data-structures": 2.0.0-preview.2 + "@solana/codecs-numbers": 2.0.0-preview.2 + "@solana/codecs-strings": 2.0.0-preview.2 + "@solana/options": 2.0.0-preview.2 + checksum: 33e12e2d4d56b6f2623443043093122775f19f5ddc266a89d447c19ed2f2e3f9cffe4385f05d889a496eb06205cebc33db646058fb63ea3f85a8e561c4441708 + languageName: node + linkType: hard + +"@solana/codecs@npm:2.0.0-preview.4": + version: 2.0.0-preview.4 + resolution: "@solana/codecs@npm:2.0.0-preview.4" + dependencies: + "@solana/codecs-core": 2.0.0-preview.4 + "@solana/codecs-data-structures": 2.0.0-preview.4 + "@solana/codecs-numbers": 2.0.0-preview.4 + "@solana/codecs-strings": 2.0.0-preview.4 + "@solana/options": 2.0.0-preview.4 + peerDependencies: + typescript: ">=5" + checksum: fea7d819c374dc5726faabd648726c0024479d4f6a9802fca85702118087353c0a21deff1da3ad0be6f047f1a1c60be42330f373a6c2f4232973826672f4b40e + languageName: node + linkType: hard + +"@solana/errors@npm:2.0.0-preview.2": + version: 2.0.0-preview.2 + resolution: "@solana/errors@npm:2.0.0-preview.2" + dependencies: + chalk: ^5.3.0 + commander: ^12.0.0 + bin: + errors: bin/cli.js + checksum: b93bdc42f039dfcd88d091cdf3d7f11bffcbb673797cd9ac54b89081a62f59ea04b4d7c0c9e80e532f6209c05d0a0b715e61f5ed3748f3d47a421f3d6a70e31c + languageName: node + linkType: hard + +"@solana/errors@npm:2.0.0-preview.4": + version: 2.0.0-preview.4 + resolution: "@solana/errors@npm:2.0.0-preview.4" + dependencies: + chalk: ^5.3.0 + commander: ^12.1.0 + peerDependencies: + typescript: ">=5" + bin: + errors: bin/cli.mjs + checksum: e7e4b3a3957b675f0e2471f4fc48220d90094b24eef16196668372d2a223dc36b42434d87a36dc46583ef96e8ebe9d6030b4beca2fe03663d41d6d7e696e8aa9 + languageName: node + linkType: hard + +"@solana/options@npm:2.0.0-preview.2": + version: 2.0.0-preview.2 + resolution: "@solana/options@npm:2.0.0-preview.2" + dependencies: + "@solana/codecs-core": 2.0.0-preview.2 + "@solana/codecs-numbers": 2.0.0-preview.2 + checksum: 63875f73174e38e40d0f6d5349ad590b38dd3821455886f5ba7b9ff6e6359114bb99e0b72ae0eb7362fec083dfb383817feebefd357e4f88d40cdded2b1a3676 + languageName: node + linkType: hard + +"@solana/options@npm:2.0.0-preview.4": + version: 2.0.0-preview.4 + resolution: "@solana/options@npm:2.0.0-preview.4" + dependencies: + "@solana/codecs-core": 2.0.0-preview.4 + "@solana/codecs-data-structures": 2.0.0-preview.4 + "@solana/codecs-numbers": 2.0.0-preview.4 + "@solana/codecs-strings": 2.0.0-preview.4 + "@solana/errors": 2.0.0-preview.4 + peerDependencies: + typescript: ">=5" + checksum: d6da97a14bedb4a7a560f743f5715dc23268beb096de534bfe32a31535b3767383e9f4a8c5728b6160c614370f3cbc2cdc144853bf99a50f4db6a9b394a89d06 + languageName: node + linkType: hard + +"@solana/spl-token-group@npm:^0.0.5": + version: 0.0.5 + resolution: "@solana/spl-token-group@npm:0.0.5" + dependencies: + "@solana/codecs": 2.0.0-preview.4 + "@solana/spl-type-length-value": 0.1.0 + peerDependencies: + "@solana/web3.js": ^1.94.0 + checksum: 0bfe93e4674d3dcbdc547bebf49b1ff8f9a10d62d067d8a360f8618f4226eed7c26691cfa51fee8cff1ef3828bd929e2152b178144d8b2185102108fcd5c2646 + languageName: node + linkType: hard + +"@solana/spl-token-metadata@npm:^0.1.3": + version: 0.1.4 + resolution: "@solana/spl-token-metadata@npm:0.1.4" + dependencies: + "@solana/codecs": 2.0.0-preview.2 + "@solana/spl-type-length-value": 0.1.0 + peerDependencies: + "@solana/web3.js": ^1.91.6 + checksum: 974969ce59a184f17e8d2f6aa98a118154ec042e9efa41a7b8ad33aecff8234d0a1161573807a59ab9e9d3557d8438b0b78f785cfc481f038900337f73523b02 + languageName: node + linkType: hard + "@solana/spl-token@npm:^0.3.7": version: 0.3.8 resolution: "@solana/spl-token@npm:0.3.8" @@ -7604,6 +7802,30 @@ __metadata: languageName: node linkType: hard +"@solana/spl-token@npm:^0.4.8": + version: 0.4.8 + resolution: "@solana/spl-token@npm:0.4.8" + dependencies: + "@solana/buffer-layout": ^4.0.0 + "@solana/buffer-layout-utils": ^0.2.0 + "@solana/spl-token-group": ^0.0.5 + "@solana/spl-token-metadata": ^0.1.3 + buffer: ^6.0.3 + peerDependencies: + "@solana/web3.js": ^1.94.0 + checksum: 85c48b2baee93ec70f688e5c3460de2974845bc513953f26be851a1a9d074926095661b5247f7de756cbaaeb42b10e6bb2ae73743fc2a5137e50ae25f471ab7e + languageName: node + linkType: hard + +"@solana/spl-type-length-value@npm:0.1.0": + version: 0.1.0 + resolution: "@solana/spl-type-length-value@npm:0.1.0" + dependencies: + buffer: ^6.0.3 + checksum: 9bea6d9638fd2093db4542b12ac657407950737bd00ed919448308df59bfeb9d97a96e471d7824ba4077daeb01bbb0cf9e410d412767555e49a5bfc6bfb9bc91 + languageName: node + linkType: hard + "@solana/web3.js@npm:1.77.3": version: 1.77.3 resolution: "@solana/web3.js@npm:1.77.3" @@ -7673,6 +7895,29 @@ __metadata: languageName: node linkType: hard +"@solana/web3.js@npm:^1.95.2": + version: 1.95.2 + resolution: "@solana/web3.js@npm:1.95.2" + dependencies: + "@babel/runtime": ^7.24.8 + "@noble/curves": ^1.4.2 + "@noble/hashes": ^1.4.0 + "@solana/buffer-layout": ^4.0.1 + agentkeepalive: ^4.5.0 + bigint-buffer: ^1.1.5 + bn.js: ^5.2.1 + borsh: ^0.7.0 + bs58: ^4.0.1 + buffer: 6.0.3 + fast-stable-stringify: ^1.0.0 + jayson: ^4.1.1 + node-fetch: ^2.7.0 + rpc-websockets: ^9.0.2 + superstruct: ^2.0.2 + checksum: 1d06e929a2d4c7bcb9d5155122d49f01f6baff0cd1f0fe8f21d75d077e44354fb9a87c1eba93dce63993acbbba4c8f4c03219f77ff6fa91b3c7c49d6b32eda33 + languageName: node + linkType: hard + "@stablelib/aead@npm:^1.0.1": version: 1.0.1 resolution: "@stablelib/aead@npm:1.0.1" @@ -13366,6 +13611,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^12.0.0, commander@npm:^12.1.0": + version: 12.1.0 + resolution: "commander@npm:12.1.0" + checksum: 68e9818b00fc1ed9cdab9eb16905551c2b768a317ae69a5e3c43924c2b20ac9bb65b27e1cab36aeda7b6496376d4da908996ba2c0b5d79463e0fb1e77935d514 + languageName: node + linkType: hard + "commander@npm:^2.15.0, commander@npm:^2.19.0, commander@npm:^2.20.0, commander@npm:^2.20.3": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -18817,6 +19069,28 @@ __metadata: languageName: node linkType: hard +"jayson@npm:^4.1.1": + version: 4.1.1 + resolution: "jayson@npm:4.1.1" + dependencies: + "@types/connect": ^3.4.33 + "@types/node": ^12.12.54 + "@types/ws": ^7.4.4 + JSONStream: ^1.3.5 + commander: ^2.20.3 + delay: ^5.0.0 + es6-promisify: ^5.0.0 + eyes: ^0.1.8 + isomorphic-ws: ^4.0.1 + json-stringify-safe: ^5.0.1 + uuid: ^8.3.2 + ws: ^7.5.10 + bin: + jayson: bin/jayson.js + checksum: 3a0f94f6548d5f6c366a9e6791129f2e19697ea09c2c37e9112b1a19902802aca8375b024b6b7a1e0465521f9fe6f06723258a6aac685290ce3761d92ea61e0a + languageName: node + linkType: hard + "jest-diff@npm:^27.5.1": version: 27.5.1 resolution: "jest-diff@npm:27.5.1" @@ -24311,7 +24585,7 @@ __metadata: languageName: node linkType: hard -"rpc-websockets@npm:^9.0.0": +"rpc-websockets@npm:^9.0.0, rpc-websockets@npm:^9.0.2": version: 9.0.2 resolution: "rpc-websockets@npm:9.0.2" dependencies: @@ -25737,6 +26011,13 @@ __metadata: languageName: node linkType: hard +"superstruct@npm:^2.0.2": + version: 2.0.2 + resolution: "superstruct@npm:2.0.2" + checksum: a5f75b72cb8b14b86f4f7f750dae8c5ab0e4e1d92414b55e7625bae07bbcafad81c92486e7e32ccacd6ae1f553caff2b92a50ff42ad5093fd35b9cb7f4e5ec86 + languageName: node + linkType: hard + "supports-color@npm:^5.3.0, supports-color@npm:^5.5.0": version: 5.5.0 resolution: "supports-color@npm:5.5.0" @@ -29190,6 +29471,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.5.10": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb + languageName: node + linkType: hard + "ws@npm:^8.16.0, ws@npm:^8.4.2, ws@npm:^8.5.0, ws@npm:^8.8.1": version: 8.16.0 resolution: "ws@npm:8.16.0" From 7e8d6ecc3743c7029134ed5dc8910c2455ee04bc Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 31 Jul 2024 17:40:08 -0700 Subject: [PATCH 219/375] devop: solana send screen --- .../extension/src/libs/cache-fetch/index.ts | 7 +- .../extension/src/libs/cache-fetch/types.ts | 1 + .../nft-select-list/index.vue | 3 +- .../libs/assets-handlers/assetinfo-mew.ts | 3 - .../extension/src/providers/solana/index.ts | 5 +- .../extension/src/providers/solana/inject.ts | 6 +- .../solana/libs/accounts-state/index.ts | 2 +- .../solana/libs/accounts-state/types.ts | 2 +- .../src/providers/solana/libs/api.ts | 38 +- .../providers/solana/libs/message-router.ts | 20 - .../src/providers/solana/libs/utils.ts | 105 +-- .../solana/methods/btc_getNetwork.ts | 34 - .../solana/methods/btc_getPublicKey.ts | 33 - .../solana/methods/btc_requestAccounts.ts | 80 --- .../solana/methods/btc_signMessage.ts | 52 -- .../providers/solana/methods/btc_signPsbt.ts | 55 -- .../solana/methods/btc_switchNetwork.ts | 60 -- .../src/providers/solana/methods/index.ts | 17 +- .../src/providers/solana/types/sol-network.ts | 10 +- .../src/providers/solana/types/sol-token.ts | 8 +- .../src/providers/solana/ui/index.ts | 4 +- .../src/providers/solana/ui/libs/signer.ts | 127 +--- .../src/providers/solana/ui/libs/tx-size.ts | 260 ------- .../components/send-address-input.vue | 20 +- .../components/send-alert.vue | 72 -- .../components/send-token-select.vue | 19 +- .../solana/ui/send-transaction/index.vue | 648 +++++++++++------- .../verify-transaction/index.vue | 156 +++-- .../src/providers/solana/ui/types.ts | 6 +- packages/extension/src/types/provider.ts | 5 +- .../action/views/send-transaction/index.vue | 2 + 31 files changed, 609 insertions(+), 1251 deletions(-) delete mode 100644 packages/extension/src/providers/solana/methods/btc_getNetwork.ts delete mode 100644 packages/extension/src/providers/solana/methods/btc_getPublicKey.ts delete mode 100644 packages/extension/src/providers/solana/methods/btc_requestAccounts.ts delete mode 100644 packages/extension/src/providers/solana/methods/btc_signMessage.ts delete mode 100644 packages/extension/src/providers/solana/methods/btc_signPsbt.ts delete mode 100644 packages/extension/src/providers/solana/methods/btc_switchNetwork.ts delete mode 100644 packages/extension/src/providers/solana/ui/libs/tx-size.ts delete mode 100644 packages/extension/src/providers/solana/ui/send-transaction/components/send-alert.vue diff --git a/packages/extension/src/libs/cache-fetch/index.ts b/packages/extension/src/libs/cache-fetch/index.ts index cfdb9cb21..a553beba2 100644 --- a/packages/extension/src/libs/cache-fetch/index.ts +++ b/packages/extension/src/libs/cache-fetch/index.ts @@ -40,15 +40,16 @@ const cacheFetch = async ( return fetch(options.url, fetchOptions) .then((res) => res.json()) .then((json) => { - const jsonstring = JSON.stringify(json); + const jsondata = options.postProcess ? options.postProcess(json) : json; + const jsonstring = JSON.stringify(jsondata); if (!jsonstring.includes("error")) { const store: StoredData = { timestamp: new Date().getTime(), data: jsonstring, }; - return storage.set(hash, store).then(() => json); + return storage.set(hash, store).then(() => jsondata); } - return json; + return jsondata; }); } }; diff --git a/packages/extension/src/libs/cache-fetch/types.ts b/packages/extension/src/libs/cache-fetch/types.ts index 582ddf46b..574a4eb84 100644 --- a/packages/extension/src/libs/cache-fetch/types.ts +++ b/packages/extension/src/libs/cache-fetch/types.ts @@ -2,6 +2,7 @@ export interface RequestOptions { url: string; post?: Record; headers?: Record; + postProcess?: (data: any) => any; } export interface StoredData { timestamp: number; diff --git a/packages/extension/src/providers/common/ui/send-transaction/nft-select-list/index.vue b/packages/extension/src/providers/common/ui/send-transaction/nft-select-list/index.vue index 09ff241d9..67689d189 100644 --- a/packages/extension/src/providers/common/ui/send-transaction/nft-select-list/index.vue +++ b/packages/extension/src/providers/common/ui/send-transaction/nft-select-list/index.vue @@ -38,10 +38,11 @@ import { NFTType, } from "@/types/nft"; import { BitcoinNetwork } from "@/providers/bitcoin/types/bitcoin-network"; +import { SolanaNetwork } from "@/providers/solana/types/sol-network"; const props = defineProps({ network: { - type: Object as PropType, + type: Object as PropType, default: () => ({}), }, address: { diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index 7e9a738cf..5d33b8ef7 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -205,7 +205,6 @@ export default ( (obj, cur) => ({ ...obj, [cur.contract]: null }), {} as Record ); - console.log(marketInfo); if (network.coingeckoID) { const nativeMarket = await marketData.getMarketData([ network.coingeckoID, @@ -233,7 +232,6 @@ export default ( const tokenInfo: Record = await getKnownNetworkTokens( network.name ); - console.log(tokenInfo); tokenInfo[NATIVE_TOKEN_ADDRESS] = { chainId: (network as EvmNetwork).chainID, name: network.name_long, @@ -246,7 +244,6 @@ export default ( const unknownTokens: string[] = []; let nativeAsset: AssetsType | null = null; for (const [address, market] of Object.entries(marketInfo)) { - console.log(address, market, tokenInfo[address]); if (market && tokenInfo[address]) { const userBalance = fromBase( balances[address].balance, diff --git a/packages/extension/src/providers/solana/index.ts b/packages/extension/src/providers/solana/index.ts index b937a2828..918228e47 100644 --- a/packages/extension/src/providers/solana/index.ts +++ b/packages/extension/src/providers/solana/index.ts @@ -33,7 +33,10 @@ class SolanaProvider this.network = network; this.toWindow = toWindow; this.setMiddleWares(); - this.requestProvider = getRequestProvider("", this.middlewares); + this.requestProvider = getRequestProvider( + this.network.node, + this.middlewares + ); this.requestProvider.on("notification", (notif: any) => { this.sendNotification(JSON.stringify(notif)); }); diff --git a/packages/extension/src/providers/solana/inject.ts b/packages/extension/src/providers/solana/inject.ts index 805268e7e..0bbcf7969 100644 --- a/packages/extension/src/providers/solana/inject.ts +++ b/packages/extension/src/providers/solana/inject.ts @@ -9,7 +9,7 @@ import { SendMessageHandler, } from "@/types/provider"; import { EnkryptWindow } from "@/types/globals"; -import { BitcoinNetworks } from "./types"; +import { SolanaNetwork } from "./types/sol-network"; import { InternalMethods } from "@/types/messenger"; import { SettingsType } from "@/libs/settings-state/types"; @@ -19,14 +19,14 @@ export class Provider extends EventEmitter implements ProviderInterface { type: ProviderType; version: string = __VERSION__; autoRefreshOnNetworkChange = false; - networks: typeof BitcoinNetworks; + networks: typeof SolanaNetwork; sendMessageHandler: SendMessageHandler; constructor(options: ProviderOptions) { super(); this.connected = true; this.name = options.name; this.type = options.type; - this.networks = BitcoinNetworks; + this.networks = SolanaNetwork; this.sendMessageHandler = options.sendMessageHandler; } diff --git a/packages/extension/src/providers/solana/libs/accounts-state/index.ts b/packages/extension/src/providers/solana/libs/accounts-state/index.ts index 54a360903..c757c8fd6 100644 --- a/packages/extension/src/providers/solana/libs/accounts-state/index.ts +++ b/packages/extension/src/providers/solana/libs/accounts-state/index.ts @@ -5,7 +5,7 @@ class AccountState { #storage: BrowserStorage; constructor() { this.#storage = new BrowserStorage( - InternalStorageNamespace.bitcoinAccountsState + InternalStorageNamespace.solanaAccountsState ); } async addApprovedAddress(address: string, domain: string): Promise { diff --git a/packages/extension/src/providers/solana/libs/accounts-state/types.ts b/packages/extension/src/providers/solana/libs/accounts-state/types.ts index 768317475..69b77adda 100644 --- a/packages/extension/src/providers/solana/libs/accounts-state/types.ts +++ b/packages/extension/src/providers/solana/libs/accounts-state/types.ts @@ -1,5 +1,5 @@ export enum StorageKeys { - accountsState = "bitcoin-accounts-state", + accountsState = "solana-accounts-state", } export interface IState { approvedAccounts: string[]; diff --git a/packages/extension/src/providers/solana/libs/api.ts b/packages/extension/src/providers/solana/libs/api.ts index 62b7a2916..c1a9d6d44 100644 --- a/packages/extension/src/providers/solana/libs/api.ts +++ b/packages/extension/src/providers/solana/libs/api.ts @@ -38,27 +38,33 @@ class API implements ProviderAPIInterface { return true; } getTokenInfo = async (contractAddress: string): Promise => { + interface TokenDetails { + address: string; + decimals: number; + name: string; + symbol: string; + } const allTokensResponse = await cacheFetch( { url: "https://utl.solcast.dev/solana-tokenlist.json", + postProcess: (data: any) => { + const allTokens = data.tokens as TokenDetails[]; + const tObj: Record = {}; + allTokens.forEach((t) => { + tObj[t.address] = t; + }); + return tObj; + }, }, - 10 * 60 * 1000 + 60 * 60 * 1000 ); - const allTokens = allTokensResponse.tokens as { - address: string; - decimals: number; - name: string; - symbol: string; - }[]; - for (const t of allTokens) { - if (t.address === contractAddress) { - console.log(t, contractAddress); - return { - name: t.name, - symbol: t.symbol, - decimals: t.decimals, - }; - } + const allTokens = allTokensResponse as Record; + if (allTokens[contractAddress]) { + return { + name: allTokens[contractAddress].name, + symbol: allTokens[contractAddress].symbol, + decimals: allTokens[contractAddress].decimals, + }; } return { name: "Unknown", diff --git a/packages/extension/src/providers/solana/libs/message-router.ts b/packages/extension/src/providers/solana/libs/message-router.ts index e715f2807..a87a8b1a7 100644 --- a/packages/extension/src/providers/solana/libs/message-router.ts +++ b/packages/extension/src/providers/solana/libs/message-router.ts @@ -27,26 +27,6 @@ const handleIncomingMessage: handleIncomingMessageType = ( } else if (jsonMsg.method === MessageMethod.changeAddress) { const address = jsonMsg.params[0] as string; _provider.emit(EmitEvent.accountsChanged, [address]); - } else if ( - (jsonMsg.method as EnkryptProviderEventMethods) === - EnkryptProviderEventMethods.chainChanged - ) { - if ( - jsonMsg.params[0] === NetworkNames.Bitcoin || - jsonMsg.params[0] === NetworkNames.BitcoinTest - ) { - _provider - .switchNetwork( - jsonMsg.params[0] === NetworkNames.Bitcoin ? "livenet" : "testnet" - ) - .then(() => { - _provider.emit(EmitEvent.networkChanged, [ - jsonMsg.params[0] === NetworkNames.Bitcoin - ? "livenet" - : "testnet", - ]); - }); - } } } catch (e) { console.error(e); diff --git a/packages/extension/src/providers/solana/libs/utils.ts b/packages/extension/src/providers/solana/libs/utils.ts index f34045285..edb1aeda6 100644 --- a/packages/extension/src/providers/solana/libs/utils.ts +++ b/packages/extension/src/providers/solana/libs/utils.ts @@ -1,104 +1,11 @@ -import { BitcoinNetworkInfo, HaskoinUnspentType } from "../types"; -import { address as BTCAddress } from "bitcoinjs-lib"; -import { GasPriceTypes } from "@/providers/common/types"; -import { fromBase } from "@enkryptcom/utils"; -import BigNumber from "bignumber.js"; -import { BitcoinNetwork } from "../types/bitcoin-network"; -import { BTCTxInfo } from "../ui/types"; - -const isAddress = (address: string, network: BitcoinNetworkInfo): boolean => { +import { PublicKey } from "@solana/web3.js"; +const isAddress = (address: string): boolean => { try { - BTCAddress.toOutputScript(address, network); - return true; - } catch { + const addPub = new PublicKey(address); + return PublicKey.isOnCurve(addPub.toBytes()); + } catch (e) { return false; } }; -const getTxInfo = ( - utxos: HaskoinUnspentType[], - ordinalUTXO?: HaskoinUnspentType -): BTCTxInfo => { - const txInfo: BTCTxInfo = { - inputs: [], - outputs: [], - }; - utxos.forEach((u) => { - txInfo.inputs.push({ - hash: u.txid, - index: u.index, - raw: u.raw, - witnessUtxo: { - script: u.pkscript, - value: u.value, - }, - }); - }); - if (ordinalUTXO) { - txInfo.inputs.unshift({ - hash: ordinalUTXO.txid, - index: ordinalUTXO.index, - raw: ordinalUTXO.raw, - witnessUtxo: { - script: ordinalUTXO.pkscript, - value: ordinalUTXO.value, - }, - }); - } - return txInfo; -}; - -const getGasCostValues = async ( - network: BitcoinNetwork, - byteSize: number, - nativeVal = "0", - decimals: number, - currencyName: string -) => { - const fees = await network.feeHandler(); - const gasVals = { - [GasPriceTypes.FASTEST]: (byteSize * fees.FASTEST).toString(), - [GasPriceTypes.FAST]: (byteSize * fees.FAST).toString(), - [GasPriceTypes.REGULAR]: (byteSize * fees.REGULAR).toString(), - [GasPriceTypes.ECONOMY]: (byteSize * fees.ECONOMY).toString(), - }; - const getConvertedVal = (type: GasPriceTypes) => - fromBase(gasVals[type], decimals); - - const gasCostValues = { - [GasPriceTypes.ECONOMY]: { - nativeValue: getConvertedVal(GasPriceTypes.ECONOMY), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.ECONOMY)) - .times(nativeVal!) - .toString(), - nativeSymbol: currencyName, - fiatSymbol: "USD", - }, - [GasPriceTypes.REGULAR]: { - nativeValue: getConvertedVal(GasPriceTypes.REGULAR), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.REGULAR)) - .times(nativeVal!) - .toString(), - nativeSymbol: currencyName, - fiatSymbol: "USD", - }, - [GasPriceTypes.FAST]: { - nativeValue: getConvertedVal(GasPriceTypes.FAST), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FAST)) - .times(nativeVal!) - .toString(), - nativeSymbol: currencyName, - fiatSymbol: "USD", - }, - [GasPriceTypes.FASTEST]: { - nativeValue: getConvertedVal(GasPriceTypes.FASTEST), - fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FASTEST)) - .times(nativeVal!) - .toString(), - nativeSymbol: currencyName, - fiatSymbol: "USD", - }, - }; - return gasCostValues; -}; -export { isAddress, getGasCostValues, getTxInfo }; +export { isAddress }; diff --git a/packages/extension/src/providers/solana/methods/btc_getNetwork.ts b/packages/extension/src/providers/solana/methods/btc_getNetwork.ts deleted file mode 100644 index 9bb201b7b..000000000 --- a/packages/extension/src/providers/solana/methods/btc_getNetwork.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { getCustomError } from "@/libs/error"; -import { MiddlewareFunction, NetworkNames } from "@enkryptcom/types"; -import BitcoinProvider from ".."; -import AccountState from "../libs/accounts-state"; -import { ProviderRPCRequest } from "@/types/provider"; -const method: MiddlewareFunction = function ( - this: BitcoinProvider, - payload: ProviderRPCRequest, - res, - next -): void { - if (payload.method !== "btc_getNetwork") return next(); - else { - if (!payload.options || !payload.options.domain) { - return res(getCustomError("btc_getNetwork: invalid domain")); - } - - const accountsState = new AccountState(); - - accountsState - .getApprovedAddresses(payload.options!.domain) - .then((accounts) => { - if (!accounts.length) { - return res(null, ""); - } - if (this.network.name === NetworkNames.Bitcoin) - return res(null, "livenet"); - if (this.network.name === NetworkNames.BitcoinTest) - return res(null, "testnet"); - res(null, ""); - }); - } -}; -export default method; diff --git a/packages/extension/src/providers/solana/methods/btc_getPublicKey.ts b/packages/extension/src/providers/solana/methods/btc_getPublicKey.ts deleted file mode 100644 index f47542501..000000000 --- a/packages/extension/src/providers/solana/methods/btc_getPublicKey.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { MiddlewareFunction } from "@enkryptcom/types"; -import { ProviderRPCRequest } from "@/types/provider"; -import AccountState from "../libs/accounts-state"; -import { getCustomError } from "@/libs/error"; -import BitcoinProvider from ".."; - -const method: MiddlewareFunction = function ( - this: BitcoinProvider, - payload: ProviderRPCRequest, - res, - next -): void { - if (payload.method !== "btc_getPublicKey") return next(); - else { - if (payload.options && payload.options.domain) { - const accountsState = new AccountState(); - accountsState - .getApprovedAddresses(payload.options.domain) - .then((accounts) => { - if (accounts.length) { - this.KeyRing.getAccount(accounts[0]).then((pubAccounts) => { - res(null, pubAccounts.address.replace("0x", "")); - }); - } else { - res(null, ""); - } - }); - } else { - res(getCustomError("No domain set!")); - } - } -}; -export default method; diff --git a/packages/extension/src/providers/solana/methods/btc_requestAccounts.ts b/packages/extension/src/providers/solana/methods/btc_requestAccounts.ts deleted file mode 100644 index dcba6d17f..000000000 --- a/packages/extension/src/providers/solana/methods/btc_requestAccounts.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { CallbackFunction, MiddlewareFunction } from "@enkryptcom/types"; -import type BitcoinProvider from ".."; -import { ProviderRPCRequest } from "@/types/provider"; -import { WindowPromise } from "@/libs/window-promise"; -import AccountState from "../libs/accounts-state"; -import { getCustomError } from "@/libs/error"; -let isAccountAccessPending = false; -const pendingPromises: { - payload: ProviderRPCRequest; - res: CallbackFunction; -}[] = []; -const method: MiddlewareFunction = function ( - this: BitcoinProvider, - payload: ProviderRPCRequest, - res, - next -): void { - if (payload.method !== "btc_requestAccounts") return next(); - else { - if (isAccountAccessPending) { - pendingPromises.push({ - payload, - res, - }); - return; - } - isAccountAccessPending = true; - const handleRemainingPromises = () => { - isAccountAccessPending = false; - if (pendingPromises.length) { - const promi = pendingPromises.pop(); - if (promi) handleAccountAccess(promi.payload, promi.res); - } - }; - const handleAccountAccess = ( - _payload: ProviderRPCRequest, - _res: CallbackFunction - ) => { - if (_payload.options && _payload.options.domain) { - isAccountAccessPending = true; - const accountsState = new AccountState(); - accountsState - .getApprovedAddresses(_payload.options.domain) - .then((accounts) => { - if (accounts.length) { - _res(null, [ - accounts.map((acc) => this.network.displayAddress(acc))[0], - ]); - handleRemainingPromises(); - } else { - const windowPromise = new WindowPromise(); - windowPromise - .getResponse( - this.getUIPath(this.UIRoutes.btcConnectDApp.path), - JSON.stringify({ - ..._payload, - params: [this.network.name], - }) - ) - .then(({ error, result }) => { - if (error) _res(error as any); - const accounts = JSON.parse(result || "[]"); - _res( - null, - accounts.map((acc: string) => - this.network.displayAddress(acc) - ) - ); - }) - .finally(handleRemainingPromises); - } - }); - } else { - _res(getCustomError("No domain set!")); - } - }; - handleAccountAccess(payload, res); - } -}; -export default method; diff --git a/packages/extension/src/providers/solana/methods/btc_signMessage.ts b/packages/extension/src/providers/solana/methods/btc_signMessage.ts deleted file mode 100644 index aa555b97a..000000000 --- a/packages/extension/src/providers/solana/methods/btc_signMessage.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { getCustomError } from "@/libs/error"; -import { MiddlewareFunction } from "@enkryptcom/types"; -import BitcoinProvider from ".."; -import { WindowPromise } from "@/libs/window-promise"; -import { ProviderRPCRequest } from "@/types/provider"; -import AccountState from "../libs/accounts-state"; -const method: MiddlewareFunction = function ( - this: BitcoinProvider, - payload: ProviderRPCRequest, - res, - next -): void { - if (payload.method !== "btc_signMessage") return next(); - else { - if (!payload.params || payload.params.length < 2) { - return res(getCustomError("btc_signMessage: invalid params")); - } - if (!payload.options || !payload.options.domain) { - return res(getCustomError("btc_signMessage: invalid domain")); - } - const msg = payload.params[0] as string; - const type = payload.params[1] as string; - const accountsState = new AccountState(); - - accountsState - .getApprovedAddresses(payload.options!.domain) - .then((accounts) => { - if (!accounts.length) { - return res(null, ""); - } - this.KeyRing.getAccount(accounts[0]).then((acc) => { - if (!acc) - return res(getCustomError("btc_signMessage: account not found")); - const windowPromise = new WindowPromise(); - windowPromise - .getResponse( - this.getUIPath(this.UIRoutes.btcSign.path), - JSON.stringify({ - ...payload, - params: [msg, type, acc, this.network.name], - }), - true - ) - .then(({ error, result }) => { - if (error) return res(error); - res(null, JSON.parse(result as string)); - }); - }); - }); - } -}; -export default method; diff --git a/packages/extension/src/providers/solana/methods/btc_signPsbt.ts b/packages/extension/src/providers/solana/methods/btc_signPsbt.ts deleted file mode 100644 index c63e52815..000000000 --- a/packages/extension/src/providers/solana/methods/btc_signPsbt.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { getCustomError } from "@/libs/error"; -import { MiddlewareFunction } from "@enkryptcom/types"; -import BitcoinProvider from ".."; -import { WindowPromise } from "@/libs/window-promise"; -import { SignPSBTOptions } from "../types"; -import AccountState from "../libs/accounts-state"; -import { ProviderRPCRequest } from "@/types/provider"; -const method: MiddlewareFunction = function ( - this: BitcoinProvider, - payload: ProviderRPCRequest, - res, - next -): void { - if (payload.method !== "btc_signPsbt") return next(); - else { - if (!payload.params || payload.params.length < 2) { - return res( - getCustomError("btc_signPsbt: invalid request not enough params") - ); - } - if (!payload.options || !payload.options.domain) { - return res(getCustomError("btc_signPsbt: invalid domain")); - } - const psbt = payload.params[0] as string; - const options = payload.params[1] as SignPSBTOptions; - const accountsState = new AccountState(); - - accountsState - .getApprovedAddresses(payload.options!.domain) - .then((accounts) => { - if (!accounts.length) { - return res(null, ""); - } - this.KeyRing.getAccount(accounts[0]).then((acc) => { - if (!acc) - return res(getCustomError("btc_signPsbt: account not found")); - const windowPromise = new WindowPromise(); - windowPromise - .getResponse( - this.getUIPath(this.UIRoutes.btcSendTransaction.path), - JSON.stringify({ - ...payload, - params: [psbt, options, acc, this.network.name], - }), - true - ) - .then(({ error, result }) => { - if (error) return res(error); - res(null, JSON.parse(result as string)); - }); - }); - }); - } -}; -export default method; diff --git a/packages/extension/src/providers/solana/methods/btc_switchNetwork.ts b/packages/extension/src/providers/solana/methods/btc_switchNetwork.ts deleted file mode 100644 index a272e19d0..000000000 --- a/packages/extension/src/providers/solana/methods/btc_switchNetwork.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { getCustomError } from "@/libs/error"; -import { sendToBackgroundFromBackground } from "@/libs/messenger/extension"; -import { InternalMethods } from "@/types/messenger"; -import { ProviderRPCRequest } from "@/types/provider"; -import { MiddlewareFunction } from "@enkryptcom/types"; -import BTCNetworks from "../networks"; -import DomainState from "@/libs/domain-state"; -import BitcoinProvider from ".."; -import { BitcoinNetworks } from "../types"; -import { trackNetworkSelected } from "@/libs/metrics"; -import { NetworkChangeEvents } from "@/libs/metrics/types"; -const method: MiddlewareFunction = function ( - this: BitcoinProvider, - payload: ProviderRPCRequest, - res, - next -): void { - if (payload.method !== "btc_switchNetwork") return next(); - else { - if ( - !payload.params || - payload.params.length < 1 || - !Object.keys(BitcoinNetworks).includes(payload.params[0]) - ) { - return res(getCustomError("btc_switchNetwork: invalid params")); - } - const internalName = - BitcoinNetworks[payload.params![0] as keyof typeof BitcoinNetworks]; - const allNetworks = Object.values(BTCNetworks); - const validNetwork = allNetworks.find((net) => net.name === internalName); - if (validNetwork) { - trackNetworkSelected(NetworkChangeEvents.NetworkChangeAPI, { - provider: validNetwork.provider, - network: validNetwork.name, - }); - sendToBackgroundFromBackground({ - message: JSON.stringify({ - method: InternalMethods.changeNetwork, - params: [validNetwork.name], - }), - provider: validNetwork.provider, - tabId: payload.options?.tabId, - }).then(() => { - const domainState = new DomainState(); - domainState - .setSelectedNetwork(validNetwork.name) - .then(() => res(null, true)); - }); - } else { - return res( - getCustomError( - `btc_switchNetwork: porvided network ${ - payload.params![0] - } not supported` - ) - ); - } - } -}; -export default method; diff --git a/packages/extension/src/providers/solana/methods/index.ts b/packages/extension/src/providers/solana/methods/index.ts index f2818c463..07e8bab18 100644 --- a/packages/extension/src/providers/solana/methods/index.ts +++ b/packages/extension/src/providers/solana/methods/index.ts @@ -1,16 +1,3 @@ -import btcRequestAccounts from "./btc_requestAccounts"; -import btcSignMessage from "./btc_signMessage"; import btcGetBalance from "./btc_getBalance"; -import btcSwitchNetwork from "./btc_switchNetwork"; -import btcGetPublicKey from "./btc_getPublicKey"; -import btcSignPsbt from "./btc_signPsbt"; -import btcGetNetwork from "./btc_getNetwork"; -export default [ - btcRequestAccounts, - btcSignMessage, - btcGetBalance, - btcSwitchNetwork, - btcGetPublicKey, - btcSignPsbt, - btcGetNetwork, -]; + +export default [btcGetBalance]; diff --git a/packages/extension/src/providers/solana/types/sol-network.ts b/packages/extension/src/providers/solana/types/sol-network.ts index 1161c5955..fb335c7dc 100644 --- a/packages/extension/src/providers/solana/types/sol-network.ts +++ b/packages/extension/src/providers/solana/types/sol-network.ts @@ -14,11 +14,12 @@ import MarketData from "@/libs/market-data"; import BigNumber from "bignumber.js"; import { CoinGeckoTokenMarket } from "@/libs/market-data/types"; import Sparkline from "@/libs/sparkline"; -import { SOLToken } from "./sol-token"; +import { SOLToken, SolTokenOptions } from "./sol-token"; import { NFTCollection } from "@/types/nft"; import { fromBase, hexToBuffer } from "@enkryptcom/utils"; import bs58 from "bs58"; -import getBalances from "@/providers/ethereum/libs/assets-handlers/solanachain"; +import { NATIVE_TOKEN_ADDRESS } from "@/providers/ethereum/libs/common"; +import { isAddress as isSolanaAddress } from "../libs/utils"; export interface SolanaNetworkOptions { name: NetworkNames; @@ -91,7 +92,7 @@ export class SolanaNetwork extends BaseNetwork { public async getAllTokens(pubkey: string): Promise { const assets = await this.getAllTokenInfo(pubkey); return assets.map((token) => { - const bTokenOptions: BaseTokenOptions = { + const bTokenOptions: SolTokenOptions = { decimals: token.decimals, icon: token.icon, name: token.name, @@ -99,6 +100,7 @@ export class SolanaNetwork extends BaseNetwork { balance: token.balance, price: token.value, coingeckoID: this.coingeckoID, + contract: NATIVE_TOKEN_ADDRESS, }; return new SOLToken(bTokenOptions); }); @@ -147,4 +149,6 @@ export class SolanaNetwork extends BaseNetwork { public getAllActivity(address: string): Promise { return this.activityHandler(this, address); } + + public isAddress = isSolanaAddress; } diff --git a/packages/extension/src/providers/solana/types/sol-token.ts b/packages/extension/src/providers/solana/types/sol-token.ts index 1d20938d5..636b7befa 100644 --- a/packages/extension/src/providers/solana/types/sol-token.ts +++ b/packages/extension/src/providers/solana/types/sol-token.ts @@ -1,9 +1,15 @@ import { BaseToken, BaseTokenOptions } from "@/types/base-token"; import SolanaAPI from "@/providers/bitcoin/libs/api"; +export interface SolTokenOptions extends BaseTokenOptions { + contract: string; +} + export class SOLToken extends BaseToken { - constructor(options: BaseTokenOptions) { + contract: string; + constructor(options: SolTokenOptions) { super(options); + this.contract = options.contract; } public async getLatestUserBalance( diff --git a/packages/extension/src/providers/solana/ui/index.ts b/packages/extension/src/providers/solana/ui/index.ts index 865942ef0..5b39a0ec8 100644 --- a/packages/extension/src/providers/solana/ui/index.ts +++ b/packages/extension/src/providers/solana/ui/index.ts @@ -1,7 +1,7 @@ import { ProviderName, UIExportOptions } from "@/types/provider"; import getRoutes from "./routes"; const uiExport: UIExportOptions = { - providerName: ProviderName.bitcoin, - routes: getRoutes(ProviderName.bitcoin), + providerName: ProviderName.solana, + routes: getRoutes(ProviderName.solana), }; export default uiExport; diff --git a/packages/extension/src/providers/solana/ui/libs/signer.ts b/packages/extension/src/providers/solana/ui/libs/signer.ts index 161fdc71d..20ed12451 100644 --- a/packages/extension/src/providers/solana/ui/libs/signer.ts +++ b/packages/extension/src/providers/solana/ui/libs/signer.ts @@ -1,134 +1,17 @@ -import { InternalMethods, InternalOnMessageResponse } from "@/types/messenger"; +import { InternalOnMessageResponse } from "@/types/messenger"; import { SignerTransactionOptions, SignerMessageOptions } from "../types"; -import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; -import { hexToBuffer, bufferToHex } from "@enkryptcom/utils"; -import { Psbt } from "bitcoinjs-lib"; -import { BitcoinNetwork, PaymentType } from "../../types/bitcoin-network"; -import { EnkryptAccount } from "@enkryptcom/types"; -import { signMessageOfBIP322Simple } from "../../libs/bip322-message-sign"; -import { magicHash, toCompact } from "../../libs/sign-message-utils"; - -const PSBTSigner = (account: EnkryptAccount, network: BitcoinNetwork) => { - return { - publicKey: hexToBuffer(account.address), - network: network.networkInfo, - sign: (hash: Buffer): Promise => { - return sendUsingInternalMessengers({ - method: InternalMethods.sign, - params: [bufferToHex(hash), account], - }).then((res) => { - if (res.error) { - return Promise.reject({ - error: res.error, - }); - } else { - return hexToBuffer(JSON.parse(res.result!)).subarray(0, 64); - } - }); - }, - }; -}; +import { Psbt } from "bitcoinjs-lib"; const TransactionSigner = ( options: SignerTransactionOptions ): Promise => { - const { account, network, payload } = options; - if (account.isHardware) { - throw new Error("btc-hardware not implemented"); - } else { - const tx = new Psbt({ - network: network.networkInfo, - maximumFeeRate: network.networkInfo.maxFeeRate, - }); - payload.inputs - .map((u) => { - const res: { - hash: string; - index: number; - witnessUtxo?: { script: Buffer; value: number }; - nonWitnessUtxo?: Buffer; - } = { - hash: u.hash, - index: u.index, - }; - if (network.networkInfo.paymentType === PaymentType.P2WPKH) { - res.witnessUtxo = { - script: Buffer.from(u.witnessUtxo.script, "hex"), - value: u.witnessUtxo.value, - }; - } else if (network.networkInfo.paymentType === PaymentType.P2PKH) { - res.nonWitnessUtxo = Buffer.from(u.raw, "hex"); - } - return res; - }) - .forEach((input) => tx.addInput(input)); - payload.outputs.forEach((output) => tx.addOutput(output)); - const signer = PSBTSigner(account, network); - return tx.signAllInputsAsync(signer).then(() => { - tx.finalizeAllInputs(); - return tx; - }); - } + throw new Error("btc-tx-signer not implemented"); }; const MessageSigner = ( options: SignerMessageOptions ): Promise => { - const { account, payload, network } = options; - if (account.isHardware) { - throw new Error("btc-hardware not implemented"); - } else { - if (options.type === "bip322-simple") { - const signer = PSBTSigner(account, network); - return signMessageOfBIP322Simple({ - address: account.address, - message: payload.toString(), - network: network, - Signer: signer, - }) - .then((sig) => { - return { - result: JSON.stringify(sig), - }; - }) - .catch((e) => { - return { - error: e.message, - }; - }); - } else { - const signer = { - sign: ( - hash: Buffer - ): Promise<{ signature: Buffer; recovery: number }> => { - return sendUsingInternalMessengers({ - method: InternalMethods.sign, - params: [bufferToHex(hash), account], - }).then((res) => { - if (res.error) { - return Promise.reject({ - error: res.error, - }); - } else { - const sigBuffer = hexToBuffer(JSON.parse(res.result!)); - return { - signature: sigBuffer.subarray(0, 64), - recovery: sigBuffer[64], - }; - } - }); - }, - }; - const mHash = magicHash(payload); - return signer.sign(mHash).then((sig) => { - return { - result: JSON.stringify( - toCompact(sig.recovery, sig.signature, true).toString("base64") - ), - }; - }); - } - } + throw new Error("btc-msg-signer not implemented"); }; -export { TransactionSigner, MessageSigner, PSBTSigner }; +export { TransactionSigner, MessageSigner }; diff --git a/packages/extension/src/providers/solana/ui/libs/tx-size.ts b/packages/extension/src/providers/solana/ui/libs/tx-size.ts deleted file mode 100644 index 4dcb707eb..000000000 --- a/packages/extension/src/providers/solana/ui/libs/tx-size.ts +++ /dev/null @@ -1,260 +0,0 @@ -// https://github.com/jlopp/bitcoin-transaction-size-calculator/blob/master/index.html - -import { toBN } from "web3-utils"; -import { PaymentType } from "../../types/bitcoin-network"; - -enum InputScriptType { - P2PKH = "P2PKH", - P2SH = "P2SH", - "P2SH-P2WPKH" = "P2SH-P2WPKH", - "P2SH-P2WSH" = "P2SH-P2WSH", - P2WPKH = "P2WPKH", - P2WSH = "P2WSH", - P2TR = "P2TR", -} -const P2PKH_IN_SIZE = 148; -const P2PKH_OUT_SIZE = 34; - -const P2SH_OUT_SIZE = 32; -const P2SH_P2WPKH_OUT_SIZE = 32; -const P2SH_P2WSH_OUT_SIZE = 32; - -// All segwit input sizes are reduced by 1 WU to account for the witness item counts being added for every input per the transaction header -const P2SH_P2WPKH_IN_SIZE = 90.75; - -const P2WPKH_IN_SIZE = 67.75; -const P2WPKH_OUT_SIZE = 31; - -const P2WSH_OUT_SIZE = 43; -const P2TR_OUT_SIZE = 43; - -const P2TR_IN_SIZE = 57.25; - -const PUBKEY_SIZE = 33; -const SIGNATURE_SIZE = 72; - -const getSizeOfVarInt = (length: number) => { - if (length < 253) { - return 1; - } else if (length < 65535) { - return 3; - } else if (length < 4294967295) { - return 5; - } else if (length < toBN("18446744073709551615").toNumber()) { - return 9; - } else { - alert("Invalid var int"); - } -}; - -const getSizeOfScriptLengthElement = (length: number) => { - if (length < 75) { - return 1; - } else if (length <= 255) { - return 2; - } else if (length <= 65535) { - return 3; - } else if (length <= 4294967295) { - return 5; - } else { - alert("Size of redeem script is too large"); - } -}; - -const getTxOverheadExtraRawBytes = ( - input_script: InputScriptType, - input_count: number -) => { - let witness_bytes = 0; - // Returns the remaining 3/4 bytes per witness bytes - if ( - input_script !== InputScriptType.P2PKH && - input_script !== InputScriptType.P2SH - ) { - // Transactions with segwit inputs have extra overhead - witness_bytes = - 0.25 + // segwit marker - 0.25 + // segwit flag - input_count / 4; // witness element count per input - } - return witness_bytes * 3; -}; - -const getTxOverheadVBytes = ( - input_script: InputScriptType, - input_count: number, - output_count: number -) => { - let witness_vbytes = 0; - if ( - input_script != InputScriptType.P2PKH && - input_script != InputScriptType.P2SH - ) { - // Transactions with segwit inputs have extra overhead - witness_vbytes = - 0.25 + // segwit marker - 0.25 + // segwit flag - input_count / 4; // witness element count per input - } - return ( - 4 + // nVersion - getSizeOfVarInt(input_count)! + // number of inputs - getSizeOfVarInt(output_count)! + // number of outputs - 4 + // nLockTime - witness_vbytes - ); -}; - -interface calcInputType { - input_script?: InputScriptType; - input_n?: number; - input_m?: number; - input_count: number; -} -interface calcOutputType { - p2pkh_output_count?: number; - p2sh_output_count?: number; - p2sh_p2wpkh_output_count?: number; - p2sh_p2wsh_output_count?: number; - p2wpkh_output_count?: number; - p2wsh_output_count?: number; - p2tr_output_count?: number; -} -const calculateSize = ( - inputOptions: calcInputType, - outputOptions: calcOutputType -) => { - const defaultInputOptions = { - input_script: InputScriptType.P2WPKH, - input_m: 1, - input_n: 1, - }; - const defaultOutputOptions = { - p2pkh_output_count: 0, - p2sh_output_count: 0, - p2sh_p2wpkh_output_count: 0, - p2sh_p2wsh_output_count: 0, - p2wpkh_output_count: 0, - p2wsh_output_count: 0, - p2tr_output_count: 0, - }; - const _inputOptions = { ...defaultInputOptions, ...inputOptions }; - const _outputOptions = { ...defaultOutputOptions, ...outputOptions }; - const { input_script, input_n, input_m, input_count } = _inputOptions; - const { - p2pkh_output_count, - p2sh_output_count, - p2sh_p2wpkh_output_count, - p2sh_p2wsh_output_count, - p2wpkh_output_count, - p2wsh_output_count, - p2tr_output_count, - } = _outputOptions; - - const output_count = - p2pkh_output_count + - p2sh_output_count + - p2sh_p2wpkh_output_count + - p2sh_p2wsh_output_count + - p2wpkh_output_count + - p2wsh_output_count + - p2tr_output_count; - // In most cases the input size is predictable. For multisig inputs we need to perform a detailed calculation - let inputSize = 0; // in virtual bytes - let inputWitnessSize = 0; - let redeemScriptSize = 0; - let scriptSigSize = 0; - switch (input_script) { - case "P2PKH": - inputSize = P2PKH_IN_SIZE; - break; - case "P2SH-P2WPKH": - inputSize = P2SH_P2WPKH_IN_SIZE; - inputWitnessSize = 107; // size(signature) + signature + size(pubkey) + pubkey - break; - case "P2WPKH": - inputSize = P2WPKH_IN_SIZE; - inputWitnessSize = 107; // size(signature) + signature + size(pubkey) + pubkey - break; - case "P2TR": // Only consider the cooperative taproot signing path; assume multisig is done via aggregate signatures - inputSize = P2TR_IN_SIZE; - inputWitnessSize = 65; // getSizeOfVarInt(schnorrSignature) + schnorrSignature; - break; - case "P2SH": - redeemScriptSize = - 1 + // OP_M - input_n * (1 + PUBKEY_SIZE) + // OP_PUSH33 - 1 + // OP_N - 1; // OP_CHECKMULTISIG - scriptSigSize = - 1 + // size(0) - input_m * (1 + SIGNATURE_SIZE) + // size(SIGNATURE_SIZE) + signature - getSizeOfScriptLengthElement(redeemScriptSize)! + - redeemScriptSize; - inputSize = 32 + 4 + getSizeOfVarInt(scriptSigSize)! + scriptSigSize + 4; - break; - case "P2SH-P2WSH": - case "P2WSH": - redeemScriptSize = - 1 + // OP_M - input_n * (1 + PUBKEY_SIZE) + // OP_PUSH33 - 1 + // OP_N - 1; // OP_CHECKMULTISIG - inputWitnessSize = - 1 + // size(0) - input_m * (1 + SIGNATURE_SIZE) + // size(SIGNATURE_SIZE) + signature - getSizeOfScriptLengthElement(redeemScriptSize)! + - redeemScriptSize; - inputSize = - 36 + // outpoint (spent UTXO ID) - inputWitnessSize / 4 + // witness program - 4; // nSequence - if (input_script == "P2SH-P2WSH") { - inputSize += 32 + 3; // P2SH wrapper (redeemscript hash) + overhead? - } - } - const txVBytes = - getTxOverheadVBytes(input_script, input_count, output_count) + - inputSize * input_count + - P2PKH_OUT_SIZE * p2pkh_output_count + - P2SH_OUT_SIZE * p2sh_output_count + - P2SH_P2WPKH_OUT_SIZE * p2sh_p2wpkh_output_count + - P2SH_P2WSH_OUT_SIZE * p2sh_p2wsh_output_count + - P2WPKH_OUT_SIZE * p2wpkh_output_count + - P2WSH_OUT_SIZE * p2wsh_output_count + - P2TR_OUT_SIZE * p2tr_output_count; - const txBytes = - getTxOverheadExtraRawBytes(input_script, input_count)! + - txVBytes + - (inputWitnessSize * input_count * 3) / 4; - const txWeight = txVBytes * 4; - return { - txVBytes, - txBytes, - txWeight, - }; -}; -const calculateSizeBasedOnType = ( - numInputs: number, - numOutputs: number, - type: PaymentType -): number => { - const output: calcOutputType = {}; - if (type === PaymentType.P2PKH) { - output.p2pkh_output_count = numOutputs; - } else { - output.p2wpkh_output_count = numOutputs; - } - const size = calculateSize( - { - input_script: - type === PaymentType.P2PKH - ? InputScriptType.P2PKH - : InputScriptType.P2WPKH, - input_count: numInputs, - }, - output - ); - return type === PaymentType.P2PKH ? size.txBytes : size.txVBytes; -}; -export { InputScriptType, calculateSize, calculateSizeBasedOnType }; diff --git a/packages/extension/src/providers/solana/ui/send-transaction/components/send-address-input.vue b/packages/extension/src/providers/solana/ui/send-transaction/components/send-address-input.vue index 9e39d9328..c7ee00680 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/components/send-address-input.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/components/send-address-input.vue @@ -2,8 +2,8 @@
@@ -17,7 +17,7 @@ :disabled="disableDirectInput" placeholder="address" :style="{ - color: !isAddress(btcAddress, network.networkInfo) ? 'red' : 'black', + color: !network.isAddress(solAddress) ? 'red' : 'black', }" @focus="changeFocus" @blur="changeFocus" @@ -30,8 +30,7 @@ import { replaceWithEllipsis } from "@/ui/action/utils/filters"; import { computed } from "@vue/reactivity"; import { PropType, ref } from "vue"; -import { isAddress } from "@/providers/bitcoin/libs/utils"; -import { BitcoinNetwork } from "@/providers/bitcoin/types/bitcoin-network"; +import { SolanaNetwork } from "@/providers/solana/types/sol-network"; const isFocus = ref(false); const addressInput = ref(); @@ -50,7 +49,7 @@ const props = defineProps({ }, }, network: { - type: Object as PropType, + type: Object as PropType, default: () => ({}), }, from: { @@ -63,16 +62,15 @@ const emit = defineEmits<{ (e: "update:inputAddress", address: string): void; (e: "toggle:showContacts", show: boolean): void; }>(); -const btcAddress = computed(() => { - if (props.value && props.value.length > 66) - return props.network.displayAddress(props.value); +const solAddress = computed(() => { + if (props.value) return props.network.displayAddress(props.value); else return props.value; }); const address = computed({ get: () => isFocus.value - ? btcAddress.value - : replaceWithEllipsis(btcAddress.value, 6, 6), + ? solAddress.value + : replaceWithEllipsis(solAddress.value, 6, 6), set: (value) => emit("update:inputAddress", value), }); diff --git a/packages/extension/src/providers/solana/ui/send-transaction/components/send-alert.vue b/packages/extension/src/providers/solana/ui/send-transaction/components/send-alert.vue deleted file mode 100644 index 9f33862f8..000000000 --- a/packages/extension/src/providers/solana/ui/send-transaction/components/send-alert.vue +++ /dev/null @@ -1,72 +0,0 @@ - - - - - diff --git a/packages/extension/src/providers/solana/ui/send-transaction/components/send-token-select.vue b/packages/extension/src/providers/solana/ui/send-transaction/components/send-token-select.vue index b86d1f202..ac2d5a4f1 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/components/send-token-select.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/components/send-token-select.vue @@ -1,7 +1,7 @@ diff --git a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue index 081c6d6fb..255476b03 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue @@ -12,6 +12,13 @@
+

+ {{ errorMsg }} +

Double check the information and confirm transaction

@@ -27,13 +34,12 @@ :network="network" /> - {{ errorMsg }} @@ -86,15 +92,20 @@ import HardwareWalletMsg from "@/providers/common/ui/verify-transaction/hardware import SendProcess from "@action/views/send-process/index.vue"; import PublicKeyRing from "@/libs/keyring/public-keyring"; import { VerifyTransactionParams } from "../../types"; +import Transaction from "@/providers/ethereum/libs/transaction"; +import Web3Eth from "web3-eth"; import { getCurrentContext } from "@/libs/messenger/extension"; -import { DEFAULT_BTC_NETWORK, getNetworkByName } from "@/libs/utils/networks"; +import { DEFAULT_EVM_NETWORK, getNetworkByName } from "@/libs/utils/networks"; import { TransactionSigner } from "../../libs/signer"; import { ActivityStatus, Activity, ActivityType } from "@/types/activity"; import ActivityState from "@/libs/activity-state"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; -import { BitcoinNetwork } from "@/providers/bitcoin/types/bitcoin-network"; -import BitcoinAPI from "@/providers/bitcoin/libs/api"; +import broadcastTx from "@/providers/ethereum/libs/tx-broadcaster"; +import { BaseNetwork } from "@/types/base-network"; +import { bigIntToHex } from "@ethereumjs/util"; +import { toBN } from "web3-utils"; +import { bufferToHex, toBase } from "@enkryptcom/utils"; import { trackSendEvents } from "@/libs/metrics"; import { SendEventType } from "@/libs/metrics/types"; @@ -107,7 +118,7 @@ const txData: VerifyTransactionParams = JSON.parse( ); const isNft = ref(txData.isNFT); const isProcessing = ref(false); -const network = ref(DEFAULT_BTC_NETWORK); +const network = ref(DEFAULT_EVM_NETWORK); const isSendDone = ref(false); const account = ref(); const isPopup: boolean = getCurrentContext() === "new-window"; @@ -116,7 +127,7 @@ const isWindowPopup = ref(false); const errorMsg = ref(""); defineExpose({ verifyScrollRef }); onBeforeMount(async () => { - network.value = (await getNetworkByName(selectedNetwork)!) as BitcoinNetwork; + network.value = (await getNetworkByName(selectedNetwork))!; trackSendEvents(SendEventType.SendVerify, { network: network.value.name }); account.value = await KeyRing.getAccount(txData.fromAddress); isWindowPopup.value = account.value.isHardware; @@ -134,8 +145,11 @@ const sendAction = async () => { trackSendEvents(SendEventType.SendApprove, { network: network.value.name, }); + const web3 = new Web3Eth(network.value.node); + const tx = new Transaction(txData.TransactionData, web3); + const txActivity: Activity = { - from: network.value.displayAddress(txData.fromAddress), + from: txData.fromAddress, to: txData.toAddress, isIncoming: txData.fromAddress === txData.toAddress, network: network.value.name, @@ -155,61 +169,80 @@ const sendAction = async () => { transactionHash: "", }; const activityState = new ActivityState(); - const api = (await network.value.api()) as BitcoinAPI; - TransactionSigner({ - account: account.value!, - network: network.value as BitcoinNetwork, - payload: JSON.parse(txData.TxInfo), - }) - .then((signedTx) => { - api - .broadcastTx(signedTx.extractTransaction().toHex()) - .then(() => { - trackSendEvents(SendEventType.SendComplete, { - network: network.value.name, - }); - activityState.addActivities( - [ - { - ...txActivity, - ...{ transactionHash: signedTx.extractTransaction().getId() }, - }, - ], + await tx + .getFinalizedTransaction({ + gasPriceType: txData.gasPriceType, + totalGasPrice: toBN( + toBase(txData.gasFee.nativeValue, network.value.decimals) + ), + }) + .then(async (finalizedTx) => { + const onHash = (hash: string) => { + trackSendEvents(SendEventType.SendComplete, { + network: network.value.name, + }); + activityState.addActivities( + [ { - address: network.value.displayAddress(txData.fromAddress), - network: network.value.name, - } - ); - isSendDone.value = true; - if (getCurrentContext() === "popup") { - setTimeout(() => { - isProcessing.value = false; - router.go(-2); - }, 4500); - } else { - setTimeout(() => { - isProcessing.value = false; - window.close(); - }, 1500); - } + ...txActivity, + ...{ + transactionHash: hash, + nonce: bigIntToHex(finalizedTx.nonce), + }, + }, + ], + { address: txData.fromAddress, network: network.value.name } + ); + isSendDone.value = true; + if (getCurrentContext() === "popup") { + setTimeout(() => { + isProcessing.value = false; + router.go(-2); + }, 4500); + } else { + setTimeout(() => { + isProcessing.value = false; + window.close(); + }, 1500); + } + }; + TransactionSigner({ + account: account.value!, + network: network.value, + payload: finalizedTx, + }) + .then((signedTx) => { + broadcastTx(bufferToHex(signedTx.serialize()), network.value.name) + .then(onHash) + .catch(() => { + web3 + .sendSignedTransaction(bufferToHex(signedTx.serialize())) + .on("transactionHash", onHash) + .on("error", (error: any) => { + txActivity.status = ActivityStatus.failed; + activityState.addActivities([txActivity], { + address: txData.fromAddress, + network: network.value.name, + }); + isProcessing.value = false; + errorMsg.value = error.message; + trackSendEvents(SendEventType.SendFailed, { + network: network.value.name, + error: errorMsg.value, + }); + console.error("ERROR", error); + }); + }); }) - .catch((error) => { + .catch((e) => { + isProcessing.value = false; + errorMsg.value = e.error ? e.error.message : e.message; trackSendEvents(SendEventType.SendFailed, { network: network.value.name, - error: error.message, + error: errorMsg.value, }); - txActivity.status = ActivityStatus.failed; - activityState.addActivities([txActivity], { - address: txData.fromAddress, - network: network.value.name, - }); - console.error("ERROR", error); + console.error(e); }); - }) - .catch((error) => { - isProcessing.value = false; - console.error("error", error); - errorMsg.value = JSON.stringify(error); }); }; const isHasScroll = () => { @@ -236,6 +269,7 @@ const isHasScroll = () => { &.popup { box-shadow: none; + padding: 0 23px; } } @@ -282,7 +316,7 @@ const isHasScroll = () => { font-size: 16px; line-height: 24px; color: @secondaryLabel; - padding: 4px 141px 16px 32px; + padding: 4px 141px 13px 32px; margin: 0; &.popup { @@ -306,7 +340,7 @@ const isHasScroll = () => { position: absolute; left: 0; bottom: 0; - padding: 0 32px 32px 32px; + padding: 10px 32px 14px 32px; display: flex; justify-content: space-between; align-items: center; @@ -315,8 +349,10 @@ const isHasScroll = () => { box-sizing: border-box; &.popup { - padding: 24px; + padding: 24px 0; background: @white; + box-shadow: none !important; + border-top: 1px solid rgba(0, 0, 0, 0.05); } &.border { diff --git a/packages/extension/src/providers/solana/ui/types.ts b/packages/extension/src/providers/solana/ui/types.ts index 2020c148c..fd4758b8a 100644 --- a/packages/extension/src/providers/solana/ui/types.ts +++ b/packages/extension/src/providers/solana/ui/types.ts @@ -1,7 +1,7 @@ import { ToTokenData } from "@/ui/action/types/token"; import { EnkryptAccount } from "@enkryptcom/types"; import { GasPriceTypes } from "@/providers/common/types"; -import { BitcoinNetwork } from "../types/bitcoin-network"; +import { SolanaNetwork } from "../types/sol-network"; import { NFTItemWithCollectionName } from "@/types/nft"; export interface GasFeeInfo { @@ -35,13 +35,13 @@ export interface VerifyTransactionParams { export interface SignerTransactionOptions { payload: BTCTxInfo; - network: BitcoinNetwork; + network: SolanaNetwork; account: EnkryptAccount; } export interface SignerMessageOptions { payload: Buffer; - network: BitcoinNetwork; + network: SolanaNetwork; account: EnkryptAccount; type: string; } diff --git a/packages/extension/src/types/provider.ts b/packages/extension/src/types/provider.ts index 97ac31b34..fc5a55d19 100644 --- a/packages/extension/src/types/provider.ts +++ b/packages/extension/src/types/provider.ts @@ -2,6 +2,7 @@ import type { InjectedProvider as EthereumProvider } from "../providers/ethereum import type { InjectedProvider as PolkadotProvider } from "@/providers/polkadot/types"; import type { InjectedProvider as BitcoinProvider } from "@/providers/bitcoin/types"; import type { InjectedProvider as KadenaProvider } from "@/providers/kadena/types"; +import type { InjectedProvider as SolanaProvider } from "@/providers/solana/types"; import EventEmitter from "eventemitter3"; import { MiddlewareFunction, @@ -40,6 +41,7 @@ export enum InternalStorageNamespace { substrateAccountsState = "SubstrateAccountsState", bitcoinAccountsState = "BitcoinAccountsState", kadenaAccountsState = "KadenaAccountsState", + solanaAccountsState = "SolanaAccountsState", activityState = "ActivityState", marketData = "MarketData", cacheFetch = "CacheFetch", @@ -148,7 +150,8 @@ export type Provider = | EthereumProvider | PolkadotProvider | BitcoinProvider - | KadenaProvider; + | KadenaProvider + | SolanaProvider; export interface ProviderRequestOptions { url: string; diff --git a/packages/extension/src/ui/action/views/send-transaction/index.vue b/packages/extension/src/ui/action/views/send-transaction/index.vue index f3175ac8e..104eb202d 100644 --- a/packages/extension/src/ui/action/views/send-transaction/index.vue +++ b/packages/extension/src/ui/action/views/send-transaction/index.vue @@ -11,6 +11,7 @@ import SendTransactionSubstrate from "@/providers/polkadot/ui/send-transaction/i import SendTransactionEVM from "@/providers/ethereum/ui/send-transaction/index.vue"; import SendTransactionBTC from "@/providers/bitcoin/ui/send-transaction/index.vue"; import SendTransactionKadena from "@/providers/kadena/ui/send-transaction/index.vue"; +import SendTransactionSolana from "@/providers/solana/ui/send-transaction/index.vue"; import { useRoute } from "vue-router"; import { ProviderName } from "@/types/provider"; import { getNetworkByName } from "@/libs/utils/networks"; @@ -23,6 +24,7 @@ const sendLayouts: Record = { [ProviderName.polkadot]: SendTransactionSubstrate, [ProviderName.bitcoin]: SendTransactionBTC, [ProviderName.kadena]: SendTransactionKadena, + [ProviderName.solana]: SendTransactionSolana, [ProviderName.enkrypt]: null, }; From 65927c85f2a5f047709987415fef71565f3d8519 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 1 Aug 2024 17:41:43 -0700 Subject: [PATCH 220/375] devop: more solana additions --- .../src/providers/solana/types/sol-network.ts | 2 +- .../src/providers/solana/ui/libs/signer.ts | 17 - .../components/send-fee-select.vue | 133 +++++ .../solana/ui/send-transaction/index.vue | 528 ++++++++---------- .../verify-transaction/index.vue | 159 +++--- .../src/providers/solana/ui/types.ts | 36 +- .../action/views/verify-transaction/index.vue | 2 + 7 files changed, 442 insertions(+), 435 deletions(-) delete mode 100644 packages/extension/src/providers/solana/ui/libs/signer.ts create mode 100644 packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue diff --git a/packages/extension/src/providers/solana/types/sol-network.ts b/packages/extension/src/providers/solana/types/sol-network.ts index fb335c7dc..b6d0dc264 100644 --- a/packages/extension/src/providers/solana/types/sol-network.ts +++ b/packages/extension/src/providers/solana/types/sol-network.ts @@ -1,7 +1,7 @@ import { BaseNetwork, BaseNetworkOptions } from "@/types/base-network"; import SolAPI from "@/providers/solana/libs/api"; import { AssetsType } from "@/types/provider"; -import { BaseToken, BaseTokenOptions } from "@/types/base-token"; +import { BaseToken } from "@/types/base-token"; import { ProviderName } from "@/types/provider"; import { NetworkNames, SignerType } from "@enkryptcom/types"; import createIcon from "../libs/blockies"; diff --git a/packages/extension/src/providers/solana/ui/libs/signer.ts b/packages/extension/src/providers/solana/ui/libs/signer.ts deleted file mode 100644 index 20ed12451..000000000 --- a/packages/extension/src/providers/solana/ui/libs/signer.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { InternalOnMessageResponse } from "@/types/messenger"; -import { SignerTransactionOptions, SignerMessageOptions } from "../types"; - -import { Psbt } from "bitcoinjs-lib"; -const TransactionSigner = ( - options: SignerTransactionOptions -): Promise => { - throw new Error("btc-tx-signer not implemented"); -}; - -const MessageSigner = ( - options: SignerMessageOptions -): Promise => { - throw new Error("btc-msg-signer not implemented"); -}; - -export { TransactionSigner, MessageSigner }; diff --git a/packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue b/packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue new file mode 100644 index 000000000..31fac7429 --- /dev/null +++ b/packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index 2fa1b8867..ca9026fbe 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -80,7 +80,7 @@ - - - + />
@@ -153,21 +135,18 @@ import SendTokenSelect from "./components/send-token-select.vue"; import SendAlert from "@/providers/common/ui/send-transaction/send-alert.vue"; import SendNftSelect from "@/providers/common/ui/send-transaction/send-nft-select.vue"; import SendInputAmount from "@/providers/common/ui/send-transaction/send-input-amount.vue"; -import SendFeeSelect from "@/providers/common/ui/send-transaction/send-fee-select.vue"; -import TransactionFeeView from "@action/views/transaction-fee/index.vue"; +import SendFeeSelect from "./components/send-fee-select.vue"; import BaseButton from "@action/components/base-button/index.vue"; import { NFTItemWithCollectionName, NFTItem, NFTType } from "@/types/nft"; import { AccountsHeaderData } from "@action/types/account"; import { numberToHex, toBN } from "web3-utils"; import { GasPriceTypes, GasFeeType } from "@/providers/common/types"; -import { SolanaNetwork } from "../../types/sol-network"; +import { SolanaNetwork, getAddress } from "../../types/sol-network"; import { SOLToken } from "../../types/sol-token"; import BigNumber from "bignumber.js"; import { defaultGasCostVals } from "@/providers/common/libs/default-vals"; -import Transaction from "@/providers/ethereum/libs/transaction"; -import Web3Eth from "web3-eth"; import { fromBase, toBase, isValidDecimals } from "@enkryptcom/utils"; -import { VerifyTransactionParams } from "../types"; +import { VerifyTransactionParams, SendTransactionDataType } from "../types"; import { formatFloatingPointValue } from "@/libs/utils/number-formatter"; import { routes as RouterNames } from "@/ui/action/router"; import getUiPath from "@/libs/utils/get-ui-path"; @@ -175,10 +154,15 @@ import Browser from "webextension-polyfill"; import { ProviderName } from "@/types/provider"; import PublicKeyRing from "@/libs/keyring/public-keyring"; import { GenericNameResolver, CoinType } from "@/libs/name-resolver"; -import { NetworkNames } from "@enkryptcom/types"; import { trackSendEvents } from "@/libs/metrics"; import { SendEventType } from "@/libs/metrics/types"; import { NATIVE_TOKEN_ADDRESS } from "@/providers/ethereum/libs/common"; +import { + Transaction as SolTransaction, + SystemProgram, + PublicKey, +} from "@solana/web3.js"; +import SolanaAPI from "@/providers/solana/libs/api"; const props = defineProps({ network: { @@ -198,11 +182,12 @@ const loadingAsset = new SOLToken({ price: "0", name: "loading", contract: "0x0", - decimals: 9, + decimals: props.network.decimals, }); const route = useRoute(); const router = useRouter(); +const solConnection = ref(); const nameResolver = new GenericNameResolver(); const addressInputTo = ref(); @@ -229,11 +214,7 @@ const sendAmount = computed(() => { return "0"; }); const isMaxSelected = ref(false); -const selectedFee = ref( - props.network.name === NetworkNames.Ethereum || NetworkNames.Binance - ? GasPriceTypes.REGULAR - : GasPriceTypes.ECONOMY -); +const selectedFee = ref(GasPriceTypes.ECONOMY); const gasCostValues = ref(defaultGasCostVals); const addressFrom = ref( props.accountInfo.selectedAccount?.address ?? "" @@ -251,198 +232,121 @@ const selectedNft = ref({ type: NFTType.ERC721, }); -const showMax = computed(() => { - if (selectedAsset.value.contract !== NATIVE_TOKEN_ADDRESS) return true; - return true; +const nativeBalance = computed(() => { + const accountIndex = props.accountInfo.activeAccounts.findIndex( + (acc) => acc.address === addressFrom.value + ); + if (accountIndex !== -1) { + const balance = props.accountInfo.activeBalances[accountIndex]; + if (balance !== "~") { + return toBase(balance, props.network.decimals); + } + } + return "0"; }); -// const nativeBalance = computed(() => { -// const accountIndex = props.accountInfo.activeAccounts.findIndex( -// (acc) => acc.address === addressFrom.value -// ); +onMounted(async () => { + trackSendEvents(SendEventType.SendOpen, { network: props.network.name }); + solConnection.value = (await props.network.api()).api as SolanaAPI; + fetchAssets().then(setBaseCosts); +}); -// if (accountIndex !== -1) { -// const balance = props.accountInfo.activeBalances[accountIndex]; +const TxInfo = computed(() => { + const value = sendAmount.value + ? numberToHex(toBase(sendAmount.value, props.network.decimals)) + : "0x0"; + const toAddress = addressTo.value; + return { + from: addressFrom.value as `0x{string}`, + value: value as `0x${string}`, + to: toAddress as `0x${string}`, + }; +}); -// if (balance !== "~") { -// return toBase(balance, props.network.decimals); -// } -// } +const nativeBalanceAfterTransaction = computed(() => { + if ( + isSendToken.value && + nativeBalance.value && + selectedAsset.value && + selectedAsset.value.contract && + amount.value !== "" && + isValidDecimals(sendAmount.value, selectedAsset.value.decimals!) + ) { + let endingAmount = toBN(nativeBalance.value); + if (selectedAsset.value.contract === NATIVE_TOKEN_ADDRESS) { + const rawAmount = toBN( + toBase(amount.value, selectedAsset.value.decimals!) + ); + endingAmount = endingAmount.sub(rawAmount); + } + endingAmount = endingAmount.sub( + toBN( + toBase( + gasCostValues.value[selectedFee.value].nativeValue, + props.network.decimals + ) + ) + ); + return endingAmount; + } else if ( + !isSendToken.value && + nativeBalance.value && + selectedNft.value.id + ) { + let endingAmount = toBN(nativeBalance.value); + endingAmount = endingAmount.sub( + toBN( + toBase( + gasCostValues.value[selectedFee.value].nativeValue, + props.network.decimals + ) + ) + ); + return endingAmount; + } + return toBN(0); +}); -// return "0"; -// }); +const setTransactionFees = (tx: SolTransaction) => { + return tx + .getEstimatedFee(solConnection.value!.web3) + .then(async (fee) => { + const getConvertedVal = () => + fromBase(fee!.toString(), props.network.decimals); + const nativeVal = accountAssets.value[0].price || "0"; + gasCostValues.value[GasPriceTypes.ECONOMY] = { + nativeValue: getConvertedVal(), + fiatValue: new BigNumber(getConvertedVal()) + .times(nativeVal!) + .toString(), + nativeSymbol: props.network.currencyName, + fiatSymbol: "USD", + }; + isEstimateValid.value = true; + }) + .catch(() => { + isEstimateValid.value = false; + }); +}; -onMounted(async () => { - trackSendEvents(SendEventType.SendOpen, { network: props.network.name }); - fetchAssets(); - //.then(setBaseCosts); +const Tx = computed(() => { + const from = new PublicKey(getAddress(TxInfo.value.from)); + const transaction = new SolTransaction().add( + SystemProgram.transfer({ + fromPubkey: from, + toPubkey: TxInfo.value.to + ? new PublicKey(getAddress(TxInfo.value.to)) + : from, + lamports: toBN(TxInfo.value.value).toNumber(), + }) + ); + transaction.feePayer = from; + return transaction; }); +const setBaseCosts = async () => { + updateTransactionFees(Tx.value); +}; -// const TxInfo = computed(() => { -// const web3 = new Web3Eth(); -// const value = -// isSendToken.value && selectedAsset.value.contract === NATIVE_TOKEN_ADDRESS -// ? numberToHex(toBase(sendAmount.value, props.network.decimals)) -// : "0x0"; -// const toAddress = -// isSendToken.value && selectedAsset.value.contract === NATIVE_TOKEN_ADDRESS -// ? addressTo.value -// : isSendToken.value -// ? selectedAsset.value.contract -// : selectedNft.value.contract; -// const erc20Contract = new web3.Contract(erc20 as any); -// const erc721Contract = new web3.Contract(erc721 as any); -// const erc1155Contract = new web3.Contract(erc1155 as any); -// const data = -// isSendToken.value && selectedAsset.value.contract === NATIVE_TOKEN_ADDRESS -// ? "0x" -// : isSendToken.value -// ? erc20Contract.methods -// .transfer( -// addressTo.value, -// toBase(sendAmount.value, selectedAsset.value.decimals!) -// ) -// .encodeABI() -// : selectedNft.value.type === NFTType.ERC721 -// ? erc721Contract.methods -// .transferFrom( -// addressFrom.value, -// addressTo.value, -// selectedNft.value.id -// ) -// .encodeABI() -// : erc1155Contract.methods -// .safeTransferFrom( -// addressFrom.value, -// addressTo.value, -// selectedNft.value.id, -// 1, -// [] -// ) -// .encodeABI(); -// return { -// chainId: props.network.chainID, -// from: addressFrom.value as `0x{string}`, -// value: value as `0x${string}`, -// to: toAddress as `0x${string}`, -// data: data as `0x${string}`, -// }; -// }); -// const Tx = computed(() => { -// const web3 = new Web3Eth(props.network.node); -// const tx = new Transaction(TxInfo.value, web3); -// return tx; -// }); - -// const nativeBalanceAfterTransaction = computed(() => { -// if ( -// isSendToken.value && -// nativeBalance.value && -// selectedAsset.value && -// selectedAsset.value.contract && -// amount.value !== "" && -// isValidDecimals(sendAmount.value, selectedAsset.value.decimals!) -// ) { -// let endingAmount = toBN(nativeBalance.value); - -// if (selectedAsset.value.contract === NATIVE_TOKEN_ADDRESS) { -// const rawAmount = toBN( -// toBase(amount.value, selectedAsset.value.decimals!) -// ); -// endingAmount = endingAmount.sub(rawAmount); -// } - -// endingAmount = endingAmount.sub( -// toBN( -// toBase( -// gasCostValues.value[selectedFee.value].nativeValue, -// props.network.decimals -// ) -// ) -// ); - -// return endingAmount; -// } else if ( -// !isSendToken.value && -// nativeBalance.value && -// selectedNft.value.id -// ) { -// let endingAmount = toBN(nativeBalance.value); -// endingAmount = endingAmount.sub( -// toBN( -// toBase( -// gasCostValues.value[selectedFee.value].nativeValue, -// props.network.decimals -// ) -// ) -// ); -// return endingAmount; -// } - -// return toBN(0); -// }); - -// const setTransactionFees = (tx: Transaction) => { -// return tx -// .getGasCosts() -// .then(async (gasvals) => { -// const getConvertedVal = (type: GasPriceTypes) => -// fromBase(gasvals[type], props.network.decimals); -// const nativeVal = accountAssets.value[0].price || "0"; -// gasCostValues.value = { -// [GasPriceTypes.ECONOMY]: { -// nativeValue: getConvertedVal(GasPriceTypes.ECONOMY), -// fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.ECONOMY)) -// .times(nativeVal!) -// .toString(), -// nativeSymbol: props.network.currencyName, -// fiatSymbol: "USD", -// }, -// [GasPriceTypes.REGULAR]: { -// nativeValue: getConvertedVal(GasPriceTypes.REGULAR), -// fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.REGULAR)) -// .times(nativeVal!) -// .toString(), -// nativeSymbol: props.network.currencyName, -// fiatSymbol: "USD", -// }, -// [GasPriceTypes.FAST]: { -// nativeValue: getConvertedVal(GasPriceTypes.FAST), -// fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FAST)) -// .times(nativeVal!) -// .toString(), -// nativeSymbol: props.network.currencyName, -// fiatSymbol: "USD", -// }, -// [GasPriceTypes.FASTEST]: { -// nativeValue: getConvertedVal(GasPriceTypes.FASTEST), -// fiatValue: new BigNumber(getConvertedVal(GasPriceTypes.FASTEST)) -// .times(nativeVal!) -// .toString(), -// nativeSymbol: props.network.currencyName, -// fiatSymbol: "USD", -// }, -// }; -// isEstimateValid.value = true; -// }) -// .catch(() => { -// isEstimateValid.value = false; -// }); -// }; - -// const setBaseCosts = () => { -// const web3 = new Web3Eth(props.network.node); -// const tx = new Transaction( -// { -// chainId: props.network.chainID, -// from: props.accountInfo.selectedAccount!.address as `0x{string}`, -// value: "0x0", -// to: NATIVE_TOKEN_ADDRESS, -// }, -// web3 -// ); -// updateTransactionFees(tx); -// }; const fetchAssets = () => { accountAssets.value = []; selectedAsset.value = loadingAsset; @@ -470,14 +374,14 @@ const sendButtonTitle = computed(() => { }); const isValidSend = computed(() => { - // if (!isInputsValid.value) return false; - // if (nativeBalanceAfterTransaction.value.isNeg()) return false; - // if (!isEstimateValid.value) return false; + if (!isInputsValid.value) return false; + if (nativeBalanceAfterTransaction.value.isNeg()) return false; + if (!isEstimateValid.value) return false; return true; }); const isInputsValid = computed(() => { - if (!props.network.isAddress(addressTo.value)) return false; + if (!props.network.isAddress(getAddress(addressTo.value))) return false; if ( isSendToken.value && !isValidDecimals(sendAmount.value, selectedAsset.value.decimals!) @@ -488,38 +392,38 @@ const isInputsValid = computed(() => { return false; } if (new BigNumber(sendAmount.value).gt(assetMaxValue.value)) return false; - if (gasCostValues.value.REGULAR.nativeValue === "0") return false; + if (gasCostValues.value.ECONOMY.nativeValue === "0") return false; return true; }); -const updateTransactionFees = (tx: Transaction) => { +const updateTransactionFees = (tx: SolTransaction) => { if (isMaxSelected.value) { amount.value = ""; } - // setTransactionFees(tx).then(() => { - // if (isMaxSelected.value) { - // amount.value = - // parseFloat(assetMaxValue.value) < 0 ? "0" : assetMaxValue.value; - // } - // }); + solConnection.value!.web3.getLatestBlockhash().then((bhash) => { + tx.recentBlockhash = bhash.blockhash; + setTransactionFees(tx).then(() => { + if (isMaxSelected.value) { + amount.value = + parseFloat(assetMaxValue.value) < 0 ? "0" : assetMaxValue.value; + } + }); + }); }; const isOpenSelectContactFrom = ref(false); const isOpenSelectContactTo = ref(false); const isOpenSelectToken = ref(false); - -const isOpenSelectFee = ref(false); - const isOpenSelectNft = ref(false); -// watch( -// [isInputsValid, addressTo, selectedAsset, selectedNft, isSendToken], -// () => { -// if (isInputsValid.value) { -// updateTransactionFees(Tx.value); -// } -// } -// ); +watch( + [isInputsValid, addressTo, selectedAsset, selectedNft, isSendToken], + () => { + if (isInputsValid.value) { + updateTransactionFees(Tx.value); + } + } +); watch([isSendToken], () => { inputAmount("0"); @@ -558,9 +462,9 @@ const assetMaxValue = computed(() => { }); const setMaxValue = () => { isMaxSelected.value = true; - // if (isInputsValid.value) { - // updateTransactionFees(Tx.value); - // } + if (isInputsValid.value) { + updateTransactionFees(Tx.value); + } }; const inputAddressFrom = (text: string) => { addressFrom.value = text; @@ -616,74 +520,84 @@ const inputAmount = (inputAmount: string) => { const inputAmountBn = new BigNumber(inputAmount); isMaxSelected.value = false; amount.value = inputAmountBn.lt(0) ? "0" : inputAmount; - // if (isInputsValid.value) { - // updateTransactionFees(Tx.value); - // } -}; - -const toggleSelectFee = () => { - isOpenSelectFee.value = !isOpenSelectFee.value; -}; - -const selectFee = (type: GasPriceTypes) => { - selectedFee.value = type; - isOpenSelectFee.value = false; - // if (isMaxSelected.value && isInputsValid.value) - // updateTransactionFees(Tx.value); + if (isInputsValid.value) { + updateTransactionFees(Tx.value); + } }; const sendAction = async () => { - // const keyring = new PublicKeyRing(); - // const fromAccountInfo = await keyring.getAccount( - // addressFrom.value.toLowerCase() - // ); - // const txVerifyInfo: VerifyTransactionParams = { - // TransactionData: TxInfo.value, - // isNFT: !isSendToken.value, - // NFTData: !isSendToken.value ? selectedNft.value : undefined, - // toToken: { - // amount: toBase(sendAmount.value, selectedAsset.value.decimals!), - // decimals: selectedAsset.value.decimals!, - // icon: selectedAsset.value.icon as string, - // symbol: selectedAsset.value.symbol || "unknown", - // valueUSD: new BigNumber(selectedAsset.value.price || "0") - // .times(sendAmount.value) - // .toString(), - // name: selectedAsset.value.name || "", - // price: selectedAsset.value.price || "0", - // }, - // fromAddress: fromAccountInfo.address, - // fromAddressName: fromAccountInfo.name, - // gasFee: gasCostValues.value[selectedFee.value], - // gasPriceType: selectedFee.value, - // toAddress: addressTo.value, - // }; - // const routedRoute = router.resolve({ - // name: RouterNames.verify.name, - // query: { - // id: selected, - // txData: Buffer.from(JSON.stringify(txVerifyInfo), "utf8").toString( - // "base64" - // ), - // }, + const keyring = new PublicKeyRing(); + const fromAccountInfo = await keyring.getAccount( + addressFrom.value.toLowerCase() + ); + // const transaction = Tx.value; + // transaction.recentBlockhash = ( + // await solConnection.value!.web3.getLatestBlockhash() + // ).blockhash; + // const msgToSign = transaction.serializeMessage(); + // sendUsingInternalMessengers({ + // method: InternalMethods.sign, + // params: [bufferToHex(msgToSign), fromAccountInfo], + // }).then((res) => { + // if (res.error) return res; + // transaction.addSignature( + // transaction.feePayer!, + // hexToBuffer(JSON.parse(res.result!)) + // ); + // console.log(transaction.verifySignatures(true)); + // solConnection + // .value!.web3.sendRawTransaction(transaction.serialize()) + // .then((hash) => { + // console.log(`https://solscan.io/tx/${hash}`); + // }); // }); - // if (fromAccountInfo.isHardware) { - // await Browser.windows.create({ - // url: Browser.runtime.getURL( - // getUiPath( - // `eth-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, - // ProviderName.ethereum - // ) - // ), - // type: "popup", - // focused: true, - // height: 600, - // width: 460, - // }); - // window.close(); - // } else { - // router.push(routedRoute); - // } + const txVerifyInfo: VerifyTransactionParams = { + TransactionData: TxInfo.value, + isNFT: !isSendToken.value, + NFTData: !isSendToken.value ? selectedNft.value : undefined, + toToken: { + amount: toBase(sendAmount.value, selectedAsset.value.decimals!), + decimals: selectedAsset.value.decimals!, + icon: selectedAsset.value.icon as string, + symbol: selectedAsset.value.symbol || "unknown", + valueUSD: new BigNumber(selectedAsset.value.price || "0") + .times(sendAmount.value) + .toString(), + name: selectedAsset.value.name || "", + price: selectedAsset.value.price || "0", + }, + fromAddress: fromAccountInfo.address, + fromAddressName: fromAccountInfo.name, + gasFee: gasCostValues.value[selectedFee.value], + gasPriceType: selectedFee.value, + toAddress: addressTo.value, + }; + const routedRoute = router.resolve({ + name: RouterNames.verify.name, + query: { + id: selected, + txData: Buffer.from(JSON.stringify(txVerifyInfo), "utf8").toString( + "base64" + ), + }, + }); + if (fromAccountInfo.isHardware) { + await Browser.windows.create({ + url: Browser.runtime.getURL( + getUiPath( + `eth-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, + ProviderName.ethereum + ) + ), + type: "popup", + focused: true, + height: 600, + width: 460, + }); + window.close(); + } else { + router.push(routedRoute); + } }; const toggleSelector = (isTokenSend: boolean) => { diff --git a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue index 255476b03..59fff281f 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue @@ -92,22 +92,26 @@ import HardwareWalletMsg from "@/providers/common/ui/verify-transaction/hardware import SendProcess from "@action/views/send-process/index.vue"; import PublicKeyRing from "@/libs/keyring/public-keyring"; import { VerifyTransactionParams } from "../../types"; -import Transaction from "@/providers/ethereum/libs/transaction"; -import Web3Eth from "web3-eth"; import { getCurrentContext } from "@/libs/messenger/extension"; import { DEFAULT_EVM_NETWORK, getNetworkByName } from "@/libs/utils/networks"; -import { TransactionSigner } from "../../libs/signer"; import { ActivityStatus, Activity, ActivityType } from "@/types/activity"; import ActivityState from "@/libs/activity-state"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; -import broadcastTx from "@/providers/ethereum/libs/tx-broadcaster"; import { BaseNetwork } from "@/types/base-network"; -import { bigIntToHex } from "@ethereumjs/util"; import { toBN } from "web3-utils"; -import { bufferToHex, toBase } from "@enkryptcom/utils"; +import { bufferToHex, hexToBuffer } from "@enkryptcom/utils"; import { trackSendEvents } from "@/libs/metrics"; import { SendEventType } from "@/libs/metrics/types"; +import { + Transaction as SolTransaction, + SystemProgram, + PublicKey, +} from "@solana/web3.js"; +import { getAddress } from "@/providers/solana/types/sol-network"; +import SolanaAPI from "@/providers/solana/libs/api"; +import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; +import { InternalMethods } from "@/types/messenger"; const KeyRing = new PublicKeyRing(); const route = useRoute(); @@ -145,8 +149,15 @@ const sendAction = async () => { trackSendEvents(SendEventType.SendApprove, { network: network.value.name, }); - const web3 = new Web3Eth(network.value.node); - const tx = new Transaction(txData.TransactionData, web3); + const from = new PublicKey(getAddress(txData.TransactionData.from)); + const transaction = new SolTransaction().add( + SystemProgram.transfer({ + fromPubkey: from, + toPubkey: new PublicKey(getAddress(txData.TransactionData.to)), + lamports: toBN(txData.TransactionData.value).toNumber(), + }) + ); + transaction.feePayer = from; const txActivity: Activity = { from: txData.fromAddress, @@ -169,81 +180,69 @@ const sendAction = async () => { transactionHash: "", }; const activityState = new ActivityState(); - await tx - .getFinalizedTransaction({ - gasPriceType: txData.gasPriceType, - totalGasPrice: toBN( - toBase(txData.gasFee.nativeValue, network.value.decimals) - ), - }) - .then(async (finalizedTx) => { - const onHash = (hash: string) => { - trackSendEvents(SendEventType.SendComplete, { - network: network.value.name, - }); - activityState.addActivities( - [ - { - ...txActivity, - ...{ - transactionHash: hash, - nonce: bigIntToHex(finalizedTx.nonce), - }, + const solAPI = (await network.value.api()).api as SolanaAPI; + transaction.recentBlockhash = ( + await solAPI.web3.getLatestBlockhash() + ).blockhash; + const msgToSign = transaction.serializeMessage(); + sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [bufferToHex(msgToSign), account.value!], + }).then((res) => { + if (res.error) return res; + transaction.addSignature( + transaction.feePayer!, + hexToBuffer(JSON.parse(res.result!)) + ); + const onHash = (hash: string) => { + trackSendEvents(SendEventType.SendComplete, { + network: network.value.name, + }); + activityState.addActivities( + [ + { + ...txActivity, + ...{ + transactionHash: hash, }, - ], - { address: txData.fromAddress, network: network.value.name } - ); - isSendDone.value = true; - if (getCurrentContext() === "popup") { - setTimeout(() => { - isProcessing.value = false; - router.go(-2); - }, 4500); - } else { - setTimeout(() => { - isProcessing.value = false; - window.close(); - }, 1500); - } - }; - TransactionSigner({ - account: account.value!, - network: network.value, - payload: finalizedTx, - }) - .then((signedTx) => { - broadcastTx(bufferToHex(signedTx.serialize()), network.value.name) - .then(onHash) - .catch(() => { - web3 - .sendSignedTransaction(bufferToHex(signedTx.serialize())) - .on("transactionHash", onHash) - .on("error", (error: any) => { - txActivity.status = ActivityStatus.failed; - activityState.addActivities([txActivity], { - address: txData.fromAddress, - network: network.value.name, - }); - isProcessing.value = false; - errorMsg.value = error.message; - trackSendEvents(SendEventType.SendFailed, { - network: network.value.name, - error: errorMsg.value, - }); - console.error("ERROR", error); - }); - }); - }) - .catch((e) => { + }, + ], + { address: txData.fromAddress, network: network.value.name } + ); + isSendDone.value = true; + if (getCurrentContext() === "popup") { + setTimeout(() => { + isProcessing.value = false; + router.go(-2); + }, 4500); + } else { + setTimeout(() => { isProcessing.value = false; - errorMsg.value = e.error ? e.error.message : e.message; - trackSendEvents(SendEventType.SendFailed, { - network: network.value.name, - error: errorMsg.value, - }); - console.error(e); + window.close(); + }, 1500); + } + }; + solAPI.web3 + .sendRawTransaction(transaction.serialize()) + .then((hash) => { + onHash(hash); + console.log(`https://solscan.io/tx/${hash}`); + }) + .catch((e) => { + txActivity.status = ActivityStatus.failed; + activityState.addActivities([txActivity], { + address: txData.fromAddress, + network: network.value.name, }); - }); + isProcessing.value = false; + errorMsg.value = e.message; + trackSendEvents(SendEventType.SendFailed, { + network: network.value.name, + error: errorMsg.value, + }); + console.error("ERROR", e); + }); + }); }; const isHasScroll = () => { if (verifyScrollRef.value) { diff --git a/packages/extension/src/providers/solana/ui/types.ts b/packages/extension/src/providers/solana/ui/types.ts index fd4758b8a..d30908268 100644 --- a/packages/extension/src/providers/solana/ui/types.ts +++ b/packages/extension/src/providers/solana/ui/types.ts @@ -1,27 +1,17 @@ import { ToTokenData } from "@/ui/action/types/token"; import { EnkryptAccount } from "@enkryptcom/types"; -import { GasPriceTypes } from "@/providers/common/types"; +import { GasFeeInfo, GasPriceTypes } from "@/providers/common/types"; import { SolanaNetwork } from "../types/sol-network"; import { NFTItemWithCollectionName } from "@/types/nft"; -export interface GasFeeInfo { - nativeValue: string; - fiatValue: string; - nativeSymbol: string; - fiatSymbol: string; -} -export interface BTCTxInfo { - inputs: any[]; - outputs: { address: string; value: number }[]; -} -export interface GasFeeType { - [GasPriceTypes.ECONOMY]: GasFeeInfo; - [GasPriceTypes.REGULAR]: GasFeeInfo; - [GasPriceTypes.FAST]: GasFeeInfo; - [GasPriceTypes.FASTEST]: GasFeeInfo; +export interface SendTransactionDataType { + from: `0x${string}`; + value: `0x${string}`; + to: `0x${string}`; } export interface VerifyTransactionParams { + TransactionData: SendTransactionDataType; isNFT: boolean; NFTData?: NFTItemWithCollectionName; fromAddress: string; @@ -30,18 +20,4 @@ export interface VerifyTransactionParams { toToken: ToTokenData; gasFee: GasFeeInfo; gasPriceType: GasPriceTypes; - TxInfo: string; -} - -export interface SignerTransactionOptions { - payload: BTCTxInfo; - network: SolanaNetwork; - account: EnkryptAccount; -} - -export interface SignerMessageOptions { - payload: Buffer; - network: SolanaNetwork; - account: EnkryptAccount; - type: string; } diff --git a/packages/extension/src/ui/action/views/verify-transaction/index.vue b/packages/extension/src/ui/action/views/verify-transaction/index.vue index 4744c7040..46d26e7a5 100644 --- a/packages/extension/src/ui/action/views/verify-transaction/index.vue +++ b/packages/extension/src/ui/action/views/verify-transaction/index.vue @@ -7,6 +7,7 @@ import VerifyTransactionSubstrate from "@/providers/polkadot/ui/send-transaction import VerifyTransactionEVM from "@/providers/ethereum/ui/send-transaction/verify-transaction/index.vue"; import VerifyTransactionBTC from "@/providers/bitcoin/ui/send-transaction/verify-transaction/index.vue"; import VerifyTransactionKadena from "@/providers/kadena/ui/send-transaction/verify-transaction/index.vue"; +import VerifyTransactionSolana from "@/providers/solana/ui/send-transaction/verify-transaction/index.vue"; import { useRoute } from "vue-router"; import { ProviderName } from "@/types/provider"; import { getNetworkByName } from "@/libs/utils/networks"; @@ -17,6 +18,7 @@ const sendLayouts: Record = { [ProviderName.polkadot]: VerifyTransactionSubstrate, [ProviderName.bitcoin]: VerifyTransactionBTC, [ProviderName.kadena]: VerifyTransactionKadena, + [ProviderName.solana]: VerifyTransactionSolana, [ProviderName.enkrypt]: null, }; const layout = shallowRef(); From 51a6559c129f989a4a63f3ce8a69b3aa4a88857b Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 5 Aug 2024 11:28:00 -0700 Subject: [PATCH 221/375] devop: minor changes --- packages/extension/src/providers/solana/ui/types.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/extension/src/providers/solana/ui/types.ts b/packages/extension/src/providers/solana/ui/types.ts index d30908268..00681a2e4 100644 --- a/packages/extension/src/providers/solana/ui/types.ts +++ b/packages/extension/src/providers/solana/ui/types.ts @@ -1,7 +1,5 @@ import { ToTokenData } from "@/ui/action/types/token"; -import { EnkryptAccount } from "@enkryptcom/types"; import { GasFeeInfo, GasPriceTypes } from "@/providers/common/types"; -import { SolanaNetwork } from "../types/sol-network"; import { NFTItemWithCollectionName } from "@/types/nft"; export interface SendTransactionDataType { @@ -20,4 +18,5 @@ export interface VerifyTransactionParams { toToken: ToTokenData; gasFee: GasFeeInfo; gasPriceType: GasPriceTypes; + TxInfo: string; } From f3f923945d363a7633cc8d5ba3f90de90be936f9 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 5 Aug 2024 11:39:46 -0700 Subject: [PATCH 222/375] devop: update more packages --- package.json | 2 +- packages/extension-bridge/package.json | 8 +- packages/extension/package.json | 16 +- packages/hw-wallets/package.json | 6 +- packages/keyring/package.json | 6 +- packages/name-resolution/package.json | 6 +- packages/request/package.json | 6 +- packages/signers/bitcoin/package.json | 6 +- packages/signers/ethereum/package.json | 6 +- packages/signers/kadena/package.json | 6 +- packages/signers/polkadot/package.json | 6 +- packages/storage/package.json | 6 +- packages/swap/package.json | 8 +- packages/types/package.json | 4 +- packages/utils/package.json | 6 +- yarn.lock | 881 +++++++++++++++---------- 16 files changed, 568 insertions(+), 411 deletions(-) diff --git a/package.json b/package.json index 9042a6279..08e451071 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "devDependencies": { "@commitlint/cli": "^19.3.0", "@commitlint/config-conventional": "^19.2.2", - "@swc/core": "^1.7.3", + "@swc/core": "^1.7.6", "concurrently": "^8.2.2", "husky": "^9.1.4", "node-notifier": "^10.0.1", diff --git a/packages/extension-bridge/package.json b/packages/extension-bridge/package.json index 404a2cf24..679264670 100644 --- a/packages/extension-bridge/package.json +++ b/packages/extension-bridge/package.json @@ -39,13 +39,13 @@ "webextension-polyfill": "^0.12.0" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@types/webextension-polyfill": "^0.10.7", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "bumpp": "^9.4.1", + "bumpp": "^9.4.2", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", @@ -55,7 +55,7 @@ "prettier": "^2.8.8", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "type-fest": "^4.23.0", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" diff --git a/packages/extension/package.json b/packages/extension/package.json index 19a09d208..22d410217 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -21,7 +21,7 @@ "watch-vue-firefox": "cross-env BROWSER='firefox' vue-cli-service build --watch --no-clean" }, "dependencies": { - "@amplitude/analytics-browser": "^2.9.3", + "@amplitude/analytics-browser": "^2.10.0", "@babel/runtime": "^7.25.0", "@enkryptcom/extension-bridge": "workspace:^", "@enkryptcom/hw-wallets": "workspace:^", @@ -50,7 +50,7 @@ "bitcoinjs-lib": "^6.1.6", "chai": "^4.5.0", "concurrently": "^8.2.2", - "core-js": "^3.37.1", + "core-js": "^3.38.0", "echarts": "^5.5.1", "ethereum-cryptography": "^2.2.1", "ethereumjs-abi": "^0.6.8", @@ -66,9 +66,9 @@ "switch-ts": "^1.1.1", "url-parse": "^1.5.10", "uuid": "^10.0.0", - "vue": "^3.4.34", - "vue-echarts": "7.0.0-beta.0", - "vue-router": "4.4.0", + "vue": "^3.4.35", + "vue-echarts": "7.0.1", + "vue-router": "4.4.2", "vue3-lottie": "^3.3.0", "vuedraggable": "^4.1.0", "web3-eth": "^1.10.4", @@ -85,7 +85,7 @@ "@polkadot/rpc-provider": "^12.2.3", "@polkadot/types": "^12.2.3", "@polkadot/types-known": "^12.2.3", - "@polkadot/ui-shared": "^3.8.2", + "@polkadot/ui-shared": "^3.8.3", "@polkadot/util": "^13.0.2", "@polkadot/wasm-crypto": "^7.3.2", "@rollup/plugin-commonjs": "^26.0.1", @@ -119,12 +119,12 @@ "path-browserify": "^1.0.1", "prettier": "^2.8.8", "rimraf": "^6.0.1", - "rollup": "^4.19.1", + "rollup": "^4.20.0", "rollup-plugin-uglify": "^6.0.4", "semver": "^7.6.3", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", - "systeminformation": "^5.22.11", + "systeminformation": "^5.23.3", "ts-mocha": "^10.0.0", "tsconfig-paths": "^4.2.0", "typescript": "^4.9.5", diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 000bc7003..c84a04cc9 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -16,9 +16,9 @@ "node": ">=14.15.0" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -33,7 +33,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/keyring/package.json b/packages/keyring/package.json index 8e2dfc696..5ca581b75 100644 --- a/packages/keyring/package.json +++ b/packages/keyring/package.json @@ -29,9 +29,9 @@ "bip39": "^3.1.0" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -46,7 +46,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/name-resolution/package.json b/packages/name-resolution/package.json index 247381d7e..35d909035 100644 --- a/packages/name-resolution/package.json +++ b/packages/name-resolution/package.json @@ -16,9 +16,9 @@ "node": ">=14.15.0" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -33,7 +33,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/request/package.json b/packages/request/package.json index bf43ce92f..5566eb09b 100644 --- a/packages/request/package.json +++ b/packages/request/package.json @@ -26,9 +26,9 @@ "ws": "^8.18.0" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -43,7 +43,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/bitcoin/package.json b/packages/signers/bitcoin/package.json index 5735e2003..897a37433 100644 --- a/packages/signers/bitcoin/package.json +++ b/packages/signers/bitcoin/package.json @@ -27,10 +27,10 @@ }, "devDependencies": { "@enkryptcom/types": "workspace:^", - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/hdkey": "^2.0.3", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -44,7 +44,7 @@ "ts-mocha": "^9.0.2", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/ethereum/package.json b/packages/signers/ethereum/package.json index 7dd6b8acb..f6570b49b 100644 --- a/packages/signers/ethereum/package.json +++ b/packages/signers/ethereum/package.json @@ -27,10 +27,10 @@ }, "devDependencies": { "@enkryptcom/types": "workspace:^", - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/hdkey": "^2.0.3", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -44,7 +44,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/kadena/package.json b/packages/signers/kadena/package.json index 0c2386f57..07f476e9f 100644 --- a/packages/signers/kadena/package.json +++ b/packages/signers/kadena/package.json @@ -25,10 +25,10 @@ "devDependencies": { "@enkryptcom/types": "workspace:^", "@polkadot/util-crypto": "^13.0.2", - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/hdkey": "^2.0.3", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -42,7 +42,7 @@ "ts-mocha": "^9.0.2", "ts-node": "^10.9.2", "tsconfig-paths": "^3.15.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/signers/polkadot/package.json b/packages/signers/polkadot/package.json index 7b7b835a1..41a3dba08 100644 --- a/packages/signers/polkadot/package.json +++ b/packages/signers/polkadot/package.json @@ -27,9 +27,9 @@ }, "devDependencies": { "@enkryptcom/types": "workspace:^", - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -43,7 +43,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/storage/package.json b/packages/storage/package.json index 051da9b82..758e0d59d 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -22,9 +22,9 @@ "localforage": "^1.10.0" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -38,7 +38,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/swap/package.json b/packages/swap/package.json index 4cdf15dff..ac953e7fc 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -24,7 +24,7 @@ "json-rpc-2.0": "^1.7.0", "lodash": "^4.17.21", "node-fetch": "^2.7.0", - "rango-sdk-basic": "^0.1.51", + "rango-sdk-basic": "^0.1.52", "reconnecting-websocket": "^4.4.0", "uuid": "^10.0.0", "web3-eth": "^1.10.4", @@ -32,9 +32,9 @@ "ws": "^8.18.0" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -49,7 +49,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/types/package.json b/packages/types/package.json index d923580c0..837d0e162 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -18,7 +18,7 @@ "node": ">=14.15.0" }, "devDependencies": { - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -30,7 +30,7 @@ "prettier": "^2.8.8", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/packages/utils/package.json b/packages/utils/package.json index df8a32b9d..a10c8ff46 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -26,9 +26,9 @@ "web3-utils": "^1.10.4" }, "devDependencies": { - "@types/chai": "^4.3.16", + "@types/chai": "^4.3.17", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.13", + "@types/node": "^20.14.14", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", @@ -42,7 +42,7 @@ "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "tsup": "^8.2.3", + "tsup": "^8.2.4", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" }, diff --git a/yarn.lock b/yarn.lock index b1d307b7b..5c2aff17a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,28 +30,30 @@ __metadata: languageName: node linkType: hard -"@amplitude/analytics-browser@npm:^2.9.3": - version: 2.9.3 - resolution: "@amplitude/analytics-browser@npm:2.9.3" - dependencies: - "@amplitude/analytics-client-common": ^2.2.4 - "@amplitude/analytics-core": ^2.3.0 - "@amplitude/analytics-types": ^2.6.0 - "@amplitude/plugin-page-view-tracking-browser": ^2.2.17 +"@amplitude/analytics-browser@npm:^2.10.0": + version: 2.10.0 + resolution: "@amplitude/analytics-browser@npm:2.10.0" + dependencies: + "@amplitude/analytics-client-common": ^2.3.0 + "@amplitude/analytics-core": ^2.4.0 + "@amplitude/analytics-remote-config": ^0.3.0 + "@amplitude/analytics-types": ^2.7.0 + "@amplitude/plugin-autocapture-browser": ^1.0.0 + "@amplitude/plugin-page-view-tracking-browser": ^2.2.18 tslib: ^2.4.1 - checksum: f7d858ec2e0a3657192e174f3de7d0775683bd9ed136a440d3caa7d346e89c8f2bb193954df51e55c6fa888947c24ca19de613c6fec3925aef4179dd0f751c55 + checksum: 0cf359745dc1b500b0eb6b5d2e1c917eb227e8d2d3506534670b3d3204735fd126783627f5c8dacbc0856aa1d4ea3b30aea448e226252f101c5c1b4705567237 languageName: node linkType: hard -"@amplitude/analytics-client-common@npm:^2.2.4": - version: 2.2.4 - resolution: "@amplitude/analytics-client-common@npm:2.2.4" +"@amplitude/analytics-client-common@npm:>=1 <3, @amplitude/analytics-client-common@npm:^2.3.0": + version: 2.3.0 + resolution: "@amplitude/analytics-client-common@npm:2.3.0" dependencies: "@amplitude/analytics-connector": ^1.4.8 - "@amplitude/analytics-core": ^2.3.0 - "@amplitude/analytics-types": ^2.6.0 + "@amplitude/analytics-core": ^2.4.0 + "@amplitude/analytics-types": ^2.7.0 tslib: ^2.4.1 - checksum: 17f0c205b97ad6e4e778fa2664e72e04cc28a8e18ee51b4e5bd706bc572817d62c9bd20102daf8e1069a655eb7a3b55255f82bd01c4e21eeff3e1034cbd17c75 + checksum: fe2893281b2ca81466267e1c9eac31056403f6d24d8f81dda73d41f490500c6455c5a8b6391edeba418c939660f2c1c64ebf53dd64288ff9847bd22f9df2852c languageName: node linkType: hard @@ -62,31 +64,56 @@ __metadata: languageName: node linkType: hard -"@amplitude/analytics-core@npm:^2.3.0": - version: 2.3.0 - resolution: "@amplitude/analytics-core@npm:2.3.0" +"@amplitude/analytics-core@npm:>=1 <3, @amplitude/analytics-core@npm:^2.4.0": + version: 2.4.0 + resolution: "@amplitude/analytics-core@npm:2.4.0" dependencies: - "@amplitude/analytics-types": ^2.6.0 + "@amplitude/analytics-types": ^2.7.0 tslib: ^2.4.1 - checksum: f200fe048c3f27104febd835e31bfcbd944dfef569a6dab3bcbda9087dc569a4d679a94b7f9ba3e1340b2cf6423789ff46fea1c4b8c70f52b53a9d3b25002bd8 + checksum: b914cf8316c599a9ebe29f17aed759f30694b2524a0afeef4d9517209577b576032ace745424721cb361f8f627328e215ace634fb3fe6b7fcd57366544ff0b46 languageName: node linkType: hard -"@amplitude/analytics-types@npm:^2.6.0": - version: 2.6.0 - resolution: "@amplitude/analytics-types@npm:2.6.0" - checksum: eea3e13e329dc515acc37bd0d669e7e75748484c8995624f4a65a21897df8ba1d5c64e4a776ab6a645025209ab10d366d82f5a5f0ad9e665dbbc818f6e54d892 +"@amplitude/analytics-remote-config@npm:^0.3.0": + version: 0.3.4 + resolution: "@amplitude/analytics-remote-config@npm:0.3.4" + dependencies: + "@amplitude/analytics-client-common": ">=1 <3" + "@amplitude/analytics-core": ">=1 <3" + "@amplitude/analytics-types": ">=1 <3" + idb: ^8.0.0 + tslib: ^2.4.1 + checksum: 6a8ebd447c23d21c7edb0d58326dad8fea5fc4ea0029ae464685b5a5c0988cc4969f4bbd649681ba3c007ba0eddfdaf26d801b8d3ed40000f7477955be8ee3a7 + languageName: node + linkType: hard + +"@amplitude/analytics-types@npm:>=1 <3, @amplitude/analytics-types@npm:^2.7.0": + version: 2.7.0 + resolution: "@amplitude/analytics-types@npm:2.7.0" + checksum: 2a187f4ac1e05a68ba3f3f6a3a05a3783ceaff159330b31291a4c3aec3f0a73999ded6a4489a76e52b805c99a038296cd85db7860a07219e09dbf7004f10fe92 languageName: node linkType: hard -"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.17": - version: 2.2.17 - resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.17" +"@amplitude/plugin-autocapture-browser@npm:^1.0.0": + version: 1.0.0 + resolution: "@amplitude/plugin-autocapture-browser@npm:1.0.0" + dependencies: + "@amplitude/analytics-client-common": ">=1 <3" + "@amplitude/analytics-types": ">=1 <3" + rxjs: ^7.8.1 + tslib: ^2.4.1 + checksum: 4c37ee21f93520fb8adc79b9b2de57e612c23af2e1c7e3c5fca0ae03a71bcdf447a103daf656e626e8899963d1dadfa307807f4abe240d52a0a0dd589710eed1 + languageName: node + linkType: hard + +"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.18": + version: 2.2.18 + resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.18" dependencies: - "@amplitude/analytics-client-common": ^2.2.4 - "@amplitude/analytics-types": ^2.6.0 + "@amplitude/analytics-client-common": ^2.3.0 + "@amplitude/analytics-types": ^2.7.0 tslib: ^2.4.1 - checksum: 8b1e763b7a073361dd29d29a2f59b010e19262cfce0115f570702436e9f16569cd7babc305c6d32fe3fb4b92ffacdd425ab4c28b8089174d22135b175b710ed5 + checksum: ab0d8a1a400ee1377a8b1d53bd8fe9e45de113596b9dacb3d92c23f7f137bce98b63f930dfedc70bcce0c2f239582c644ff930cd6cc87af912e0c4096368cf13 languageName: node linkType: hard @@ -2729,13 +2756,13 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/extension-bridge@workspace:packages/extension-bridge" dependencies: - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@types/webextension-polyfill": ^0.10.7 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 - bumpp: ^9.4.1 + bumpp: ^9.4.2 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 @@ -2748,7 +2775,7 @@ __metadata: tiny-uid: ^1.1.2 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 type-fest: ^4.23.0 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 @@ -2760,7 +2787,7 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/extension@workspace:packages/extension" dependencies: - "@amplitude/analytics-browser": ^2.9.3 + "@amplitude/analytics-browser": ^2.10.0 "@babel/plugin-transform-class-static-block": ^7.24.7 "@babel/runtime": ^7.25.0 "@enkryptcom/extension-bridge": "workspace:^" @@ -2784,7 +2811,7 @@ __metadata: "@polkadot/rpc-provider": ^12.2.3 "@polkadot/types": ^12.2.3 "@polkadot/types-known": ^12.2.3 - "@polkadot/ui-shared": ^3.8.2 + "@polkadot/ui-shared": ^3.8.3 "@polkadot/util": ^13.0.2 "@polkadot/wasm-crypto": ^7.3.2 "@rollup/plugin-commonjs": ^26.0.1 @@ -2818,7 +2845,7 @@ __metadata: buffer: ^6.0.3 chai: ^4.5.0 concurrently: ^8.2.2 - core-js: ^3.37.1 + core-js: ^3.38.0 cross-env: ^7.0.3 crypto-browserify: ^3.12.0 echarts: ^5.5.1 @@ -2844,22 +2871,22 @@ __metadata: prettier: ^2.8.8 qrcode.vue: ^3.4.1 rimraf: ^6.0.1 - rollup: ^4.19.1 + rollup: ^4.20.0 rollup-plugin-uglify: ^6.0.4 semver: ^7.6.3 stream-browserify: ^3.0.0 stream-http: ^3.2.0 switch-ts: ^1.1.1 - systeminformation: ^5.22.11 + systeminformation: ^5.23.3 ts-mocha: ^10.0.0 tsconfig-paths: ^4.2.0 typescript: ^4.9.5 url: ^0.11.4 url-parse: ^1.5.10 uuid: ^10.0.0 - vue: ^3.4.34 - vue-echarts: 7.0.0-beta.0 - vue-router: 4.4.0 + vue: ^3.4.35 + vue-echarts: 7.0.1 + vue-router: 4.4.2 vue3-lottie: ^3.3.0 vuedraggable: ^4.1.0 web3-eth: ^1.10.4 @@ -2886,9 +2913,9 @@ __metadata: "@polkadot/types": ^12.2.3 "@polkadot/util": ^13.0.2 "@trezor/connect-web": ^9.3.0 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 "@zondax/ledger-substrate": ^0.44.7 @@ -2905,7 +2932,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 webextension-polyfill: ^0.12.0 @@ -2924,9 +2951,9 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@polkadot/util": ^13.0.2 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 assert: ^2.1.0 @@ -2943,7 +2970,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -2955,9 +2982,9 @@ __metadata: dependencies: "@ensdomains/address-encoder": ^1.1.2 "@siddomains/sidjs": 0.1.29 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 "@unstoppabledomains/resolution": ^9.2.2 @@ -2974,7 +3001,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -2985,9 +3012,9 @@ __metadata: resolution: "@enkryptcom/request@workspace:packages/request" dependencies: "@enkryptcom/types": "workspace:^" - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 chai: ^4.5.0 @@ -3007,7 +3034,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 uuid: ^10.0.0 @@ -3022,10 +3049,10 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@noble/secp256k1": 1.7.1 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/hdkey": ^2.0.3 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3042,7 +3069,7 @@ __metadata: ts-mocha: ^9.0.2 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 tweetnacl: ^1.0.3 tweetnacl-util: ^0.15.1 typescript: ^4.9.5 @@ -3057,10 +3084,10 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@ethereumjs/util": ^9.0.3 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/hdkey": ^2.0.3 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3077,7 +3104,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 tweetnacl: ^1.0.3 tweetnacl-util: ^0.15.1 typescript: ^4.9.5 @@ -3092,10 +3119,10 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@polkadot/util-crypto": ^13.0.2 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/hdkey": ^2.0.3 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3111,7 +3138,7 @@ __metadata: ts-mocha: ^9.0.2 ts-node: ^10.9.2 tsconfig-paths: ^3.15.0 - tsup: ^8.2.3 + tsup: ^8.2.4 tweetnacl: ^1.0.3 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 @@ -3128,9 +3155,9 @@ __metadata: "@polkadot/util": ^13.0.2 "@polkadot/util-crypto": ^13.0.2 "@polkadot/wasm-crypto": ^7.3.2 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 assert: ^2.1.0 @@ -3146,7 +3173,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -3158,9 +3185,9 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 chai: ^4.5.0 @@ -3176,7 +3203,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -3188,9 +3215,9 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bignumber.js: ^9.1.2 @@ -3208,12 +3235,12 @@ __metadata: mocha: ^10.7.0 node-fetch: ^2.7.0 prettier: ^2.8.8 - rango-sdk-basic: ^0.1.51 + rango-sdk-basic: ^0.1.52 reconnecting-websocket: ^4.4.0 ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 uuid: ^10.0.0 @@ -3227,7 +3254,7 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/types@workspace:packages/types" dependencies: - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 eslint: ^8.57.0 @@ -3239,7 +3266,7 @@ __metadata: prettier: ^2.8.8 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 languageName: unknown @@ -3252,9 +3279,9 @@ __metadata: "@enkryptcom/types": "workspace:^" "@ethereumjs/util": ^9.0.3 "@polkadot/util-crypto": ^13.0.2 - "@types/chai": ^4.3.16 + "@types/chai": ^4.3.17 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.13 + "@types/node": ^20.14.14 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3271,7 +3298,7 @@ __metadata: ts-mocha: ^10.0.0 ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 - tsup: ^8.2.3 + tsup: ^8.2.4 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 web3-utils: ^1.10.4 @@ -6721,16 +6748,16 @@ __metadata: languageName: node linkType: hard -"@polkadot/ui-shared@npm:^3.8.2": - version: 3.8.2 - resolution: "@polkadot/ui-shared@npm:3.8.2" +"@polkadot/ui-shared@npm:^3.8.3": + version: 3.8.3 + resolution: "@polkadot/ui-shared@npm:3.8.3" dependencies: colord: ^2.9.3 tslib: ^2.6.2 peerDependencies: "@polkadot/util": "*" "@polkadot/util-crypto": "*" - checksum: bff0cc981583a805c7f27d4af9c0ae81d6f29c5130296b44297d03e3a4f62cc47f3e76e118b9fe1c6716dc5099400019da8ea8b7f2ef65faddce11f7c62fe9e4 + checksum: f4d60b5de2b9dd963f167fd1c9ace99c735498b2b797103f706750cb90d6d91a82bfb9441515c7871dfc4e6e05e26c070bae64f37619e563cbeed8d88e8f4ab1 languageName: node linkType: hard @@ -7281,6 +7308,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.20.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@rollup/rollup-android-arm64@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-android-arm64@npm:4.19.1" @@ -7288,6 +7322,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm64@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-android-arm64@npm:4.20.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-arm64@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-darwin-arm64@npm:4.19.1" @@ -7295,6 +7336,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-arm64@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.20.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-x64@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-darwin-x64@npm:4.19.1" @@ -7302,6 +7350,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-x64@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.20.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-gnueabihf@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.19.1" @@ -7309,6 +7364,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-musleabihf@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.19.1" @@ -7316,6 +7378,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-musleabihf@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.20.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-gnu@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.19.1" @@ -7323,6 +7392,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.20.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-musl@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-arm64-musl@npm:4.19.1" @@ -7330,6 +7406,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-musl@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.20.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-powerpc64le-gnu@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.19.1" @@ -7337,6 +7420,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-gnu@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.19.1" @@ -7344,6 +7434,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-riscv64-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.20.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-s390x-gnu@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.19.1" @@ -7351,6 +7448,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-s390x-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.20.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-gnu@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.19.1" @@ -7358,6 +7462,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-gnu@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.20.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-musl@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-linux-x64-musl@npm:4.19.1" @@ -7365,6 +7476,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-musl@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.20.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-win32-arm64-msvc@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.19.1" @@ -7372,6 +7490,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-arm64-msvc@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.20.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-ia32-msvc@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.19.1" @@ -7379,6 +7504,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-ia32-msvc@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.20.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@rollup/rollup-win32-x64-msvc@npm:4.19.1": version: 4.19.1 resolution: "@rollup/rollup-win32-x64-msvc@npm:4.19.1" @@ -7386,6 +7518,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-msvc@npm:4.20.0": + version: 4.20.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.20.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@scure/base@npm:^1.1.1, @scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0": version: 1.1.3 resolution: "@scure/base@npm:1.1.3" @@ -8073,90 +8212,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-darwin-arm64@npm:1.7.3" +"@swc/core-darwin-arm64@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-darwin-arm64@npm:1.7.6" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-darwin-x64@npm:1.7.3" +"@swc/core-darwin-x64@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-darwin-x64@npm:1.7.6" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.3" +"@swc/core-linux-arm-gnueabihf@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.6" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-linux-arm64-gnu@npm:1.7.3" +"@swc/core-linux-arm64-gnu@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.6" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-linux-arm64-musl@npm:1.7.3" +"@swc/core-linux-arm64-musl@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.6" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-linux-x64-gnu@npm:1.7.3" +"@swc/core-linux-x64-gnu@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.6" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-linux-x64-musl@npm:1.7.3" +"@swc/core-linux-x64-musl@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-linux-x64-musl@npm:1.7.6" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-win32-arm64-msvc@npm:1.7.3" +"@swc/core-win32-arm64-msvc@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.6" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-win32-ia32-msvc@npm:1.7.3" +"@swc/core-win32-ia32-msvc@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.6" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.7.3": - version: 1.7.3 - resolution: "@swc/core-win32-x64-msvc@npm:1.7.3" +"@swc/core-win32-x64-msvc@npm:1.7.6": + version: 1.7.6 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.6" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.7.3": - version: 1.7.3 - resolution: "@swc/core@npm:1.7.3" - dependencies: - "@swc/core-darwin-arm64": 1.7.3 - "@swc/core-darwin-x64": 1.7.3 - "@swc/core-linux-arm-gnueabihf": 1.7.3 - "@swc/core-linux-arm64-gnu": 1.7.3 - "@swc/core-linux-arm64-musl": 1.7.3 - "@swc/core-linux-x64-gnu": 1.7.3 - "@swc/core-linux-x64-musl": 1.7.3 - "@swc/core-win32-arm64-msvc": 1.7.3 - "@swc/core-win32-ia32-msvc": 1.7.3 - "@swc/core-win32-x64-msvc": 1.7.3 +"@swc/core@npm:^1.7.6": + version: 1.7.6 + resolution: "@swc/core@npm:1.7.6" + dependencies: + "@swc/core-darwin-arm64": 1.7.6 + "@swc/core-darwin-x64": 1.7.6 + "@swc/core-linux-arm-gnueabihf": 1.7.6 + "@swc/core-linux-arm64-gnu": 1.7.6 + "@swc/core-linux-arm64-musl": 1.7.6 + "@swc/core-linux-x64-gnu": 1.7.6 + "@swc/core-linux-x64-musl": 1.7.6 + "@swc/core-win32-arm64-msvc": 1.7.6 + "@swc/core-win32-ia32-msvc": 1.7.6 + "@swc/core-win32-x64-msvc": 1.7.6 "@swc/counter": ^0.1.3 "@swc/types": ^0.1.12 peerDependencies: @@ -8185,7 +8324,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: af7850035057ea1f7412cf7bf7b27d13e0d55e79a5c6e37319cbdca6a962134718d8a8355cfd4926b4fc8d25d67afca567ca63bb3f8d2c8cab869b37bb7cd0ed + checksum: 6ecc0d5721458c35ee236ffeb8ac6c909aaf28155f9dbcdf796111ed28bc6273629bd2156547dff70368dff0bf43c6aae7e2cafbb507b31f9ab6e3aed879cd03 languageName: node linkType: hard @@ -8800,10 +8939,10 @@ __metadata: languageName: node linkType: hard -"@types/chai@npm:^4.3.16": - version: 4.3.16 - resolution: "@types/chai@npm:4.3.16" - checksum: bb5f52d1b70534ed8b4bf74bd248add003ffe1156303802ea367331607c06b494da885ffbc2b674a66b4f90c9ee88759790a5f243879f6759f124f22328f5e95 +"@types/chai@npm:^4.3.17": + version: 4.3.17 + resolution: "@types/chai@npm:4.3.17" + checksum: 56661c74c76df06547e3584be4a2b85eec60e7de4c0f6e7bbf7bf492a0ce96ce5bfc30f52a8889a7b35e24161d225e4a57041d4fa80f6e5592fea78e45dfd34c languageName: node linkType: hard @@ -9204,12 +9343,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.14.13": - version: 20.14.13 - resolution: "@types/node@npm:20.14.13" +"@types/node@npm:^20.14.14": + version: 20.14.14 + resolution: "@types/node@npm:20.14.14" dependencies: undici-types: ~5.26.4 - checksum: 928e877aadfea75f3a14c38223674b3a9fb206340ab7b2af3ffe7040c384a55678f235860f6652d18026fd59e44c237d060e3f5ce7b62b1b9e6fb593c9ef39b9 + checksum: cb2199123efca94908ee7191cc7b7abc11b26bf1fbb93c2948d5537a6594eedc35d4748d9fa998078fdc2eb5cc3a11d6d87b2fea20a05bda9d304e37d3c3282a languageName: node linkType: hard @@ -10011,26 +10150,26 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-core@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/compiler-core@npm:3.4.34" +"@vue/compiler-core@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/compiler-core@npm:3.4.35" dependencies: "@babel/parser": ^7.24.7 - "@vue/shared": 3.4.34 + "@vue/shared": 3.4.35 entities: ^4.5.0 estree-walker: ^2.0.2 source-map-js: ^1.2.0 - checksum: 397e76fec66bb5481b32823aa9530e9810bb39c33b5ac78b4488e8814f5779bbc4d1d85cac98fe96c3036e83105ccad0fb813e15cb8b5d201343dfef99750041 + checksum: 9f050edee2efefd214dcff65efea7f9faab63bab34ce31fb6ea08a7a12bad5a792b2b9f31e2f72a3d034474bd217707c769a5341e9006c8d442024647895cdd5 languageName: node linkType: hard -"@vue/compiler-dom@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/compiler-dom@npm:3.4.34" +"@vue/compiler-dom@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/compiler-dom@npm:3.4.35" dependencies: - "@vue/compiler-core": 3.4.34 - "@vue/shared": 3.4.34 - checksum: 6ba068d0274048eb25e3ef9665bbe6e4f9a65841ab4fd22336a6c5b760e9474c8260b31f514fbce3f3bf23e55e452c4be58cf35efafdb42c6a2d524e27cec1ca + "@vue/compiler-core": 3.4.35 + "@vue/shared": 3.4.35 + checksum: 3944753daadef563249778e5672dae80c66e687ed48509de682ffc9f620e13b373492925f2658a2c938dabcfb3914b39582b77e92e9190913be528d3e91434fc languageName: node linkType: hard @@ -10045,30 +10184,30 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-sfc@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/compiler-sfc@npm:3.4.34" +"@vue/compiler-sfc@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/compiler-sfc@npm:3.4.35" dependencies: "@babel/parser": ^7.24.7 - "@vue/compiler-core": 3.4.34 - "@vue/compiler-dom": 3.4.34 - "@vue/compiler-ssr": 3.4.34 - "@vue/shared": 3.4.34 + "@vue/compiler-core": 3.4.35 + "@vue/compiler-dom": 3.4.35 + "@vue/compiler-ssr": 3.4.35 + "@vue/shared": 3.4.35 estree-walker: ^2.0.2 magic-string: ^0.30.10 - postcss: ^8.4.39 + postcss: ^8.4.40 source-map-js: ^1.2.0 - checksum: e9fc4ee40372d7b5e18eb8921aa469bf224a6e6fbc33fe1a73dd16ee89c914f5ceb912e4e61453841de00e2a1dbc52e92b556e62436342637efbc19129d97eb2 + checksum: 8fcb9141928c6309d7b7a714d5d4d262ca19b2398a88c69c4bb55ae69ab8575a8fe3cfa8ee6f2469bc3c96a54d7d309c435b8d8df9955a0037c8adba36b24d1f languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/compiler-ssr@npm:3.4.34" +"@vue/compiler-ssr@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/compiler-ssr@npm:3.4.35" dependencies: - "@vue/compiler-dom": 3.4.34 - "@vue/shared": 3.4.34 - checksum: f066036859f6de1882a941e1fce7904d3bb091f858ab1ad40926e9d5bbb92ece883835e267a93b07d938c048480d51109cb776047d02b8bbe47fe4282d1bb78e + "@vue/compiler-dom": 3.4.35 + "@vue/shared": 3.4.35 + checksum: 32a9018484bc6aba88dfb4e9d328c54c7ff3520906a0c0d1c4e913d81df26949c43b7d832364dfdb487a4ec59f3395e89c221bfa797dc3797bcf6ff2d988abb0 languageName: node linkType: hard @@ -10092,13 +10231,6 @@ __metadata: languageName: node linkType: hard -"@vue/devtools-api@npm:^6.5.1": - version: 6.6.1 - resolution: "@vue/devtools-api@npm:6.6.1" - checksum: cf12b5ebcc7729725087072289410107b55bb82e0b86b8442e4e85516977110a8a3f4e1dec763be8b567a59173703b4e9c0ac1b0489bb2bb81363af7ea258a27 - languageName: node - linkType: hard - "@vue/devtools-api@npm:^6.6.3": version: 6.6.3 resolution: "@vue/devtools-api@npm:6.6.3" @@ -10124,53 +10256,53 @@ __metadata: languageName: node linkType: hard -"@vue/reactivity@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/reactivity@npm:3.4.34" +"@vue/reactivity@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/reactivity@npm:3.4.35" dependencies: - "@vue/shared": 3.4.34 - checksum: 946111110d548d4a69482b5e36f9e988649eb04188eef63d29241be6a9c7a9f932ed8dbf8a0cc543d0865c6d4cbef39c4b5520246f9d791d5aca85e8d0d4c88a + "@vue/shared": 3.4.35 + checksum: d1aeb528b78453d627b6ab0d7414b3b7926ff9d1ae0331c789a7e36642eeac56fc7b396869d740fff9e36c01ecea6db0bc0ced461c226ea277f5ec682f5e6a85 languageName: node linkType: hard -"@vue/runtime-core@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/runtime-core@npm:3.4.34" +"@vue/runtime-core@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/runtime-core@npm:3.4.35" dependencies: - "@vue/reactivity": 3.4.34 - "@vue/shared": 3.4.34 - checksum: b9b30900885798c0aabffb0ce560ac901d8ef8451f7550012a9884760326ce1d240bbfeebd41db7d50e88c8ee22cb53604ecfe878ac7d9fc6aa02083847ca812 + "@vue/reactivity": 3.4.35 + "@vue/shared": 3.4.35 + checksum: f62a20e36029e23131c5f326636a5ccdb5a9f61bbe5fbec0275ee5f8ed720589d2e1f0ef1d5294d19d2b38e0690c183731ca7bd39bf6190ec89e3d7593903060 languageName: node linkType: hard -"@vue/runtime-dom@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/runtime-dom@npm:3.4.34" +"@vue/runtime-dom@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/runtime-dom@npm:3.4.35" dependencies: - "@vue/reactivity": 3.4.34 - "@vue/runtime-core": 3.4.34 - "@vue/shared": 3.4.34 + "@vue/reactivity": 3.4.35 + "@vue/runtime-core": 3.4.35 + "@vue/shared": 3.4.35 csstype: ^3.1.3 - checksum: de62363ac410512fc699be4ba62e1139a1ad58371faa48e8f6e2141736e3264ea42739af7f19261fa2285dd7a2f121db58cd8a59fda93b15f718e4b3250f81d2 + checksum: 943b931652ca1e0adb4ebc8ef872453b729e9ad59536c26a6fc71649a1f9ce339aa49671446d3a3bc6c28ecc3de86f69e3a7e1272f3f219878d83333bd8ce941 languageName: node linkType: hard -"@vue/server-renderer@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/server-renderer@npm:3.4.34" +"@vue/server-renderer@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/server-renderer@npm:3.4.35" dependencies: - "@vue/compiler-ssr": 3.4.34 - "@vue/shared": 3.4.34 + "@vue/compiler-ssr": 3.4.35 + "@vue/shared": 3.4.35 peerDependencies: - vue: 3.4.34 - checksum: 86baafeb88174e0798d0f2f91d8eca0a8278bb13cbdcd2516ffdd35767f78a43aff0da6f39e98f4a9148bb8196a4ec782aae0807e211717919be719ce52492cd + vue: 3.4.35 + checksum: 410516532b6c9368c8c246556c6d713f367eea76b4e96a33235f2da36b9bc78126a63f1b75f198bbd578dd21d0eaafd99183303d6bf407e4631f4e64e2722408 languageName: node linkType: hard -"@vue/shared@npm:3.4.34": - version: 3.4.34 - resolution: "@vue/shared@npm:3.4.34" - checksum: 6383d05a23137b66a9f2b4e18ca7da874eab4b059db1ce62c0f1220c99670a8349987ef9f376e832b208afa521041323c0b6860f7e1dd55974b78c128df74fc7 +"@vue/shared@npm:3.4.35": + version: 3.4.35 + resolution: "@vue/shared@npm:3.4.35" + checksum: 6397a102ff46e7c5e3d2507b6eb5390f4c07e56898cfdadf7be52e2bf124d1adce41c0c27b81c684ee3e211b480e67e11015fc4e3d14dcd2768ba9045a69d874 languageName: node linkType: hard @@ -10866,15 +10998,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.10.0": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" - bin: - acorn: bin/acorn - checksum: 818450408684da89423e3daae24e4dc9b68692db8ab49ea4569c7c5abb7a3f23669438bf129cc81dfdada95e1c9b944ee1bfca2c57a05a4dc73834a612fbf6a7 - languageName: node - linkType: hard - "acorn@npm:^8.11.3": version: 8.11.3 resolution: "acorn@npm:8.11.3" @@ -12466,21 +12589,21 @@ __metadata: languageName: node linkType: hard -"bumpp@npm:^9.4.1": - version: 9.4.1 - resolution: "bumpp@npm:9.4.1" +"bumpp@npm:^9.4.2": + version: 9.4.2 + resolution: "bumpp@npm:9.4.2" dependencies: "@jsdevtools/ez-spawn": ^3.0.4 - c12: ^1.10.0 + c12: ^1.11.1 cac: ^6.7.14 escalade: ^3.1.2 fast-glob: ^3.3.2 js-yaml: ^4.1.0 prompts: ^2.4.2 - semver: ^7.6.0 + semver: ^7.6.3 bin: bumpp: bin/bumpp.js - checksum: 3f9d455a65df04b8bc56c8bba9a7f36ab587f0a6e38097edb6eb2ddf8db856998fec459b808b962b88c65a16db3c4d130885ecc32581e785517a01c464124c64 + checksum: 2a85992751e0e083e6bf194179836eeb2dbfaaeaa6e7cf97623fec12a5f04ba990b9d791c912aa84458a6d98afa81504e79b7c9198b2d6548d6b60ddae62b393 languageName: node linkType: hard @@ -12509,23 +12632,28 @@ __metadata: languageName: node linkType: hard -"c12@npm:^1.10.0": - version: 1.10.0 - resolution: "c12@npm:1.10.0" +"c12@npm:^1.11.1": + version: 1.11.1 + resolution: "c12@npm:1.11.1" dependencies: chokidar: ^3.6.0 - confbox: ^0.1.3 + confbox: ^0.1.7 defu: ^6.1.4 dotenv: ^16.4.5 - giget: ^1.2.1 - jiti: ^1.21.0 - mlly: ^1.6.1 + giget: ^1.2.3 + jiti: ^1.21.6 + mlly: ^1.7.1 ohash: ^1.1.3 pathe: ^1.1.2 perfect-debounce: ^1.0.0 - pkg-types: ^1.0.3 - rc9: ^2.1.1 - checksum: ba5a6bf8f53fec3848dcb5ab95f92e1114b6489943c6cd9117cedd9d34e9b1252cbe5e09ff0df9d46da1cfdb11de8abe14375479a75cdd77340b74517f7c1efb + pkg-types: ^1.1.1 + rc9: ^2.1.2 + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true + checksum: 705123b138d2e7d43cf37264f744091ae0d76fb98b705558ebc9dfbbf3c84e1eaf9696b34450a505dc7b73f842b16db807899fa96abac48d47894d64de72aa5f languageName: node linkType: hard @@ -13058,12 +13186,12 @@ __metadata: languageName: node linkType: hard -"citty@npm:^0.1.5": - version: 0.1.5 - resolution: "citty@npm:0.1.5" +"citty@npm:^0.1.6": + version: 0.1.6 + resolution: "citty@npm:0.1.6" dependencies: consola: ^3.2.3 - checksum: 9a2379fd01345500f1eb2bcc33f5e60be8379551091b43a3ba4e3a39c63a92e41453dea542ab9f2528fe9e19177ff1453c01a845a74529292af34fdafd23a5f6 + checksum: 3fbcaaea92d328deddb5aba7d629d9076d4f1aa0338f59db7ea647a8f51eedc14b7f6218c87ad03c9e3c126213ba87d13d7774f9c30d64209f4b074aa83bd6ab languageName: node linkType: hard @@ -13470,13 +13598,6 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.1.3": - version: 0.1.3 - resolution: "confbox@npm:0.1.3" - checksum: 78154887c8f53f84bac12bf0bb1bfec75d923165c5ee9e3409c2212efe76752d1b80271ea63be9eebb87a795db0182bd2c409940ef47421d8b37299080786ccc - languageName: node - linkType: hard - "confbox@npm:^0.1.7": version: 0.1.7 resolution: "confbox@npm:0.1.7" @@ -13676,10 +13797,10 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.37.1": - version: 3.37.1 - resolution: "core-js@npm:3.37.1" - checksum: 2d58a5c599f05c3e04abc8bc5e64b88eb17d914c0f552f670fb800afa74ec54b4fcc7f231ad6bd45badaf62c0fb0ce30e6fe89cedb6bb6d54e6f19115c3c17ff +"core-js@npm:^3.38.0": + version: 3.38.0 + resolution: "core-js@npm:3.38.0" + checksum: 71ef0598da69daee2b46fa1f82f074019981656f7cae26fed2b7f076c611e330a99ba5c70156ae37682f59a8d6ec6486119c70cb283c9fff25bd4f20db7fdc27 languageName: node linkType: hard @@ -14435,7 +14556,7 @@ __metadata: languageName: node linkType: hard -"defu@npm:^6.1.2, defu@npm:^6.1.3, defu@npm:^6.1.4": +"defu@npm:^6.1.4": version: 6.1.4 resolution: "defu@npm:6.1.4" checksum: 40e3af6338f195ac1564f53d1887fa2d0429ac7e8c081204bc4d29191180059d3952b5f4e08fe5df8d59eb873aa26e9c88b56d4fac699673d4a372c93620b229 @@ -14515,10 +14636,10 @@ __metadata: languageName: node linkType: hard -"destr@npm:^2.0.0": - version: 2.0.2 - resolution: "destr@npm:2.0.2" - checksum: cb63dd477d1c323f95650ce7784f1497466d68150ac0fddd6c99652be45c9dcb997d53fd5eb6c6fda6c0b2a5e5b4fc7fa3c3e18dace3d810ba4cf45d8b55bdd6 +"destr@npm:^2.0.3": + version: 2.0.3 + resolution: "destr@npm:2.0.3" + checksum: 4521b145ba6118919a561f7d979d623793695a516d1b9df704de81932601bf9cf21c47278e1cb93a309c88a14f4fd1f18680bb49ebef8b2546cc7f415e7ae48e languageName: node linkType: hard @@ -14985,7 +15106,7 @@ __metadata: dependencies: "@commitlint/cli": ^19.3.0 "@commitlint/config-conventional": ^19.2.2 - "@swc/core": ^1.7.3 + "@swc/core": ^1.7.6 concurrently: ^8.2.2 husky: ^9.1.4 node-notifier: ^10.0.1 @@ -16995,21 +17116,21 @@ __metadata: languageName: node linkType: hard -"giget@npm:^1.2.1": - version: 1.2.1 - resolution: "giget@npm:1.2.1" +"giget@npm:^1.2.3": + version: 1.2.3 + resolution: "giget@npm:1.2.3" dependencies: - citty: ^0.1.5 + citty: ^0.1.6 consola: ^3.2.3 - defu: ^6.1.3 - node-fetch-native: ^1.6.1 - nypm: ^0.3.3 + defu: ^6.1.4 + node-fetch-native: ^1.6.3 + nypm: ^0.3.8 ohash: ^1.1.3 - pathe: ^1.1.1 + pathe: ^1.1.2 tar: ^6.2.0 bin: giget: dist/cli.mjs - checksum: 0af12adf846d22afb3ef4f4574ed4db79456a749c288163de4741fd9620fa4f8cd93491087551f9bca09cfd24f073a8a7bfb003b493e79ea7d5cd86102332a8f + checksum: ec6e9126cb210377b952c090338dee5df0f58f724666318a14a505f1d2c961b91fd1b364b86a038b24a21a5ef44702c9d6841f8726b09aeb88a74720b6b682dd languageName: node linkType: hard @@ -17914,6 +18035,13 @@ __metadata: languageName: node linkType: hard +"idb@npm:^8.0.0": + version: 8.0.0 + resolution: "idb@npm:8.0.0" + checksum: a9c6176c176dc1a73520ae906d33fcda8a6f6068cf64027e196763d4ad70b088b7141650ed68f3604e0f0ccd1a123f6b8a435ba5e4514f42ada3460c23b6747a + languageName: node + linkType: hard + "idna-uts46-hx@npm:^2.3.1": version: 2.3.1 resolution: "idna-uts46-hx@npm:2.3.1" @@ -18858,7 +18986,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.19.1, jiti@npm:^1.21.0": +"jiti@npm:^1.19.1": version: 1.21.0 resolution: "jiti@npm:1.21.0" bin: @@ -18867,6 +18995,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^1.21.6": + version: 1.21.6 + resolution: "jiti@npm:1.21.6" + bin: + jiti: bin/jiti.js + checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32 + languageName: node + linkType: hard + "joi@npm:^17.4.0": version: 17.6.0 resolution: "joi@npm:17.6.0" @@ -19238,13 +19375,6 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.2.0 - resolution: "jsonc-parser@npm:3.2.0" - checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 - languageName: node - linkType: hard - "jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" @@ -20600,27 +20730,15 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.2.0": - version: 1.4.2 - resolution: "mlly@npm:1.4.2" - dependencies: - acorn: ^8.10.0 - pathe: ^1.1.1 - pkg-types: ^1.0.3 - ufo: ^1.3.0 - checksum: ad0813eca133e59ac03b356b87deea57da96083dce7dda58a8eeb2dce92b7cc2315bedd9268f3ff8e98effe1867ddb1307486d4c5cd8be162daa8e0fa0a98ed4 - languageName: node - linkType: hard - -"mlly@npm:^1.6.1": - version: 1.7.0 - resolution: "mlly@npm:1.7.0" +"mlly@npm:^1.7.1": + version: 1.7.1 + resolution: "mlly@npm:1.7.1" dependencies: acorn: ^8.11.3 pathe: ^1.1.2 - pkg-types: ^1.1.0 + pkg-types: ^1.1.1 ufo: ^1.5.3 - checksum: c1548f4dd0e31ce15d293ebb7c61778bd28c405573dc43dcf799eaeb8f6b776d7dadd95e957d6631b9cc4bb963cd01079d58b7e2290ed540aa460e061bdbd1fa + checksum: 956a6d54119eef782f302580f63a9800654e588cd70015b4218a00069c6ef11b87984e8ffe140a4668b0100ad4022b11d1f9b11ac2c6dbafa4d8bc33ae3a08a8 languageName: node linkType: hard @@ -21072,10 +21190,10 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.6.1": - version: 1.6.1 - resolution: "node-fetch-native@npm:1.6.1" - checksum: 1a248ada34561ce1010f09ca81cf5cd9c834b51aec957e82b6811d673e209a44630a835da599f0dd0c3d927f15c5f864d6ed494093c4a42601609f988d5919f2 +"node-fetch-native@npm:^1.6.3": + version: 1.6.4 + resolution: "node-fetch-native@npm:1.6.4" + checksum: 7b159f610e037e8813750096a6616ec6771e9abf868aa6e75e5b790bfc2ba2d92cf2abcce33c18fd01f2e5e5cc72de09c78bd4381e7f8c0887f7de21bd96f045 languageName: node linkType: hard @@ -21377,17 +21495,19 @@ __metadata: languageName: node linkType: hard -"nypm@npm:^0.3.3": - version: 0.3.4 - resolution: "nypm@npm:0.3.4" +"nypm@npm:^0.3.8": + version: 0.3.9 + resolution: "nypm@npm:0.3.9" dependencies: - citty: ^0.1.5 + citty: ^0.1.6 + consola: ^3.2.3 execa: ^8.0.1 - pathe: ^1.1.1 - ufo: ^1.3.2 + pathe: ^1.1.2 + pkg-types: ^1.1.1 + ufo: ^1.5.3 bin: nypm: dist/cli.mjs - checksum: 5137bd91debf0a781b9038251c0c6d2059a3e19604edb75f53422968c57b0a24c9ef7d8ec9401c8f8e98906fa3e3cdc088746b8eb98b25b43d78928f643fef2c + checksum: 67fb85384d097fa281047d8dccc23bff4a4ffd7be8952c575c3ceda1b3bbc1401b8e0660d7a0f742b80e8b63f097d040dbba410cae4b94b8cad6a66e94ad8710 languageName: node linkType: hard @@ -22149,13 +22269,6 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.0, pathe@npm:^1.1.1": - version: 1.1.1 - resolution: "pathe@npm:1.1.1" - checksum: 34ab3da2e5aa832ebc6a330ffe3f73d7ba8aec6e899b53b8ec4f4018de08e40742802deb12cf5add9c73b7bf719b62c0778246bd376ca62b0fb23e0dde44b759 - languageName: node - linkType: hard - "pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" @@ -22404,25 +22517,14 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.0.3": - version: 1.0.3 - resolution: "pkg-types@npm:1.0.3" - dependencies: - jsonc-parser: ^3.2.0 - mlly: ^1.2.0 - pathe: ^1.1.0 - checksum: 4b305c834b912ddcc8a0fe77530c0b0321fe340396f84cbb87aecdbc126606f47f2178f23b8639e71a4870f9631c7217aef52ffed0ae17ea2dbbe7e43d116a6e - languageName: node - linkType: hard - -"pkg-types@npm:^1.1.0": - version: 1.1.0 - resolution: "pkg-types@npm:1.1.0" +"pkg-types@npm:^1.1.1": + version: 1.1.3 + resolution: "pkg-types@npm:1.1.3" dependencies: confbox: ^0.1.7 - mlly: ^1.6.1 + mlly: ^1.7.1 pathe: ^1.1.2 - checksum: 9cd3684e308c622db79efc8edc9291662e01cb42ed624ea2fa5400fb6eab94679b4e5b28808e9b763298a023c2381fd72a363a1c84a9073c96609af4c5c59f8f + checksum: 1085f1ed650db71d62ec9201d0ad4dc9455962b0e40d309e26bb8c01bb5b1560087e44d49e8e034497668c7cdde7cb5397995afa79c9fa1e2b35af9c9abafa82 languageName: node linkType: hard @@ -22867,7 +22969,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.39": +"postcss@npm:^8.4.40": version: 8.4.40 resolution: "postcss@npm:8.4.40" dependencies: @@ -23458,24 +23560,24 @@ __metadata: languageName: node linkType: hard -"rango-sdk-basic@npm:^0.1.51": - version: 0.1.51 - resolution: "rango-sdk-basic@npm:0.1.51" +"rango-sdk-basic@npm:^0.1.52": + version: 0.1.52 + resolution: "rango-sdk-basic@npm:0.1.52" dependencies: axios: ^1.7.2 bignumber.js: ^9.1.1 eth-rpc-errors: ^4.0.3 ethers: ^5.7.2 - rango-types: ^0.1.71 + rango-types: ^0.1.72 uuid-random: ^1.3.2 - checksum: c58b88e8294ecf592925256aa5c9470c2df6ff29fac6d58e711bd774bf30f83bf481e633f5faccddb765b5aa159884a794336099036143b6f89cbdb1aa87c824 + checksum: 93c1df3485dd8cbec6226e1f503a81ba613d125b79f96f41bdf38da82763a94da35a53ff0b4b789dc917c5e53851ec1a77e7b2e2df30f1e4249efacb4d20d628 languageName: node linkType: hard -"rango-types@npm:^0.1.71": - version: 0.1.71 - resolution: "rango-types@npm:0.1.71" - checksum: 5cd3522830c1216df215754cefa3b2750b1e99bc3bb112a52ec46eba13a8f573ee7134542709a60d34fc3106e15cede6fe2720a0008e174fbd43d450e687ab41 +"rango-types@npm:^0.1.72": + version: 0.1.72 + resolution: "rango-types@npm:0.1.72" + checksum: 765a094b290bc60303d4739b924df5f12862d4cc2e93434fd386f6ae878b96ed66369fc43286e74c3f227177084da84432b84ff398f5ddbe1920faf883fc5775 languageName: node linkType: hard @@ -23503,14 +23605,13 @@ __metadata: languageName: node linkType: hard -"rc9@npm:^2.1.1": - version: 2.1.1 - resolution: "rc9@npm:2.1.1" +"rc9@npm:^2.1.2": + version: 2.1.2 + resolution: "rc9@npm:2.1.2" dependencies: - defu: ^6.1.2 - destr: ^2.0.0 - flat: ^5.0.2 - checksum: d704e4f4ecf321b691b37e5cfeee11bb2c5d3eb7393cef32096ed4bc3c7f7a64d2c79e2ad159b5e20c15917290ca80a1343fc25c86a3c8d0c67f4601ce8c4085 + defu: ^6.1.4 + destr: ^2.0.3 + checksum: aaa8f962a9a6a89981e2da75dad71117fe0f856bb55fecf793cd42ee0badc1cb92e6bb7cd25a9473e2d3c968ac29e507384ce52c4e76bbd63ac5649d3d7c2ab3 languageName: node linkType: hard @@ -24201,7 +24302,7 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.19.0, rollup@npm:^4.19.1": +"rollup@npm:^4.19.0": version: 4.19.1 resolution: "rollup@npm:4.19.1" dependencies: @@ -24264,6 +24365,69 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.20.0": + version: 4.20.0 + resolution: "rollup@npm:4.20.0" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.20.0 + "@rollup/rollup-android-arm64": 4.20.0 + "@rollup/rollup-darwin-arm64": 4.20.0 + "@rollup/rollup-darwin-x64": 4.20.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.20.0 + "@rollup/rollup-linux-arm-musleabihf": 4.20.0 + "@rollup/rollup-linux-arm64-gnu": 4.20.0 + "@rollup/rollup-linux-arm64-musl": 4.20.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.20.0 + "@rollup/rollup-linux-riscv64-gnu": 4.20.0 + "@rollup/rollup-linux-s390x-gnu": 4.20.0 + "@rollup/rollup-linux-x64-gnu": 4.20.0 + "@rollup/rollup-linux-x64-musl": 4.20.0 + "@rollup/rollup-win32-arm64-msvc": 4.20.0 + "@rollup/rollup-win32-ia32-msvc": 4.20.0 + "@rollup/rollup-win32-x64-msvc": 4.20.0 + "@types/estree": 1.0.5 + fsevents: ~2.3.2 + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 92c6c68a93d7726345df2627fd5b0a88d1481fbe76e6c8ad84a8eae6835c03fc36ed4cb3271350b5290397b26eb97a97297496ca972289b2299a24e81649bca0 + languageName: node + linkType: hard + "rpc-websockets@npm:^7.5.1": version: 7.6.0 resolution: "rpc-websockets@npm:7.6.0" @@ -25828,12 +25992,12 @@ __metadata: languageName: node linkType: hard -"systeminformation@npm:^5.22.11": - version: 5.22.11 - resolution: "systeminformation@npm:5.22.11" +"systeminformation@npm:^5.23.3": + version: 5.23.3 + resolution: "systeminformation@npm:5.23.3" bin: systeminformation: lib/cli.js - checksum: 5e924a87ecd5453225456191c5a9201d763a59e905a45a4e1d4e99b98b69fed25d33e756ad8f9fef1f513259778cbcfd4cbba48b208f7f9c87db9cb97d1eabe7 + checksum: b36ef16df59b8bd8ebf48ccc113c90d18810e49909698f5622c7c331d3b8fd44fd484804aee50a3a17b69638a91be4380b53514a7195026c4eb8680eb0be68c9 conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) languageName: node linkType: hard @@ -26432,9 +26596,9 @@ __metadata: languageName: node linkType: hard -"tsup@npm:^8.2.3": - version: 8.2.3 - resolution: "tsup@npm:8.2.3" +"tsup@npm:^8.2.4": + version: 8.2.4 + resolution: "tsup@npm:8.2.4" dependencies: bundle-require: ^5.0.0 cac: ^6.7.14 @@ -26469,7 +26633,7 @@ __metadata: bin: tsup: dist/cli-default.js tsup-node: dist/cli-node.js - checksum: 432b1a51ae804429c48d52aed9d61c3867d3209bf13928607282a5c8664fe55193e18f76be62bd0908a4978eb894930f9429145b7c482ade3513f3c7a71d0977 + checksum: 5c5fb733716dad9d3a6c15a4db0d9b0bd5f7fdc37d8961a24ac8da16fb280f2358869c21a8cf14e8f2e965795e234aaba1197cf621c45293941706b736c20d1a languageName: node linkType: hard @@ -26790,13 +26954,6 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.3.0, ufo@npm:^1.3.2": - version: 1.3.2 - resolution: "ufo@npm:1.3.2" - checksum: f1180bb715ff4dd46152fd4dec41c731e84d7b9eaf1432548a0210b2f7e0cd29de125ac88e582c6a079d8ae5bc9ab04ef2bdbafe125086480b10c1006b81bfce - languageName: node - linkType: hard - "ufo@npm:^1.5.3": version: 1.5.3 resolution: "ufo@npm:1.5.3" @@ -27409,9 +27566,9 @@ __metadata: languageName: node linkType: hard -"vue-echarts@npm:7.0.0-beta.0": - version: 7.0.0-beta.0 - resolution: "vue-echarts@npm:7.0.0-beta.0" +"vue-echarts@npm:7.0.1": + version: 7.0.1 + resolution: "vue-echarts@npm:7.0.1" dependencies: vue-demi: ^0.13.11 peerDependencies: @@ -27421,7 +27578,7 @@ __metadata: peerDependenciesMeta: "@vue/runtime-core": optional: true - checksum: bfddf0d83ce450f2583ef6cc75b4d3a4311e18d21e7ac692b1c88025b1cb33c70e5180373601553b14c6c732a9bf14cb6222666cab97b1fc98f5ab0a01dde044 + checksum: aecdd9d98551904e3d759618f5b2da9de5bc59169f13b2626c57f11214b1d7e48722b4cbc0a809fb5362fb54d703173a7a930abfa6bddc45624c3cc05e004cdf languageName: node linkType: hard @@ -27479,14 +27636,14 @@ __metadata: languageName: node linkType: hard -"vue-router@npm:4.4.0": - version: 4.4.0 - resolution: "vue-router@npm:4.4.0" +"vue-router@npm:4.4.2": + version: 4.4.2 + resolution: "vue-router@npm:4.4.2" dependencies: - "@vue/devtools-api": ^6.5.1 + "@vue/devtools-api": ^6.6.3 peerDependencies: vue: ^3.2.0 - checksum: 33b351cc140d1769193e326d77d2bf0fd9d0fd8b871cad848b6c73df0a6d3b7c8fec5657dbe45d7ad486a003033f3b2957e8b0adc9ae06b51cb129054cebb427 + checksum: 85b524f2bea830a555ec53de11653759cabe1af3eb29d7b7d7f6cc8d6220ba184699cd2ec856910918ec7108cbbb2591aaf5056f06fbb820979f557eb70bb686 languageName: node linkType: hard @@ -27540,21 +27697,21 @@ __metadata: languageName: node linkType: hard -"vue@npm:^3.4.34": - version: 3.4.34 - resolution: "vue@npm:3.4.34" +"vue@npm:^3.4.35": + version: 3.4.35 + resolution: "vue@npm:3.4.35" dependencies: - "@vue/compiler-dom": 3.4.34 - "@vue/compiler-sfc": 3.4.34 - "@vue/runtime-dom": 3.4.34 - "@vue/server-renderer": 3.4.34 - "@vue/shared": 3.4.34 + "@vue/compiler-dom": 3.4.35 + "@vue/compiler-sfc": 3.4.35 + "@vue/runtime-dom": 3.4.35 + "@vue/server-renderer": 3.4.35 + "@vue/shared": 3.4.35 peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - checksum: badbf3a1eed2a62c0a5049171e98926ef073107cc2695d1d8432497ddd2782f6fea673d776167a8a8ba5bc45381d17ed4db2b2d4026397d7cd511c7d64721717 + checksum: 7f9d369fa86a6b723d368b706b7ce2eef4437bf99d28137b91e517837074f232727ea342c643cc0de9925c764b321041a2dbbd0f62210d1bbe9efad2b49e7f53 languageName: node linkType: hard From dfc37c5f805956d1559bd1393bb2e8f386be35a9 Mon Sep 17 00:00:00 2001 From: zchain168168 Date: Tue, 6 Aug 2024 09:36:25 +0700 Subject: [PATCH 223/375] Update networks.ts --- packages/types/src/networks.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..539d4527f 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + ZChains = "ZCD", } export enum CoingeckoPlatform { @@ -123,4 +124,5 @@ export enum CoingeckoPlatform { Blast = "blast", Sanko = "sanko", Degen = "degen", + ZChains = "zchains", } From 14151e8fecaa8db326762437bcd7191c9236b89a Mon Sep 17 00:00:00 2001 From: zchain168168 Date: Tue, 6 Aug 2024 09:42:17 +0700 Subject: [PATCH 224/375] Create zcd.ts --- .../src/providers/ethereum/networks/zcd.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/zcd.ts diff --git a/packages/extension/src/providers/ethereum/networks/zcd.ts b/packages/extension/src/providers/ethereum/networks/zcd.ts new file mode 100644 index 000000000..eff0e9e9f --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/zcd.ts @@ -0,0 +1,27 @@ +import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import { TelosActivity } from "../libs/activity-handlers"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; + +const zcdOptions: EvmNetworkOptions = { + name: NetworkNames.Zchains, + name_long: "ZChains", + homePage: "https://www.zchains.com", + blockExplorerTX: "https://scan.zchains.com/tx/[[txHash]]", + blockExplorerAddr: "https://scan.zchains.com/address/[[address]]", + chainID: "168168", + isTestNetwork: false, + currencyName: "ZCD", + currencyNameLong: "ZChains", + node: "https://rpc.zchains.com", + icon: require("./icons/zcd.svg"), + coingeckoID: "zchains", + coingeckoPlatform: CoingeckoPlatform.zchains, + assetsInfoHandler, + activityHandler: wrapActivityHandler(TelosActivity), +}; + +const zcd = new EvmNetwork(zcdOptions); + +export default zcd; From 2e82e6a4d721a1954465dc6daf8363c855a593e3 Mon Sep 17 00:00:00 2001 From: zchain168168 Date: Tue, 6 Aug 2024 09:48:12 +0700 Subject: [PATCH 225/375] Add files via upload --- .../providers/ethereum/networks/icons/zcd.svg | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/zcd.svg diff --git a/packages/extension/src/providers/ethereum/networks/icons/zcd.svg b/packages/extension/src/providers/ethereum/networks/icons/zcd.svg new file mode 100644 index 000000000..483efb727 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/icons/zcd.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + From ce55b26f685f5bef6b245bed2992c3d8972ed022 Mon Sep 17 00:00:00 2001 From: zchain168168 Date: Tue, 6 Aug 2024 09:52:35 +0700 Subject: [PATCH 226/375] Update index.ts --- packages/extension/src/providers/ethereum/networks/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..dd93626fa 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import zcdNode from "./zcd"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + zcd: zcdNode, }; From 5893b3f91ef2c49579842159702f954b3dc4e5f7 Mon Sep 17 00:00:00 2001 From: zchain168168 Date: Tue, 6 Aug 2024 09:54:38 +0700 Subject: [PATCH 227/375] Update configs.ts --- .../libs/activity-handlers/providers/etherscan/configs.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..0267753b8 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.ZCD]: "https://scan.zchains.com/", }; export { NetworkEndpoints }; From 2da005eaef41f4d85b69d4044c4aa9d87dc85b27 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 6 Aug 2024 16:12:10 -0700 Subject: [PATCH 228/375] devop: fix priority fees --- .../src/providers/solana/types/sol-network.ts | 3 +- .../solana/ui/libs/get-priority-fees.ts | 74 +++++++++ .../src/providers/solana/ui/routes/index.ts | 16 +- .../src/providers/solana/ui/routes/names.ts | 24 +-- .../solana/ui/send-transaction/index.vue | 146 ++++++++++++------ .../verify-transaction/index.vue | 15 +- ...-connect-dapp.vue => sol-connect-dapp.vue} | 0 ...-sign-message.vue => sol-sign-message.vue} | 0 ...saction.vue => sol-verify-transaction.vue} | 0 .../src/providers/solana/ui/types.ts | 9 +- .../action/views/assets-select-list/index.vue | 1 + 11 files changed, 211 insertions(+), 77 deletions(-) create mode 100644 packages/extension/src/providers/solana/ui/libs/get-priority-fees.ts rename packages/extension/src/providers/solana/ui/{btc-connect-dapp.vue => sol-connect-dapp.vue} (100%) rename packages/extension/src/providers/solana/ui/{btc-sign-message.vue => sol-sign-message.vue} (100%) rename packages/extension/src/providers/solana/ui/{btc-verify-transaction.vue => sol-verify-transaction.vue} (100%) diff --git a/packages/extension/src/providers/solana/types/sol-network.ts b/packages/extension/src/providers/solana/types/sol-network.ts index b6d0dc264..722f7573e 100644 --- a/packages/extension/src/providers/solana/types/sol-network.ts +++ b/packages/extension/src/providers/solana/types/sol-network.ts @@ -18,7 +18,6 @@ import { SOLToken, SolTokenOptions } from "./sol-token"; import { NFTCollection } from "@/types/nft"; import { fromBase, hexToBuffer } from "@enkryptcom/utils"; import bs58 from "bs58"; -import { NATIVE_TOKEN_ADDRESS } from "@/providers/ethereum/libs/common"; import { isAddress as isSolanaAddress } from "../libs/utils"; export interface SolanaNetworkOptions { @@ -100,7 +99,7 @@ export class SolanaNetwork extends BaseNetwork { balance: token.balance, price: token.value, coingeckoID: this.coingeckoID, - contract: NATIVE_TOKEN_ADDRESS, + contract: token.contract!, }; return new SOLToken(bTokenOptions); }); diff --git a/packages/extension/src/providers/solana/ui/libs/get-priority-fees.ts b/packages/extension/src/providers/solana/ui/libs/get-priority-fees.ts new file mode 100644 index 000000000..4705b1c9a --- /dev/null +++ b/packages/extension/src/providers/solana/ui/libs/get-priority-fees.ts @@ -0,0 +1,74 @@ +// https://docs.chainstack.com/docs/solana-estimate-priority-fees-getrecentprioritizationfees +import { Connection, PublicKey } from "@solana/web3.js"; + +interface PrioritizationFeeObject { + slot: number; + prioritizationFee: number; +} + +interface Config { + lockedWritableAccounts: PublicKey[]; +} + +const getPrioritizationFees = async ( + payer: PublicKey, + connection: Connection +): Promise<{ low: number; medium: number; high: number }> => { + try { + const config: Config = { + lockedWritableAccounts: [payer], + }; + const prioritizationFeeObjects = + (await connection.getRecentPrioritizationFees( + config + )) as PrioritizationFeeObject[]; + + if (prioritizationFeeObjects.length === 0) { + return { + low: 1000, + medium: 1500, + high: 2000, + }; + } + const averageFeeIncludingZeros = + prioritizationFeeObjects.length > 0 + ? Math.floor( + prioritizationFeeObjects.reduce( + (acc, feeObject) => acc + feeObject.prioritizationFee, + 0 + ) / prioritizationFeeObjects.length + ) + : 0; + const nonZeroFees = prioritizationFeeObjects + .map((feeObject) => feeObject.prioritizationFee) + .filter((fee) => fee !== 0); + const averageFeeExcludingZeros = + nonZeroFees.length > 0 + ? Math.floor( + nonZeroFees.reduce((acc, fee) => acc + fee, 0) / nonZeroFees.length + ) + : 0; + const sortedFees = nonZeroFees.sort((a, b) => a - b); + let medianFee = 0; + if (sortedFees.length > 0) { + const midIndex = Math.floor(sortedFees.length / 2); + medianFee = + sortedFees.length % 2 !== 0 + ? sortedFees[midIndex] + : Math.floor((sortedFees[midIndex - 1] + sortedFees[midIndex]) / 2); + } + return { + low: averageFeeIncludingZeros, + medium: medianFee, + high: averageFeeExcludingZeros, + }; + } catch (error) { + return { + low: 1000, + medium: 1500, + high: 2000, + }; + } +}; + +export default getPrioritizationFees; diff --git a/packages/extension/src/providers/solana/ui/routes/index.ts b/packages/extension/src/providers/solana/ui/routes/index.ts index fc3707ea1..8fc0d4a40 100644 --- a/packages/extension/src/providers/solana/ui/routes/index.ts +++ b/packages/extension/src/providers/solana/ui/routes/index.ts @@ -1,14 +1,14 @@ -import btcSign from "../btc-sign-message.vue"; -import btcSendTransaction from "../btc-verify-transaction.vue"; -import btcConnectDApp from "../btc-connect-dapp.vue"; -import btcHWVerify from "../send-transaction/verify-transaction/index.vue"; +import solSign from "../sol-sign-message.vue"; +import solSendTransaction from "../sol-verify-transaction.vue"; +import solConnectDApp from "../sol-connect-dapp.vue"; +import solHWVerify from "../send-transaction/verify-transaction/index.vue"; import { RouteRecordRaw } from "vue-router"; import RouteNames from "./names"; const routes = Object.assign({}, RouteNames); -routes.btcSign.component = btcSign; -routes.btcSendTransaction.component = btcSendTransaction; -routes.btcConnectDApp.component = btcConnectDApp; -routes.btcHWVerify.component = btcHWVerify; +routes.solSign.component = solSign; +routes.solSendTransaction.component = solSendTransaction; +routes.solConnectDApp.component = solConnectDApp; +routes.solHWVerify.component = solHWVerify; export default (namespace: string): RouteRecordRaw[] => { return Object.values(routes).map((route) => { route.path = `/${namespace}/${route.path}`; diff --git a/packages/extension/src/providers/solana/ui/routes/names.ts b/packages/extension/src/providers/solana/ui/routes/names.ts index 021efe31d..7541bb69f 100644 --- a/packages/extension/src/providers/solana/ui/routes/names.ts +++ b/packages/extension/src/providers/solana/ui/routes/names.ts @@ -1,22 +1,22 @@ export default { - btcSign: { - path: "btc-sign", - name: "btcSign", + solSign: { + path: "sol-sign", + name: "solSign", component: {}, }, - btcSendTransaction: { - path: "btc-send-transaction", - name: "btcSendTransaction", + solSendTransaction: { + path: "sol-send-transaction", + name: "solSendTransaction", component: {}, }, - btcConnectDApp: { - path: "btc-connect-dapp", - name: "btcConnectDApp", + solConnectDApp: { + path: "sol-connect-dapp", + name: "solConnectDApp", component: {}, }, - btcHWVerify: { - path: "btc-hw-verify", - name: "btcHWVerify", + solHWVerify: { + path: "sol-hw-verify", + name: "solHWVerify", component: {}, }, }; diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index ca9026fbe..87644410a 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -161,7 +161,17 @@ import { Transaction as SolTransaction, SystemProgram, PublicKey, + ComputeBudgetProgram, } from "@solana/web3.js"; +import { + createTransferInstruction, + getAssociatedTokenAddressSync, + getAccount, + createAssociatedTokenAccountInstruction, + ACCOUNT_SIZE, +} from "@solana/spl-token"; +import getPriorityFees from "../libs/get-priority-fees"; + import SolanaAPI from "@/providers/solana/libs/api"; const props = defineProps({ @@ -200,6 +210,8 @@ const accountAssets = ref([]); const selectedAsset = ref(loadingAsset); const amount = ref(""); const isEstimateValid = ref(true); +const priorityFee = ref(0); +const storageFee = ref(0); const hasEnoughBalance = computed(() => { if (!isValidDecimals(sendAmount.value, selectedAsset.value.decimals!)) { return false; @@ -255,11 +267,12 @@ const TxInfo = computed(() => { const value = sendAmount.value ? numberToHex(toBase(sendAmount.value, props.network.decimals)) : "0x0"; - const toAddress = addressTo.value; + const contract = selectedAsset.value.contract; return { - from: addressFrom.value as `0x{string}`, - value: value as `0x${string}`, - to: toAddress as `0x${string}`, + from: addressFrom.value, + value, + to: addressTo.value, + contract, }; }); @@ -311,8 +324,9 @@ const setTransactionFees = (tx: SolTransaction) => { return tx .getEstimatedFee(solConnection.value!.web3) .then(async (fee) => { + const totalFee = fee! + storageFee.value; const getConvertedVal = () => - fromBase(fee!.toString(), props.network.decimals); + fromBase(totalFee.toString(), props.network.decimals); const nativeVal = accountAssets.value[0].price || "0"; gasCostValues.value[GasPriceTypes.ECONOMY] = { nativeValue: getConvertedVal(), @@ -329,22 +343,8 @@ const setTransactionFees = (tx: SolTransaction) => { }); }; -const Tx = computed(() => { - const from = new PublicKey(getAddress(TxInfo.value.from)); - const transaction = new SolTransaction().add( - SystemProgram.transfer({ - fromPubkey: from, - toPubkey: TxInfo.value.to - ? new PublicKey(getAddress(TxInfo.value.to)) - : from, - lamports: toBN(TxInfo.value.value).toNumber(), - }) - ); - transaction.feePayer = from; - return transaction; -}); const setBaseCosts = async () => { - updateTransactionFees(Tx.value); + updateTransactionFees(); }; const fetchAssets = () => { @@ -396,13 +396,83 @@ const isInputsValid = computed(() => { return true; }); -const updateTransactionFees = (tx: SolTransaction) => { +const updateTransactionFees = async () => { + storageFee.value = 0; + const from = new PublicKey(getAddress(TxInfo.value.from)); + const to = TxInfo.value.to + ? new PublicKey(getAddress(TxInfo.value.to)) + : from; + let transaction = new SolTransaction().add( + SystemProgram.transfer({ + fromPubkey: from, + toPubkey: to, + lamports: toBN(TxInfo.value.value).toNumber(), + }) + ); + if (selectedAsset.value.contract !== NATIVE_TOKEN_ADDRESS) { + console.log("herer", 1); + const contract = new PublicKey(selectedAsset.value.contract); + const associatedTokenTo = getAssociatedTokenAddressSync(contract, to); + const associatedTokenFrom = getAssociatedTokenAddressSync(contract, to); + const validATA = await getAccount( + solConnection.value!.web3, + associatedTokenTo + ) + .then(() => true) + .catch(() => false); + if (validATA) { + console.log("herer", 2); + transaction = new SolTransaction().add( + createTransferInstruction( + associatedTokenFrom, + associatedTokenTo, + from, + toBN(TxInfo.value.value).toNumber() + ) + ); + } else { + console.log("herer", 3); + transaction = new SolTransaction().add( + createAssociatedTokenAccountInstruction( + from, + associatedTokenTo, + to, + contract + ) + ); + transaction.add( + createTransferInstruction( + associatedTokenFrom, + associatedTokenTo, + from, + toBN(TxInfo.value.value).toNumber() + ) + ); + storageFee.value = + await solConnection.value!.web3.getMinimumBalanceForRentExemption( + ACCOUNT_SIZE + ); + } + } + transaction.feePayer = from; + if (isMaxSelected.value) { amount.value = ""; } + priorityFee.value = ( + await getPriorityFees( + new PublicKey(getAddress(TxInfo.value.from)), + solConnection.value!.web3 + ) + ).high; solConnection.value!.web3.getLatestBlockhash().then((bhash) => { - tx.recentBlockhash = bhash.blockhash; - setTransactionFees(tx).then(() => { + transaction.add( + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: priorityFee.value, + }) + ); + transaction.recentBlockhash = bhash.blockhash; + setTransactionFees(transaction).then(() => { if (isMaxSelected.value) { amount.value = parseFloat(assetMaxValue.value) < 0 ? "0" : assetMaxValue.value; @@ -420,7 +490,7 @@ watch( [isInputsValid, addressTo, selectedAsset, selectedNft, isSendToken], () => { if (isInputsValid.value) { - updateTransactionFees(Tx.value); + updateTransactionFees(); } } ); @@ -463,7 +533,7 @@ const assetMaxValue = computed(() => { const setMaxValue = () => { isMaxSelected.value = true; if (isInputsValid.value) { - updateTransactionFees(Tx.value); + updateTransactionFees(); } }; const inputAddressFrom = (text: string) => { @@ -521,7 +591,7 @@ const inputAmount = (inputAmount: string) => { isMaxSelected.value = false; amount.value = inputAmountBn.lt(0) ? "0" : inputAmount; if (isInputsValid.value) { - updateTransactionFees(Tx.value); + updateTransactionFees(); } }; @@ -530,27 +600,6 @@ const sendAction = async () => { const fromAccountInfo = await keyring.getAccount( addressFrom.value.toLowerCase() ); - // const transaction = Tx.value; - // transaction.recentBlockhash = ( - // await solConnection.value!.web3.getLatestBlockhash() - // ).blockhash; - // const msgToSign = transaction.serializeMessage(); - // sendUsingInternalMessengers({ - // method: InternalMethods.sign, - // params: [bufferToHex(msgToSign), fromAccountInfo], - // }).then((res) => { - // if (res.error) return res; - // transaction.addSignature( - // transaction.feePayer!, - // hexToBuffer(JSON.parse(res.result!)) - // ); - // console.log(transaction.verifySignatures(true)); - // solConnection - // .value!.web3.sendRawTransaction(transaction.serialize()) - // .then((hash) => { - // console.log(`https://solscan.io/tx/${hash}`); - // }); - // }); const txVerifyInfo: VerifyTransactionParams = { TransactionData: TxInfo.value, isNFT: !isSendToken.value, @@ -569,6 +618,7 @@ const sendAction = async () => { fromAddress: fromAccountInfo.address, fromAddressName: fromAccountInfo.name, gasFee: gasCostValues.value[selectedFee.value], + priorityFee: priorityFee.value, gasPriceType: selectedFee.value, toAddress: addressTo.value, }; @@ -585,7 +635,7 @@ const sendAction = async () => { await Browser.windows.create({ url: Browser.runtime.getURL( getUiPath( - `eth-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, + `sol-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, ProviderName.ethereum ) ), diff --git a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue index 59fff281f..238dc2525 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue @@ -93,20 +93,24 @@ import SendProcess from "@action/views/send-process/index.vue"; import PublicKeyRing from "@/libs/keyring/public-keyring"; import { VerifyTransactionParams } from "../../types"; import { getCurrentContext } from "@/libs/messenger/extension"; -import { DEFAULT_EVM_NETWORK, getNetworkByName } from "@/libs/utils/networks"; +import { + DEFAULT_SOLANA_NETWORK, + getNetworkByName, +} from "@/libs/utils/networks"; import { ActivityStatus, Activity, ActivityType } from "@/types/activity"; import ActivityState from "@/libs/activity-state"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; import { BaseNetwork } from "@/types/base-network"; import { toBN } from "web3-utils"; -import { bufferToHex, hexToBuffer } from "@enkryptcom/utils"; +import { bufferToHex, hexToBuffer, toBase } from "@enkryptcom/utils"; import { trackSendEvents } from "@/libs/metrics"; import { SendEventType } from "@/libs/metrics/types"; import { Transaction as SolTransaction, SystemProgram, PublicKey, + ComputeBudgetProgram, } from "@solana/web3.js"; import { getAddress } from "@/providers/solana/types/sol-network"; import SolanaAPI from "@/providers/solana/libs/api"; @@ -122,7 +126,7 @@ const txData: VerifyTransactionParams = JSON.parse( ); const isNft = ref(txData.isNFT); const isProcessing = ref(false); -const network = ref(DEFAULT_EVM_NETWORK); +const network = ref(DEFAULT_SOLANA_NETWORK); const isSendDone = ref(false); const account = ref(); const isPopup: boolean = getCurrentContext() === "new-window"; @@ -157,6 +161,11 @@ const sendAction = async () => { lamports: toBN(txData.TransactionData.value).toNumber(), }) ); + transaction.add( + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: txData.priorityFee, + }) + ); transaction.feePayer = from; const txActivity: Activity = { diff --git a/packages/extension/src/providers/solana/ui/btc-connect-dapp.vue b/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue similarity index 100% rename from packages/extension/src/providers/solana/ui/btc-connect-dapp.vue rename to packages/extension/src/providers/solana/ui/sol-connect-dapp.vue diff --git a/packages/extension/src/providers/solana/ui/btc-sign-message.vue b/packages/extension/src/providers/solana/ui/sol-sign-message.vue similarity index 100% rename from packages/extension/src/providers/solana/ui/btc-sign-message.vue rename to packages/extension/src/providers/solana/ui/sol-sign-message.vue diff --git a/packages/extension/src/providers/solana/ui/btc-verify-transaction.vue b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue similarity index 100% rename from packages/extension/src/providers/solana/ui/btc-verify-transaction.vue rename to packages/extension/src/providers/solana/ui/sol-verify-transaction.vue diff --git a/packages/extension/src/providers/solana/ui/types.ts b/packages/extension/src/providers/solana/ui/types.ts index 00681a2e4..e0453d229 100644 --- a/packages/extension/src/providers/solana/ui/types.ts +++ b/packages/extension/src/providers/solana/ui/types.ts @@ -3,9 +3,10 @@ import { GasFeeInfo, GasPriceTypes } from "@/providers/common/types"; import { NFTItemWithCollectionName } from "@/types/nft"; export interface SendTransactionDataType { - from: `0x${string}`; - value: `0x${string}`; - to: `0x${string}`; + from: string; + value: string; + to: string; + contract: string; } export interface VerifyTransactionParams { @@ -17,6 +18,6 @@ export interface VerifyTransactionParams { toAddress: string; toToken: ToTokenData; gasFee: GasFeeInfo; + priorityFee: number; gasPriceType: GasPriceTypes; - TxInfo: string; } diff --git a/packages/extension/src/ui/action/views/assets-select-list/index.vue b/packages/extension/src/ui/action/views/assets-select-list/index.vue index 63206b02f..f7bc831d3 100644 --- a/packages/extension/src/ui/action/views/assets-select-list/index.vue +++ b/packages/extension/src/ui/action/views/assets-select-list/index.vue @@ -90,6 +90,7 @@ const yEnd = throttle((event) => { const searchQuery = ref(); const listedAssets = computed(() => { + console.log(props.assets); if (searchQuery.value) { return props.assets .filter((token) => { From 28713b61fd87b320d7cc63e214a4fe10f41f3fd8 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:38:13 -0700 Subject: [PATCH 229/375] fix: minor issue --- .../src/providers/solana/ui/send-transaction/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index 87644410a..d2f626201 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -413,7 +413,7 @@ const updateTransactionFees = async () => { console.log("herer", 1); const contract = new PublicKey(selectedAsset.value.contract); const associatedTokenTo = getAssociatedTokenAddressSync(contract, to); - const associatedTokenFrom = getAssociatedTokenAddressSync(contract, to); + const associatedTokenFrom = getAssociatedTokenAddressSync(contract, from); const validATA = await getAccount( solConnection.value!.web3, associatedTokenTo From f756a4462ac3eaf18db00b33fc7ba1dd1702a61f Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:49:09 -0700 Subject: [PATCH 230/375] devop: publish to npm --- .yarn/versions/81e941ed.yml | 7 +++++++ package.json | 4 ++-- packages/keyring/package.json | 2 +- packages/name-resolution/package.json | 2 +- packages/signers/ethereum/package.json | 2 +- packages/signers/kadena/package.json | 2 +- packages/storage/package.json | 2 +- packages/utils/package.json | 2 +- 8 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 .yarn/versions/81e941ed.yml diff --git a/.yarn/versions/81e941ed.yml b/.yarn/versions/81e941ed.yml new file mode 100644 index 000000000..b638a0194 --- /dev/null +++ b/.yarn/versions/81e941ed.yml @@ -0,0 +1,7 @@ +undecided: + - enkrypt + - "@enkryptcom/keyring" + - "@enkryptcom/name-resolution" + - "@enkryptcom/signer-ethereum" + - "@enkryptcom/signer-kadena" + - "@enkryptcom/storage" diff --git a/package.json b/package.json index 1dfed6c47..327ba745f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "enkrypt", "packageManager": "yarn@3.8.1", - "version": "0.0.2", + "version": "0.0.3", "private": true, "workspaces": [ "packages/signers/*", @@ -25,7 +25,7 @@ "watch-ts": "nodemon --exec 'yarn run build:all && node scripts/compile-done.js'", "upgrade": "yarn upgrade-interactive", "version:bump:patch": "yarn workspaces foreach -pv --exclude @enkryptcom/extension exec 'yarn version --immediate patch'", - "publish": "yarn workspaces foreach -pv --exclude @enkryptcom/extension exec 'yarn npm publish --access public --otp 474911'", + "publish": "yarn workspaces foreach -pv --exclude @enkryptcom/extension exec 'yarn npm publish --access public --otp 312003'", "version:apply": "yarn version apply --all", "prepare": "husky" }, diff --git a/packages/keyring/package.json b/packages/keyring/package.json index ded577548..e29afb443 100644 --- a/packages/keyring/package.json +++ b/packages/keyring/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/keyring", - "version": "0.0.3", + "version": "0.0.4", "description": "Key management for enkrypt extension", "main": "dist/index.js", "module": "dist/index.mjs", diff --git a/packages/name-resolution/package.json b/packages/name-resolution/package.json index 2f3c18eaa..c65db2199 100644 --- a/packages/name-resolution/package.json +++ b/packages/name-resolution/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/name-resolution", - "version": "0.0.6", + "version": "0.0.8", "description": "name resolution module for enkrypt", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/signers/ethereum/package.json b/packages/signers/ethereum/package.json index d81c64826..39ae47329 100644 --- a/packages/signers/ethereum/package.json +++ b/packages/signers/ethereum/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/signer-ethereum", - "version": "0.0.5", + "version": "0.0.6", "description": "Ethereum blockchain signer", "main": "dist/index.js", "module": "dist/index.mjs", diff --git a/packages/signers/kadena/package.json b/packages/signers/kadena/package.json index 5b205df0d..f6878b65e 100644 --- a/packages/signers/kadena/package.json +++ b/packages/signers/kadena/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/signer-kadena", - "version": "0.0.1", + "version": "0.0.2", "description": "Kadena blockchain signer", "main": "dist/index.js", "module": "dist/index.mjs", diff --git a/packages/storage/package.json b/packages/storage/package.json index 36fc6d44b..b8ff7a8db 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/storage", - "version": "0.0.2", + "version": "0.0.4", "description": "Storage management for enkrypt", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/utils/package.json b/packages/utils/package.json index 8199c818d..bad34a2e8 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/utils", - "version": "0.0.3", + "version": "0.0.5", "description": "utility functions for enkrypt extension", "main": "dist/index.js", "module": "dist/index.mjs", From f31cc01b6134bae399cd05e09e790b6d2cbbf93e Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 8 Aug 2024 11:59:44 -0500 Subject: [PATCH 231/375] devop: add blast nfts --- packages/extension/src/libs/nft-handlers/simplehash.ts | 1 + packages/extension/src/providers/ethereum/networks/blast.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..c6a23dee9 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Blast]: "blast", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/networks/blast.ts b/packages/extension/src/providers/ethereum/networks/blast.ts index 387ab9dc9..57f972478 100644 --- a/packages/extension/src/providers/ethereum/networks/blast.ts +++ b/packages/extension/src/providers/ethereum/networks/blast.ts @@ -3,6 +3,7 @@ import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; import { EtherscanActivity } from "../libs/activity-handlers"; import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; const ethOptions: EvmNetworkOptions = { name: NetworkNames.Blast, @@ -19,6 +20,7 @@ const ethOptions: EvmNetworkOptions = { coingeckoID: "ethereum", coingeckoPlatform: CoingeckoPlatform.Blast, assetsInfoHandler, + NFTHandler: shNFTHandler, activityHandler: wrapActivityHandler(EtherscanActivity), }; From 4407195ed2842de89e168d6391b38cb249af2d00 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 8 Aug 2024 12:04:21 -0500 Subject: [PATCH 232/375] devop: ignore node_modules folders in rollup --watch --- packages/extension/configs/rollup.config.base.mjs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/extension/configs/rollup.config.base.mjs b/packages/extension/configs/rollup.config.base.mjs index 6f83f2904..b9c304362 100644 --- a/packages/extension/configs/rollup.config.base.mjs +++ b/packages/extension/configs/rollup.config.base.mjs @@ -6,9 +6,16 @@ import inject from "@rollup/plugin-inject"; import replace from "@rollup/plugin-replace"; import packageJson from "../package.json" assert { type: "json" }; +/** @typedef {import('rollup').InputOptions} InputOptions */ + const enableMinification = process.env.minify === "on"; + +/** @type {InputOptions} */ const base = { input: [], + watch: { + exclude: /node_modules/, + }, output: { dir: "dist/scripts", format: "iife", From e358c2701c05e3bf0c1ca184c8ccf2f1d0d45a32 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 8 Aug 2024 14:53:34 -0500 Subject: [PATCH 233/375] devop: add arbitrum nova network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../libs/assets-handlers/assetinfo-mew.ts | 4 +++ .../libs/assets-handlers/token-lists.ts | 1 + .../assets-handlers/types/tokenbalance-mew.ts | 1 + .../providers/ethereum/networks/arb-nova.ts | 27 ++++++++++++++++++ .../ethereum/networks/icons/arbitrum-nova.png | Bin 0 -> 17854 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ packages/types/src/networks.ts | 2 ++ 9 files changed, 39 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/arb-nova.ts create mode 100644 packages/extension/src/providers/ethereum/networks/icons/arbitrum-nova.png diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..a8b74b3ed 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -18,6 +18,7 @@ export default async ( [NetworkNames.Optimism]: "optimism", [NetworkNames.Binance]: "bsc", [NetworkNames.Arbitrum]: "arbitrum", + [NetworkNames.ArbitrumNova]: "arbitrum-nova", [NetworkNames.Gnosis]: "gnosis", [NetworkNames.Avalanche]: "avalanche", [NetworkNames.Matic]: "polygon", diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..16d87abe8 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -38,6 +38,7 @@ const NetworkEndpoints: Record = { "https://block-explorer-api.testnets.zksync.dev/", [NetworkNames.ZkSync]: "https://block-explorer-api.mainnet.zksync.io/", [NetworkNames.Arbitrum]: "https://api.arbiscan.io/", + [NetworkNames.ArbitrumNova]: "https://nova-explorer.arbitrum.io/", [NetworkNames.Gnosis]: "https://api.gnosisscan.io/", [NetworkNames.Avalanche]: "https://api.snowtrace.io/", [NetworkNames.Fantom]: "https://api.ftmscan.com/", diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..ce8ba8e12 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -75,6 +75,10 @@ const supportedNetworks: Record = { tbName: "arb", cgPlatform: CoingeckoPlatform.Arbitrum, }, + [NetworkNames.ArbitrumNova]: { + tbName: "nova", + cgPlatform: CoingeckoPlatform.ArbitrumNova, + }, [NetworkNames.Gnosis]: { tbName: "xdai", cgPlatform: CoingeckoPlatform.Gnosis, diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..335dfb3b0 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -17,6 +17,7 @@ const TokenList: Record = { [NetworkNames.Rootstock]: `https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/tokenlists/rsk.json`, [NetworkNames.ZkSync]: `https://tokens.coingecko.com/${CoingeckoPlatform.Zksync}/all.json`, [NetworkNames.Arbitrum]: `https://tokens.coingecko.com/${CoingeckoPlatform.Arbitrum}/all.json`, + [NetworkNames.ArbitrumNova]: `https://tokens.coingecko.com/${CoingeckoPlatform.ArbitrumNova}/all.json`, [NetworkNames.Gnosis]: `https://tokens.coingecko.com/${CoingeckoPlatform.Gnosis}/all.json`, [NetworkNames.Avalanche]: `https://tokens.coingecko.com/${CoingeckoPlatform.Avalanche}/all.json`, [NetworkNames.Fantom]: `https://tokens.coingecko.com/${CoingeckoPlatform.Fantom}/all.json`, diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..3e6e31be5 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -38,6 +38,7 @@ export type SupportedNetworkNames = | NetworkNames.Canto | NetworkNames.Rootstock | NetworkNames.Arbitrum + | NetworkNames.ArbitrumNova | NetworkNames.Gnosis | NetworkNames.Avalanche | NetworkNames.Fantom diff --git a/packages/extension/src/providers/ethereum/networks/arb-nova.ts b/packages/extension/src/providers/ethereum/networks/arb-nova.ts new file mode 100644 index 000000000..070244f91 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/arb-nova.ts @@ -0,0 +1,27 @@ +import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +const arbNovaOptions: EvmNetworkOptions = { + name: NetworkNames.ArbitrumNova, + name_long: "Arbitrum Nova", + homePage: "https://arbitrum.io/", + blockExplorerTX: "https://nova.arbiscan.io/tx/[[txHash]]", + blockExplorerAddr: "https://nova.arbiscan.io/address/[[address]]", + chainID: "0xa4ba", + isTestNetwork: false, + currencyName: "ETH", + currencyNameLong: "Ethereum", + node: "https://nova.arbitrum.io/rpc", + icon: require("./icons/arbitrum-nova.png"), + coingeckoID: "ethereum", + coingeckoPlatform: CoingeckoPlatform.ArbitrumNova, + assetsInfoHandler, + NFTHandler: shNFTHandler, + activityHandler: () => Promise.resolve([]), +}; + +const arb = new EvmNetwork(arbNovaOptions); + +export default arb; diff --git a/packages/extension/src/providers/ethereum/networks/icons/arbitrum-nova.png b/packages/extension/src/providers/ethereum/networks/icons/arbitrum-nova.png new file mode 100644 index 0000000000000000000000000000000000000000..00ef9438dc296b526696e18ff87b26dc20e6eb35 GIT binary patch literal 17854 zcmb?igL5X&(|=;~iS6WKUToXE*tm;r+qUiGVkZ~dwr%s5Z@vG*TU)zRyEQw#-P_aC z-Sg=%1vzm9SR7aY0DvGVA)@r%zW#SYgMMG3q9-iB8*np0SwR4xE(Y%10OI?e$Vfs- z765Rk004Xg|F6IAF#zDi2mqYw0{~p9005?KW}70k$2*MCQDXGy~M6DUVX zSy8BCXlNh`3zIdH8~`BFCn+MR;<|dFi5 z_NBrjbfP;$6ob_dAd7=226~fPla4fhXSvL8bwb12^>zy8M^V3#|`{@}@N#QYsKQ z+v(riucQg(=cU0F^-u3n(;8CRfPOPfp_WiE(6L6}+$poL0rE#)^&^!elB6SOYFb!W zXcZ(eHC`UG^3HTWMRK9~+NoK=M(cVZ4OP@EOHW9tEC0`<+jP6-CZS2|B74H!P@+N) z2;mhB7=6^i~&fwPx=>?M=ch4vGaqkU2xQJGUfFjHO#f%;z`6gIJRE|zl ziKl=5it2y?ArpOz^`PKx-^@>;(4n9!nf#`s9sZ;17@E+$KioniGbKj;ufYO14yax< z<$OYIg!B!LDZ81y@blc!a&N%bEzM$G&|j{X-4^dgRO|XO+HP=feHM-!wql zck$qfIw>By@jtGFvVv#UlIK&Zn(sC*Qs2>JJ>rlq(C^gi*MN2PD!nxAi8w#F>Sk=I zWdU%e_Gl?2E4vm(5}@D%P6b!w^C^D zY8RjDtn7#}XJBdCAfXxZ~CFH7V(IX7{>7oKZ}@xvY7`NdXO!^F%WNzc@xPr8DqtrSa2(#9heP7w^8ofNJ&ngmO3H%rY}`J zhc@#Cx}SG9fb}Vl=jC~CB)y-QYE3|!A11HA3P(j9yJod`(B)H@=i`9(!K{>+R;JHO z!5@@X)8kpp!MX&FJiFmPq;$3j`8&>UrUmGI!?1rJ=A<3CNMID-_6+9fhIzG0wLpfV zPa64zP;W8(@7TM@@{~mxkBRUd`WW-BMAh|3eYt*l)lZ?#D$voTr(d6h4wD5(e|hiN zscQ9tF~sO>48F&(u-m$x{Z)RM^%sOk9J;Ql(?TJx-m{J6YGt*OGcw}sXsw|rH&L%Jk?qv!kdW! zp0}!wuOGvfil73(zOl!o}(eDSA8OLo>A|nn)A_PLRjb-s4z) zSD)ct?T#&epVo{ly+D|C}{gLhKaC;qUmI#mcsSr@~k z>&k!qJ6Z*rX=O=CA1#v{Pn-=n#v6I|WnE)@|CXM%OOn(q(wJTP5$aDWy9>r_qzGi* zyVzxhD3=V*m{-)Sl$DBZ8+eCi8{>f^vMy=ZblIgz#$+}4L??L$wqjs7u1K#N{`XqF z9%$Q2+SWJGY|qCyqZxS9s-tcZVbg|0^xpq|s^xn=j=GV$tqW7F11eGzZs|%HgN$QD zBuv|W-Gu)jI(Z^35L7WtPOkh`_;IgP_IRXo2$|rfq#%_;8b+vxH!wLL z6>*wnM+UHmr>p*cN~RsVRB#l~Whfr6{KD)F3YHBJi36cULZB~8aZWmkdx2X$pPB_=tG5JqyB5X)Q4Z{#;jE~-0 z&(_=V+mqP|s3Y<&0DWv3k|qf;cJly-Prt{blOCdFNY zAl-?*Zt?72tm|V-CbYV1&d%vrT`=bmdRZUNT|GtfVH71aBX&ETfwjBN&au8=Lh zaj#lh+p7hYNKzOi%I6puJ_ArJWCMsC1ZFMspAfKa1sJ6nVe_G;$8xyYXTC+dCt7qL zl$>S>PgC6NMu_tYu9Xc*Rb6c(;ez{Lp#~J;2;aF^54*s(L{@s8x@Q&TLHJUBvjR;<()ruS#^4Rm~`GN z$qNjYr4h0v6x27)^3Lma>>KrABWTXGYYd3-QjvUR}QEmtv z^+1Pw#tA)EWHYROv&B-xMVVM@RV&iB?$CcRCyRcN^9!28oK^&7U-5UGXgkw`=J#Cw z^ezkk1tvB8hmrh+LxAIO_2IaIyY(r`ah{1DeT;*YVYtLD#&A=jQ&79+EUMf)vPRbt z^YAzC#oq|*xPnyHvw*yq6Aj;Gq(U-O+E0KHVUK);z9icNcU;U$)wAFt1}GLnJ<~pl zV>k0Ce4xq3DAq^YQiBspR~v4{;4!Y18RQ^Gu~dQ9%*JwX<7gh=F$tQlz(cyhF>w8X z{gg=@xKjrz|J(kzu5Zm{&#Gk8&boo;E;FTwD)wVo4|AI?HXr^#*MYwFHAysQSz(tH z*OtG_^@NvpYK=*_ap!waup_^aQR6PGPDNU%_s#T|GkjZ&)lx|IjM!Kz{m#od-G1HE z?74dH?@{J>s!LRp#pKcqgAI(A01a&3i&ghd@0hu(qt}V=6=GaOJKo($GQ4w*=|WV- z6LmmzmO58xs~osefw{3WF1u0&vwBF&cLiZN&o$_0mk{ZAB^t!)LN>@7o-gFVN3BPV ztyi{H9jI#1tn11yE^<&jth8pxz_h@L@$uOcKw#@tQPf6>=)Av|0abT>VOc(syE?P6 zKm-G*f74&yieu@q$VXCmg>hg~)G`L%d2EPydeV7oS$XKsTgEIJ#*M-zF0(4UK)S;} zEPAI5>~~hF5u2#SUs6knlm+X@ zYSm6ky^omt5+mhqRn;*}?l%7FA3!ACnYd#*B+$z0Aiw}d_8ebJ!+VXZ9w$X(a@RA5 z!{^*l#Q1=7FI6-;IS!W?{j=MhS_doy=8n#8VBuAH6j~FyaU4)&dh?$WcxX_rs)vrq z8=N|Dv^2YWC5|EL@CAlKQ|blzJrxMbwT@<&nYK6S&jNYQRJj@meGf!~U+11bHIiuL zYDFukXYp%WCxsL#ITa6@gij*7VUY~WF17FBPYq=}2okb;FX@UdN>=-t6vH!MkP_4W zfqe;e*03}WSBsqVAaFsiSNc0W9~$Uh|Adg$u(T)7&gPOeG_o(J+BosQ3?%yOZu2?8wpbvHAd&>jpSG7pNsBEJyaT>HGWV#x$6YYp4#|s2 zS=N^yelppwQiF~3LF3du zyMaRK%LI8#VYL2{$Tv-h+fu{5J2Q zTPYj8WBbqRqu^#70}0}KOELIHIQZ;F*;BqwA=_E*m(H;Z?x}Hka2>pHK667oB{YAD zH_5kxtOumtQS`|D39FSdmyDe%8alvwr^4AEjyj-v0NL*08+T8mB!#SMJsPzfxX(w}9aqP7Lw6;8zQ_k4)n z+gzIS?Ix|Z09R79srRbw4 z`hpF99GHAk#0Fv#G9MV*f3)@X&z0RuOJhjQb4*YAy9tTYR4?TMF2kbHlRix4vr6^^ z-N&YTc#$tGi*gP5#g&zW?WbZAPc4j_-bK4COl+6YTkrBBgv&5` zjN7_Z(28JZ#L^l z5S#eukClN~xY*Gc2Zq88$z1NA<2%6zuZJjG|6t*7P2Dl@Ac*3?77gNKapO`bjMpa2 z)cqSNy`e@MTDo;HJie$33!^|>2HNG}tE+|5VTz}F8CCaWc;#%EB|@!6p@iO&I{xQg z0J>F|S%Whe>-O?T6cBKI7xTR9%(DU-u}R|<0`JRKsoHzS% zEaquNzwk%9so*;zn>(vLgV<5N;i()JVM0GbJR|Or&|r1aoIUp)VRyKM;IB> zm$Vb7NRtJ)9gK@kTVMCoowKl<5IBLE6>z3%L@u}H!v?apt?sezF?B!C$F&-=JuK)K z^*<09B7w$<7COb4=xvWAfB!bvr6Gc3lGIBgQlO3x1oy@D@On&3L75|?z{O(#9?o!jVN+r>7H+b)=j(ufJ%o6p!xwY30ZLmJt1O+45tyEr#onpwlsO$aGNozfnC69SK2B>MEZfl6j<4 zVbdNyW+tOyJBdY6n}hv%LG#;}7Sv`Tr%>8B^%t!b&9D&uA|3lG(aDpVr3s$6>EAZ} z&A1_(tcV$xM463rr`VM~a5we*52DW5Nwf}GaePeG0q4*03>n}TB$Zj*XJ2|~#3rRjhwQO;1t9gE+;sH?L3kDWQS5Y$34QVBJ?qoEVNM)>zp3qW;_m5MNS zLRLCUmk?0cRigs|{7<}E4^cefy;0mVWz96)8eGdz*cVWMsx)5+8*%=c$Re|x9gx&p zJT9HUL$5sq^zF8x*(UV*fF8yeGE^~_@-!5Wk|{v1uwXWNO4UBMBS)NO^9?i!4b)M$ zaSWYQS+Uz!-XH10+t`&%Z#LBOYri$Qu!oM3XX55QHZ=+i&hz`TCn?6%^Uc1Bq4;|a z562ZK^ZB0~a=1`W1NrUFJ8rufVu62XcIUFPh@Le{ct|AHRTd1&jP%T0jVqv~4jLBl zF)RhiHPGKaXYhY=f<0n$vny_r745S)@od>PL77NzX02<6T5sByIk z^sE>#%ORyh52IU8E)p8*qb2JGG~6VV=f}xc>gtGQN~U3{C$*dHq{TFk#9f_KxUtUy z2_70mg0>x-%g3NhD8vjo@Xi&3&Yb3!(-hNmwz-tJfwCY?c(qmattztyHt=#ARzNY6 z9ctE4TQV}7+@T~|ECl3z!_Y_F!u|Ry_(bU&eS1MUf7%(9ch+aT5 zai9qUeNx>+`_Cv4jPEZem##*iLpHb4=_X%nwp^AEemAGAd-`_SNmB@Jao*7a3723b zVALb#RzjKiDg*O=X%x6G+uPeYC^0SG^dt~Xr_t>w-Q6>_W~^YWL?lUHklzEZ`BlCk z(4UoSH$$)c`lHY#sYQBZCG+!^LALAn(^%Xb)W?;vsXxp(b+@n0ECe|%?fG0svrN)T z0u6(I{dm$CBED^i=+EU3pqjVnwEzJ?nMT{~S|%L7XZ$leC(x}6 zbZ;3oI`$G3p4ZEmuQ;phYlqKD*c|^>YCLVC%t9W35*Lsh%y_1{$g)#uI=H%VVGkPM zg+k8IjZRL*(wj<0@$<4)z_{J|@2&$tUoV4pg743pX{Zxn=^eY+#3t373@8NF) zCin#ArO~4ANDnFJ<-z8#(V&^({=N3dO+BuqLA{KX(`7>#PBZ@eMtU%GZ4plB@9hWF8e*a8? z?8+jEz{x)2oq^H5T=JY)2^r*}27XN6xPzuwI`gbIK4+VFMK<_MMUFBryr3fRh zI~$o=^B!u{EDt?68Uv^G?-XAkqT;^pEYA=gX;q#+ ze%F+08B%{|KMvNS&^d^Xp*UZ%53vKq@Ln`#dT_qo*M9 zqji3U!!1^{k&37}=|TG6!~+)P`l8uP86`i-mRkTG0PU+z+Cq7(~(%R*%3 zN$PJips*QX8!79oL88^C^J&EKcbCn7L__E=9KZAWM4nkzs(@bZ238D>;(;(~<)GUk zZjCfuBN-lG{d{1<@-FmiY$G{1u9jJCBk&E^Cq~lbw7zcU5)lsv8~*T35)VE#Q+^uL zN5g%?dN3Lpa<{`mE?6si)UA*InAu5@GK;Z#CFSPMYTa-{8;1xu0rFvZ`FC;)_zn@} zPB|^=I(;nee6EHqcZ!iSS5k%9Yh^$3Cg=FE%Cj3BVb0`G!sC}1K zN;bE)OP6zQ!rF_snF*OrPOet>omIievCc!?ch{yc#M+J7QW>Dkolvlx*LwRJSkd7; zH)y@42jR=JU|_wxe1x=D(+FliLeLQx1Q+6NgsR|FioOI8NgJ==dIG-v3}n@W*lY=1 zCL9kJtQpTyr?wzbC}2n^!rwC6fXbJ?o)Psl$ZO4(Gf6KRx#Or}-VtEPQ1zK1?nC># zR!bc%#K>P~u%H)>$DsR2REq+I27`b!H$4!BPYKtQ$Sz~Pumyr|?oK2P@#7%?L@~H7 zVhIGkvLJLNylI48_dwDYoJOI?vN*rM$yU>Dc+zlUibg3^k69fX!i62};3>7RrPMtr zxR(95YTB!0Ml|*{=e|GhLs+_=;nE%l`}xyh_KDrNb-5UZNx$tMW-; z(BIRls=a9U>$w3{I&mQ-T7*U{v0bG(o^a%$?s)erGwh<#9S=S&g+J@UtD0or^M5?)ocGSBSaC8s zZ)VL0yWO%}6Q|_xb^XQHo^0zVwPWxzeIMh(XJR^#&EMb;msRvkGNk>mR?W%6B7%G? zb?Ja7PF9%o!T*am9hstuW=sxQl((_c>kx;l!}5|-z8f&Yp~%D{>5o>}KAEW89aegz z`WQ@A2lmV1B!qn5?H1z1C!}+(juQ4t#&{_1xbF5T$rKW2mysHI~A-Jq&#YORHbhoq~ zp6$tP)wnyS-nOviM%7~Rx|mD#zHC!~?-9=j!d%^-v`d)~4v~(b1>7GJE=9ey@qaEt zNIR1^gvNLV2y&8RP%$t7$M!G_7FZ#G@kr4tsK*E@OnQx&juAlS!6N8|yRLx@v2i_( zN)HY(O-S?w@`Kl0)@`NwM0_+ty@6q5feZ^k|M5%`ZIJ-@L*l9DU-2+3=xdC)}0Agx$O`;E;#OQTLyU zwyN;>hmI9c=x~cF)6QL5!EHy?Apb~w66W{Jr|W`IW-0fTgG6i&`Q;?7is^<#RQXPrUpRb)_(w@jITaFZL`?`nPg>Xe`!-nE z1`_Y;$93;o$*VFQMPn*N6_C2K70rRzUP2W|%0zgZ&umF;1HxhJ998-$2S5IPK)CCG z0trapjp*KlldB@Jhx#100;L><66iVdxOe^4BAKMI$k@KEPxZg}z-H*xVw4|0F*}bg zwyH=*Lb*Peg`h_t3dq$WG5o;ni~JL6z41|u@4C+YB<>n@*T*cmh<_|?1ewG2f{7ZX|pjWUXH+s#u=^I%@L3{=-igcNRT5T zXl?hikiIh8;{z~!%=e8q2B|gsg`4$oFRPz%M7bYOM9^M{O23u+DL3V|0H=|oguikn z2vbow>9F&Mv@nX_Y)dDMg>$@|h-CMMwdTAq=y|d$`NEI*1c7jnR8DXT_|j(2>7SG+31j?v zTSq>Rn$5JmdzX~DBQ_n(^_WM@IsGYix4Akp(0bKh+FR&eF^5cvh!O!l%(X0X>}W7A zS*~dDbG$!hj2M#~Z1oGYjwt%s8|05B*(@5i_iV-0x2cY$ObVaG6xW*{SS&yKfEtYt z#Q=+4Ai*K5^x(Kt-GE@T96-?ek<$eQ*q~;4@d z*@kO~`!<$c5j=p&SMVwJ_C#86^TEEeACbjq#VpQ@vMG4xhNN0&X6)%a0l<6fOlGq&)4i0KLD zawiHiLfG_Eaf?ge&=Z_O3rN@aq&6{xCC=&Yyu>tmP7WhP3WEg`9CShw$^0 zv)l{i1-91Pf!$-M4Eu^_y`@X6Qj9yk9{v7)@cK&_ztd}+MG~KorI)kpd3*Mm1Ug)x z`orDovt_{9QoM>;-dem_jGrRfne&F`azZ8-$QRlE#bcF;yC~i_EHzGhMroPT`@q89 zvi&l-Ae#$&7I&B*YEq>d4nb-icfZ0#R=u&9jj}WwrTWE)@hN@*9bAu$!a{0Bw8Sl# zJp^|6C4aR*SH$FVuJ zt#D?oI62ow6Fp*#POwKof?;47n%ZtWR0WS;M@YrsnO5uiiQ&8j+VN^3LnE%-sCY#F zh6XSFDHejVhaTyjqG$eYfX2P|eMI_AI8*)4lhGj;`W=dKZv^`TWJSe6;al2S6yS)r zS6gIc7z{Cd+b_L#BU}Sj5}So3Dn9Vo(qOp{>*&=wgZ{0XqAYrqoDhdvd@9RXX8=)%C_>jNLdGaj}_idd8g=0{pcXKkbuv!a&73D~K zULxl)+U>q5^PCQbG^nQH-gs122RCby19<^D0TC z0c)h<-%U>D&C(Ch7IWIvvyT`qapF~_j@{!O6&YsN@)ZxDrMHoAn@WBOBvu}|PH_1f zX$J+UAGW9g#>L!aT*uVf5rBMUo3KUHS~BvQ9O8+i{%@p;Ko#uOt(x_Ed)AU{9SeA-nW)yBVDaupF2=ZH#sD_4Pm& zWm(%zqZOz*@~nY6hs@;>iD?#_za(vJBZJ6_+i3&Hvx54dXU4*A>|eG)dXfj0>xZ#) zRPZfXrVx%^jb^*$S`pb;R1eW27MPLu+ls0ia00a+R7Y72 zUZIuAOfSeBi2sBT)8YG0UcxP7gbiy-aty@wJDTZC1cmnU;X6hCg^k~%R7!nd!0(J$ zb(-Gc8D`8lzKu=xf~3^aesMeO#y3(qjch!f3oA*`mX0((F>CXyE{DR_r~UmRt{g)X z)%W+1n@a`U7qc_Q-!m&Wh=7@M%(ER-$a~~|)6s6}9#JVU4{I3AtjiFi4`XeByU7IQtCnoFb{yeIxmr1gNUYa=GJ^;Q z3pZcuQ89n-7J}cQNX^am31KKG7M~cb;%G1yrY;D3$amwe5Aa0aD=Udyt70=oK{lCik=HJXNmbn-Cm0 z&{Yql3Y+jDk;~i9U6)*HqO|NU2bR9j96{3??Q7~$bfPl6)b0@h(ul_jnTjoX_Ur?* z0C-r&GKl!`q3kx8$AMH4pYqq5|K>CRxFmbH!H?Yf$agEice0p}lN2mkfv{3yy$+$t zISV^FKBt%e?BBc-w%$=gU1$7C%J}-pH2w2ev{Vj?;_s}sT<7pi9C zn*S_3q3b7rb+NuAn^ilQg@SEpLiqradRP89KkCYW@_IJL53~I+cd|XzYovOibZBTQ zR&xfxSjkUh2k~ecOp{>7R4&mQ&1usUe1=}2F_+bPEc1MzTG=BoBDFY~tgH_oE};L3 z{!Y~mw>W!h$0ZQnu7^>ezLJf2DO}xD2}KI2(uz~;6~yx-+xZ$lPdb0(OBEG5eWB#* z$(ystrd;4ZJAL<5ngzp+9?*l&AP^Nv^{-C+=N@^{yTUBx$$-!|FC)C)*n#g5e3CrF zR#Y|I{h>J=08eu2DH*A2;^A}iMsX+;xEm{>=#+8@n9GmJRnt?FtjHE_8vosZle-jL z`0_=!lh4dN(~yyBINbZ3tJ{sF?G`(=c2~=WIlXiJ!!klft8GjJ3$&3V=@f78QlUwL zj*#+Q_}l=rUS8CcWsc)^Z0fo=iV=I-(0Tif8d;Wtb;M8xx7c6_!>d%;N2gDG%4)$E zhM#sXM{Vq)&i1vl9-12vQ+8=*juN?zH0w6IS1(kAWn3Qq^lgJ&D+4dpSCek>ezhY9 zW*pHBk)Z^5a7OfqFqNb28{K(Ufc@B@dyBlTNA*+mg#Pou8i*kK(R9Xbqx z(xy}Plkw-oP#35Kn814}d-KR=@9JCIDxEL6X z{M4z;mo^huG@))v4bh*%bw;=|icu9S5e?)4u~tuLu%64SI%m*asUpalQ7|6IuPW^C z)RQJyY)kScYvAr4)VHW6p_HP=tDQ<*8Z`N7t^)cwW}QB zZ?Owm4Hl*oaXD$&{73do_ko&(Uw#+7$mN zIGnG$PLzhdd`oz8RK9=I&4MmP6-#Jv7uo8#x*=X3)_Ns7+ev=?Ft#)wf-d4VPYooe zIh%l_{h+@~en$YrS=~Ea1sq9F!E=oj^MBKsPW~SgCFf6UN)TK?>>HmjnmdK%D!!~c zK=JMlAecl>7^-KN2x4gX?0?gD%V1yjozvQE-+-TbukVn{q6bZoi5z`f+-m&cst7V? z+`e-QFY{~%)74Cg&IhP`j+Yes1m@;5C}T=?ZO6YZ;?uFLy z{PNmeI|>K8pW584_ZRX>Yg^w+WJ*}lmmoz(NvSqw>7%1rTE~y|R6ZChm#Q{%FZcC5 zPg+;paz2n=;pVOWHsbh3w}ezqX54D{)H|Hv7^QkK(gKk5oc!A7CyU(?;zDR4&!Gqip#X(UqGq1lG+rT7`6b3=miaS7%YZ5k~vIALngWx`u9l zDnoGfPT&U2gWV2I3Ix8{mgAK3Z#cP^!c37^dN|uI6!s8Xb^UvE8pK=KgRL4ADZXT3 z`SUC23R4L3Ia#~|E(vT-*HOIMaNaRq;_WV0R~!=f7I;u#Xq;B+a@bF-QsT!1PWK@c zjolMoBUBHiaB(8n6rw;yp}BJG$b^?*DAKa9ixf%O=}h6$uEN5Q+x|DR(7Tj`P*L|U zBp7rm=D__7-;W|Q+mJiQR~XZdZG75rO!{OspbkA-N$S_na9F@}x}8ePkD`*IneV~r zMcY-RJdy1({vy+s@8}-peKh<=OXS4)GeuHkN((!7@%Kv})=AG)BGIc59JHxMbkms4 zzK*TW#{Cun-ehW}9hhMXVHmt%tde(DBdb}IFGTx>3NY=2Y^9Zl4)_*7x>I%L{<(4v zZtgv}Y1X1e6;Z1-&eaP6vuUR7=tFE)YAGF524+6dR&}>J{Y|w}k^L8(YCDA%DbX8R zd4i}`pS&01B~(!5v$Uz0Ge4_kQMBndh&%fOGC4*q$yo?X#iNbJDIkyrdcu9@x!Tu+ zFQs4UCK!I)O;*M>3_5MXu~WOKOvD^fThC(DJ=`m}a=Vby}Tbia^+Md>hEc(4~M61Hv#*H-GJVrX;TZsUr zD5+C(UxDd`NiIpQ>2LU7tb)MZ+2)vh2)5NX#F zfKaK|@sHtcr*vxOIrX4%B;uCVLmio48}&oinJTTX@Fk19R9uiU$(>$=W{?{3J=XW_ zXmE6F)p)qdlv$=ug(+`nMf28SXli@hNB{+3bcb|8^cSj^(muII%Ge($jeg{?v2wbb z^~<&?IukOr5`Bka!i~|-x1qlh;zsD?m77(b<3nk}&YYi%MXOitnbPn-=q#8Ft__3jgI(oA)iD(aT7nf0c-nz!yEp0UiCP z7UhD#dSb&7By25t{R<4?wUPComCXBgfCI(h(t|y zsVi)YGK6`DQ9mkTWO(V7Tv8R0hh}@<1qq^9m;`=o& zmp9`?U32!M4gx>DWP%T}w$6~aieWh*!A^n@!pUNlA;4YWht)rnrlwC3%nnbe!!D7s z3Jqz#heNwkKW)Pb9)G6i7E!5{h&I(VKV#to6AZ`m;#oz6aO?XuF3s-%I~&n%ibP5Z z%wkaT)=Mx_nvtiw{j5NSOnO6*a}ZYxie+qjOC<0L$ylSHnH~UQjLt59*tgCyh%e!X z`KcP2%(DYsIP@&}Y6r>_He@3BV~=7Nom+jKI6v%3^{RS5@~X7c=Z%V)B;g)UKdVs*t91yaC}mT#5zfZw1mXeON-OJt1fp| zx^LpU9W**a-3Uz2Lj9fV6H3rj)t7#=i{^h^$@*+>EFm$FGY@cC09u3jd>t4V~u@eSdRPByHv9P zC@jir;qaE1k-27km1BMJ<;DJ#<*QitxUsvgeYH9{yGiw$9#3&wQ!;D~%nD^OD`IEj z(PBX)(lL;Ga{{Qr!KZ-n!2r9U((mD$jtV|un70W87c!k~P$J;RR<_oc>YgZ#jhT6r zjDjCd3cP~01L}`M=yzTA4K#VeKv++7VJPX26kaa-OEtB>I9|t+<1;3FG6pw8vN951 zL>+`6`NfR?9M8{DbNwoB(x*T_HdR$%c_ak2G`Vq`8l#43l3sdGMvcm`i1|Z2_O(XVOh{HdR^WItrWcJ}$}-2mftqmo_vV!(Do3ZB^@?uXXS&b%PhC3mQy&PsUOP2T5dd zWE&QZm5(;9a-GA9k|@(eA=UUXdS5a1^+9n8USes+LZxZo6xaFj=%cN~8%Rp({9U|y zFPzn1(KwBe`exN4d|-5=7B@p&9$jX+J!}%ajxmy#((@jwvb*VuwuBT*ZgbE2D zJ8*Y2#2q1XR>i!Ymj32~(DF(09Fb04aJ}yk8}Y*%aO$+A{2+QJjE@vurVrg1AKs`g#}xCfXHh9PcujMl z$Ctds>7dH03=at!B*Zq6IHfmuQutnZn`lj~4o3?g#*oor4fo-Dz9I7m7D}(rv)mXV zwb3gFZxF6^B^s7OC|$Syx161(ph?(HS(+;?ZuIl37c&`E z13Sk?HxZcApDBi_m(U!j)VFR-EY5$5eICRG`Q}mggpL|YeT?HY+J2eOr`Kc&JY*zV zPAis84e&hjrQdNqUQWlg*(SP1GcJtzi>PQiZd-oSLYnaqHIY_fxW@!ucl$y zQa-h3SPgJeOC=w1>Ai2gL^vx2>T}ycy4)q zYX$~x9t6^`AfL6x)~1`8+@&EYH`6r!olGJaB|h5Rf(F?$n&9yChWlzz8gsHE(Fuk0 zKL$rf9!x6XSHrGNDk3qG)7(-s1cYsN% zTGXE8ub+muhA`CnCGs!1*iU+J){@|EvxgnY=t!)j>Q=Z;>IJxhGRm8+q#%-n8qz;u zfP6|2!9q}+P!mNxSzy8FU04w)@N9wZ<4jtWm5V5BSR~b#guSec;XoQTbBFVdCS812 z)%2~hq4!K1vhYEG{b@J|E#tjf4@mWK%Ext}E@#$ii%{1ITw!8?{0Ne32Vx_vFM<@< zPBZO$+kdauK`=2!gV1>ECDBU~nXa-#8(A?wM%Z+Rz2P+{%D!@1rlRVss#6fZOD$fl zbzg}K=eToeMETm$1pC)J5A-v?@S-nrAH`?Lqz8Mwc%Gba-f~MX_tSBJl`It6F3tIv z2i@+Ig_kO7i1g2xtC_0yE;mt0G+q5i?B75h)n)-VC>@vIu!25IJ?4vWX1u|`5F*AQ z2CJMiiroUM_Y144tKaBt&8mKvy|qdfR0`fC7Ahz1*pr^{nk$QOAZ|d>_v3?QC$Q{K z9$8n^_U7euD@z=bgA2Y_4ZaKdQy*@r*FdqNs+E>M=!3kz>quZ88l7q?5Q$IyXO|{8 zG;%Ls2(K*BT!;!*Js!cMD8+{Kvm&ECBghWJRxxeALx*E0GOdmu-CtT*V3#cd| ze0h*~Yj*SGm9l7CxmS;vdTxnMusLcIhCa|)#ByD`XXPrW3d+$pz6&yvzCqajn@gg& z4O22jRkroKNIBYLR+PvZGpmwnrNK&ihmGahTJjUUCeaxGG;&%FELhJ8%@=V24t8OG z3$ViTr{;9?e@x}tf`Jtl2$i2|mvYVM#9#x`AA3Y=3hXdD%V?Lj$K090X+2YhHUp@} z=wQ~6P^~EG*Sr)bUF{$K>D!u{vUFXuS>oH!qdj?-#~clEKA*~Ku*2j#(jf2jRoIv6 zI;z*JxpmL%xv)M9vJNxR6*|?=?}q#Bex%+u@ZS(_er_lrVrK1*YKuas&PywSfIN1W zV^Lr={(ZjpIN7g=i~B)cl=LvWf3eXT*3|*_od)&yl?b|G9yZ#d6k519QlV)}&{)=j zun(n7R|5uI4UH`2UDioaCFQn@f6-(9?r(lF>h)QnN2SB>T7ZbtBmUu%md2&if5a#K zARp?j-SAdyljz3uh;I1mz_SCx)v(pV5Xr69X|&Ju9(x(Wt@RL~(!wAkbAXLh@Rn3` zNj*64d`9AFTh!>SgU+0vbPE|biD-yza@l-*l=ab|F!#W=a@BFit;N;&UUv^i-~@+m z4Jd3B-SAo)ENZKaKlOOXZ-;2TPlX|X5U7IO>o|%^A^S`^GsBZSaU*5=G&o<@PblUh ziY=8J{vFIhAQ-bXV1bV-275io$$ChTssR|Y#M@IXOOMZAozbB#C`XHYHwjlv2q926 zxb~_erIB`t&uPAGz_i!}E`(h^dNOrF=D0&4JUcLA^kg@1ToxYV5M6D^6<81Sx%77Z z9K-2?!@dGnRJUl>X)N%NTp~60QbUycqt0`36mwH_VZafU`%>|)YArf z=tn|fk*_1={+QB#g+|*4Qy5g3?b8+WP&bFvB2rTsv5CL(t?C2Orb(Fe#QLy~`h-o+ zuE@aLu4u1)xJ=}|xIxCfnUxgB3Qdmylz z#wB1xptM1ImNd#Zm;1Lp)S;x*0mQbM$=u1)+{lu~kZ26GgV3nVAK@gP7G5NyFaH6; zGCV38$F5z52wEMX->6Bm8mLVZjPO2?Lk)Ge9WCQU^(|N|x;rpF|FQ{5%ykZ@gjL1j zr}1aTK`TdRxl&xlC9ytPS2GcMjKM&C<(V{4KO~R3Vwj#JHpIfGNb_1M^a-;3^3YQu zs~F$i8o0%OMiIW_L0M7ipX=4yMK^VtH_sRhf~pIWL2byIr{FIgwB@Vd660{|h33h( zwnd>!0Ff4<48E+#Uz)!r3O4<+)B?gg(jL{}R%Mhc=yRN*vYat@lNA{_FHM$AJzd#q zJ{L#iRbQ2^S>n+mSWqLEbuKTw|rT$RJtpPW%;D5z`;W>dx ze^^Dy4N%NJAfGRt*r+M|`#Fe>FxK6WHT8{oQqCUSr?flHO@=%Chn4B@%e%rd+Bn|> zyIKosG+z)AlK=P>e=m3)yZ{resis$4-C%=tL4uuf3{IGfY2Ddpw1*x)*DxrTV=+~& zWbfQ;y1}XgE<#umG606}usf>ea&U^D0>o=9T&0kE?H!oN^+=}u%$5E`=R{~dK+Btv z!5`o4r6HCy%@+1xEY+z)xEE8`z;J>QZh~@5#KRKA^5{>}(ENmLRnHvItuUd5#|kJpK2=A(C1)Q*su z@esYr376-GHey&bMuEVgjBc?}Dab|H!6Eg##}3~d@y_3qtn)aK4tw;Dn-1no*S0kd z2j;K)6zA*uoFzPr6@^JE9+y9)T)_0I9`FX>?L9HIKl4KQsA5!qwHKLwWl+9H!T#){ zUV&PJE)4Hv3}vo&eRi1tsQ;&OV-i>qBG&MKKMxcS%0+lGplTr%5t%9rx6{bdEt zkwzPA6mi|gb?xEl-4!pFFL_+?byi&Nxg#H*7oPEa$GBAQjw;(D`9m$oWlUq^HRqJy zuDTz@t?BvQsClNtOv{>U$ydH!I{a4Wdu`9ocJ6E5Z?wsQTo6rFlz!|KSnbCmh~*3Uc+Bp1@6Sn=Lk6 zf2U&L^`gSp$k9?$f=i4Wc>IA@MB@I&1Tbv)_Si!;qEpgALDb_Nv(S zsM6B~R~l`BhYqOy7iOpWf5cM_d}_FXEIG?FK4k^4m2b#^L#nZ+E_n0qeR=n-)(unf2XFY+v));#6@h zg?qfuS1oE?vYOjzSGbMOB)KJ~7Z#R(jstd=vSnN|w-zSw{}9NJ^obTbWu*V;?FKC- zmP-@Sfl*2O$qh~AHJ|6L$vONXaVl`zk+JQ?WRI{8 z5zF~o9|!MY-8ZMq>!$vlg&#b3XS1HRZR2O!xZ)l6PodUdzY~>~RJS&-`R{VoR^vx| zVU51~V&TONfSP=TEK$YGCkm^>bP0l+XkKK9omC literal 0 HcmV?d00001 diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..09c4410da 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -18,6 +18,7 @@ import zkGoerliNode from "./zkgoerli"; import vicNode from "./vic"; import zkSyncNode from "./zksync"; import arbNode from "./arb"; +import arbNovaNode from "./arb-nova"; import * as skale from "./skale"; import ontEVMNode from "./ontevm"; import gnoNode from "./gno"; @@ -77,6 +78,7 @@ export default { skaleChaos: skale.chaosNode, ontEVM: ontEVMNode, arbitrum: arbNode, + arbitrumNova: arbNovaNode, gnosis: gnoNode, avax: avaxNode, fantom: ftmNode, diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..36888a5bc 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -43,6 +43,7 @@ export enum NetworkNames { SkaleChaos = "skaleCHAOS", OntologyEVM = "ontologyEVM", Arbitrum = "ARB", + ArbitrumNova = "ARBNova", Gnosis = "GNO", Avalanche = "AVAX", Fantom = "FTM", @@ -105,6 +106,7 @@ export enum CoingeckoPlatform { SKALE = "skale", OntologyEVM = "ontology", Arbitrum = "arbitrum-one", + ArbitrumNova = "arbitrum-nova", Gnosis = "xdai", Avalanche = "avalanche", Fantom = "fantom", From e418920f1f7b292e49ad477faa5620cefcb3c02d Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 8 Aug 2024 16:55:10 -0700 Subject: [PATCH 234/375] feat: nft send --- packages/extension/package.json | 4 + .../src/libs/keyring/public-keyring.ts | 10 - .../libs/nft-handlers/simplehash-solana.ts | 95 +++ .../src/libs/nft-handlers/types/simplehash.ts | 13 + .../src/providers/solana/libs/api.ts | 17 +- .../src/providers/solana/networks/solana.ts | 2 + .../src/providers/solana/types/sol-network.ts | 2 +- .../solana/ui/send-transaction/index.vue | 102 ++- .../verify-transaction/index.vue | 67 +- .../src/providers/solana/ui/types.ts | 2 +- packages/extension/src/types/activity.ts | 7 +- packages/extension/src/types/nft.ts | 2 + .../action/views/assets-select-list/index.vue | 1 - .../action/views/network-activity/index.vue | 14 +- yarn.lock | 702 +++++++++++++++++- 15 files changed, 952 insertions(+), 88 deletions(-) create mode 100644 packages/extension/src/libs/nft-handlers/simplehash-solana.ts diff --git a/packages/extension/package.json b/packages/extension/package.json index 506c44793..a123abd39 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -37,7 +37,11 @@ "@kadena/client": "^1.13.0", "@ledgerhq/hw-transport-webusb": "^6.29.2", "@metamask/eth-sig-util": "^7.0.3", + "@metaplex-foundation/mpl-bubblegum": "^4.2.0", + "@metaplex-foundation/umi": "^0.9.2", + "@metaplex-foundation/umi-bundle-defaults": "^0.9.2", "@rollup/plugin-replace": "^5.0.7", + "@solana-developers/helpers": "^2.4.0", "@solana/spl-token": "^0.4.8", "@solana/web3.js": "^1.95.2", "@types/chrome": "^0.0.269", diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index a815015e8..c9a2048e8 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -77,16 +77,6 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; - allKeys["7VHUFJHWu2CuExkJcJrzhQPJ2oygupTWkL2A2For4BmE"] = { - address: "7VHUFJHWu2CuExkJcJrzhQPJ2oygupTWkL2A2For4BmE", - basePath: "m/501'/2'/0'/1", - name: "fake sol account #1", - pathIndex: 0, - publicKey: "0x0", - signerType: SignerType.ed25519sol, - walletType: WalletType.mnemonic, - isHardware: false, - }; } return allKeys; } diff --git a/packages/extension/src/libs/nft-handlers/simplehash-solana.ts b/packages/extension/src/libs/nft-handlers/simplehash-solana.ts new file mode 100644 index 000000000..9cfd617ef --- /dev/null +++ b/packages/extension/src/libs/nft-handlers/simplehash-solana.ts @@ -0,0 +1,95 @@ +import { NFTCollection, NFTItem, NFTType } from "@/types/nft"; +import { NodeType } from "@/types/provider"; +import cacheFetch from "../cache-fetch"; +import { NetworkNames } from "@enkryptcom/types"; +import { SHNFTType, SHResponse, SHSolanaNFTType } from "./types/simplehash"; +const SH_ENDPOINT = "https://partners.mewapi.io/nfts/"; +const CACHE_TTL = 60 * 1000; +const SolanaTokenPrograms = { + Bubblegum: "BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY", + Token: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", +}; +export default async ( + network: NodeType, + address: string +): Promise => { + const supportedNetworks = { + [NetworkNames.Solana]: "solana", + }; + if (!Object.keys(supportedNetworks).includes(network.name)) + throw new Error("Simplehash: network not supported"); + let allItems: SHSolanaNFTType[] = []; + const fetchAll = (continuation?: string): Promise => { + const query = continuation + ? continuation + : `${SH_ENDPOINT}owners_v2?chains=${ + supportedNetworks[network.name as keyof typeof supportedNetworks] + }&wallet_addresses=${network.displayAddress( + address + )}&filters=spam_score__lte=50`; + return cacheFetch( + { + url: query, + }, + CACHE_TTL + ).then((json) => { + const items: SHNFTType[] = (json.result as SHResponse).nfts; + allItems = allItems.concat(items as SHSolanaNFTType[]); + if (json.result.next) return fetchAll(json.result.next); + }); + }; + await fetchAll(); + if (!allItems || !allItems.length) return []; + const collections: Record = {}; + allItems.forEach((item) => { + if (!item.image_url && !item.previews.image_medium_url) return; + if ( + item.extra_metadata.token_program !== SolanaTokenPrograms.Bubblegum && + item.extra_metadata.token_program !== SolanaTokenPrograms.Token + ) + return; + if (collections[item.collection.collection_id]) { + const tItem: NFTItem = { + contract: item.contract_address, + id: item.nft_id, + image: item.image_url || item.previews.image_medium_url, + name: item.name, + url: item.collection.marketplace_pages.length + ? item.collection.marketplace_pages[0].nft_url + : `https://magiceden.io/item-details/${item.contract_address}`, + type: + item.extra_metadata.token_program === SolanaTokenPrograms.Bubblegum + ? NFTType.SolanaBGUM + : NFTType.SolanaToken, + }; + collections[item.collection.collection_id].items.push(tItem); + } else { + const ret: NFTCollection = { + name: item.collection.name, + description: item.collection.description, + image: + item.collection.image_url || + require("@action/assets/common/not-found.jpg"), + contract: item.contract_address, + items: [ + { + contract: item.contract_address, + id: item.nft_id, + image: item.image_url || item.previews.image_medium_url, + name: item.name, + url: item.collection.marketplace_pages.length + ? item.collection.marketplace_pages[0].nft_url + : `https://magiceden.io/item-details/${item.contract_address}`, + type: + item.extra_metadata.token_program === + SolanaTokenPrograms.Bubblegum + ? NFTType.SolanaBGUM + : NFTType.SolanaToken, + }, + ], + }; + collections[item.collection.collection_id] = ret; + } + }); + return Object.values(collections); +}; diff --git a/packages/extension/src/libs/nft-handlers/types/simplehash.ts b/packages/extension/src/libs/nft-handlers/types/simplehash.ts index 08efa9ebf..ce6032c58 100644 --- a/packages/extension/src/libs/nft-handlers/types/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/types/simplehash.ts @@ -23,6 +23,12 @@ export interface SHNFTType { external_url: string; collection_id: string; spam_score: number; + marketplace_pages: { + marketplace_id: string; + marketplace_name: string; + collection_url: string; + nft_url: string; + }[]; }; contract: { name: string; @@ -37,6 +43,13 @@ export interface SHOrdinalsNFTType extends SHNFTType { }; }; } + +export interface SHSolanaNFTType extends SHNFTType { + extra_metadata: { + token_program: string; + }; +} + export interface SHResponse { next: string; previous: string; diff --git a/packages/extension/src/providers/solana/libs/api.ts b/packages/extension/src/providers/solana/libs/api.ts index c1a9d6d44..b350069f4 100644 --- a/packages/extension/src/providers/solana/libs/api.ts +++ b/packages/extension/src/providers/solana/libs/api.ts @@ -24,8 +24,21 @@ class API implements ProviderAPIInterface { // eslint-disable-next-line @typescript-eslint/no-empty-function async init(): Promise {} async getTransactionStatus(hash: string): Promise { - console.log(hash, "gettxstatus"); - return null; + return this.web3 + .getTransaction(hash, { + maxSupportedTransactionVersion: 0, + commitment: "confirmed", + }) + .then((tx) => { + if (!tx) return null; + const retVal: SOLRawInfo = { + blockNumber: tx.slot, + timestamp: tx.blockTime, + transactionHash: hash, + status: tx.meta?.err ? false : true, + }; + return retVal; + }); } async getBalance(pubkey: string): Promise { const balance = await this.web3.getBalance( diff --git a/packages/extension/src/providers/solana/networks/solana.ts b/packages/extension/src/providers/solana/networks/solana.ts index 9e9098465..b9b6128b7 100644 --- a/packages/extension/src/providers/solana/networks/solana.ts +++ b/packages/extension/src/providers/solana/networks/solana.ts @@ -2,6 +2,7 @@ import { NetworkNames } from "@enkryptcom/types"; import { SolanaNetwork, SolanaNetworkOptions } from "../types/sol-network"; import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import shNFTHandler from "@/libs/nft-handlers/simplehash-solana"; const solanaOptions: SolanaNetworkOptions = { name: NetworkNames.Solana, @@ -19,6 +20,7 @@ const solanaOptions: SolanaNetworkOptions = { activityHandler: wrapActivityHandler(() => Promise.resolve([])), basePath: "m/44'/501'", assetsInfoHandler, + NFTHandler: shNFTHandler, }; const bitcoin = new SolanaNetwork(solanaOptions); diff --git a/packages/extension/src/providers/solana/types/sol-network.ts b/packages/extension/src/providers/solana/types/sol-network.ts index 722f7573e..46a4784bd 100644 --- a/packages/extension/src/providers/solana/types/sol-network.ts +++ b/packages/extension/src/providers/solana/types/sol-network.ts @@ -49,7 +49,7 @@ export interface SolanaNetworkOptions { } export const getAddress = (pubkey: string) => { - if (pubkey.length === 44) return pubkey; + if (pubkey.length <= 44) return pubkey; return bs58.encode(hexToBuffer(pubkey)); }; diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index d2f626201..0747ff2d8 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -157,11 +157,18 @@ import { GenericNameResolver, CoinType } from "@/libs/name-resolver"; import { trackSendEvents } from "@/libs/metrics"; import { SendEventType } from "@/libs/metrics/types"; import { NATIVE_TOKEN_ADDRESS } from "@/providers/ethereum/libs/common"; +import { createUmi } from "@metaplex-foundation/umi-bundle-defaults"; +import { + getAssetWithProof, + transfer, + mplBubblegum, +} from "@metaplex-foundation/mpl-bubblegum"; import { Transaction as SolTransaction, SystemProgram, PublicKey, ComputeBudgetProgram, + TransactionInstruction, } from "@solana/web3.js"; import { createTransferInstruction, @@ -171,8 +178,10 @@ import { ACCOUNT_SIZE, } from "@solana/spl-token"; import getPriorityFees from "../libs/get-priority-fees"; +import bs58 from "bs58"; import SolanaAPI from "@/providers/solana/libs/api"; +import { getSimulationComputeUnits } from "@solana-developers/helpers"; const props = defineProps({ network: { @@ -210,8 +219,8 @@ const accountAssets = ref([]); const selectedAsset = ref(loadingAsset); const amount = ref(""); const isEstimateValid = ref(true); -const priorityFee = ref(0); const storageFee = ref(0); +const SolTx = ref(); const hasEnoughBalance = computed(() => { if (!isValidDecimals(sendAmount.value, selectedAsset.value.decimals!)) { return false; @@ -241,7 +250,7 @@ const selectedNft = ref({ name: "Loading", url: "", collectionName: "", - type: NFTType.ERC721, + type: NFTType.SolanaToken, }); const nativeBalance = computed(() => { @@ -265,12 +274,14 @@ onMounted(async () => { const TxInfo = computed(() => { const value = sendAmount.value - ? numberToHex(toBase(sendAmount.value, props.network.decimals)) + ? numberToHex(toBase(sendAmount.value, selectedAsset.value.decimals)) : "0x0"; - const contract = selectedAsset.value.contract; + const contract = isSendToken.value + ? selectedAsset.value.contract + : selectedNft.value.contract; return { from: addressFrom.value, - value, + value: isSendToken.value ? value : "0x1", to: addressTo.value, contract, }; @@ -354,7 +365,6 @@ const fetchAssets = () => { return props.network.getAllTokens(addressFrom.value).then((allAssets) => { accountAssets.value = allAssets as SOLToken[]; selectedAsset.value = allAssets[0] as SOLToken; - isLoadingAssets.value = false; }); }; @@ -402,16 +412,30 @@ const updateTransactionFees = async () => { const to = TxInfo.value.to ? new PublicKey(getAddress(TxInfo.value.to)) : from; - let transaction = new SolTransaction().add( - SystemProgram.transfer({ - fromPubkey: from, - toPubkey: to, - lamports: toBN(TxInfo.value.value).toNumber(), + const priorityFee = ( + await getPriorityFees( + new PublicKey(getAddress(TxInfo.value.from)), + solConnection.value!.web3 + ) + ).high; + const transaction = new SolTransaction().add( + ComputeBudgetProgram.setComputeUnitPrice({ + microLamports: priorityFee * 100, }) ); - if (selectedAsset.value.contract !== NATIVE_TOKEN_ADDRESS) { - console.log("herer", 1); - const contract = new PublicKey(selectedAsset.value.contract); + if (isSendToken.value && TxInfo.value.contract === NATIVE_TOKEN_ADDRESS) { + transaction.add( + SystemProgram.transfer({ + fromPubkey: from, + toPubkey: to, + lamports: toBN(TxInfo.value.value).toNumber(), + }) + ); + } else if ( + isSendToken.value || + (!isSendToken.value && selectedNft.value.type === NFTType.SolanaToken) + ) { + const contract = new PublicKey(TxInfo.value.contract); const associatedTokenTo = getAssociatedTokenAddressSync(contract, to); const associatedTokenFrom = getAssociatedTokenAddressSync(contract, from); const validATA = await getAccount( @@ -421,8 +445,7 @@ const updateTransactionFees = async () => { .then(() => true) .catch(() => false); if (validATA) { - console.log("herer", 2); - transaction = new SolTransaction().add( + transaction.add( createTransferInstruction( associatedTokenFrom, associatedTokenTo, @@ -431,8 +454,7 @@ const updateTransactionFees = async () => { ) ); } else { - console.log("herer", 3); - transaction = new SolTransaction().add( + transaction.add( createAssociatedTokenAccountInstruction( from, associatedTokenTo, @@ -453,25 +475,36 @@ const updateTransactionFees = async () => { ACCOUNT_SIZE ); } + } else if ( + !isSendToken.value && + selectedNft.value.type === NFTType.SolanaBGUM + ) { + const umi = createUmi(solConnection.value!.web3).use(mplBubblegum()); + const assetWithProof = await getAssetWithProof( + umi, + new PublicKey(selectedNft.value.contract) as any + ); + const txData = transfer(umi, { + ...assetWithProof, + leafOwner: from as any, + newLeafOwner: to as any, + }); + txData.getInstructions().forEach((i) => { + i.keys = i.keys.map((k) => { + k.pubkey = new PublicKey(k.pubkey) as any; + return k; + }); + i.programId = new PublicKey(i.programId) as any; + transaction.add(i as any); + }); } transaction.feePayer = from; - if (isMaxSelected.value) { amount.value = ""; } - priorityFee.value = ( - await getPriorityFees( - new PublicKey(getAddress(TxInfo.value.from)), - solConnection.value!.web3 - ) - ).high; - solConnection.value!.web3.getLatestBlockhash().then((bhash) => { - transaction.add( - ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: priorityFee.value, - }) - ); + solConnection.value!.web3.getLatestBlockhash().then(async (bhash) => { transaction.recentBlockhash = bhash.blockhash; + SolTx.value = transaction; setTransactionFees(transaction).then(() => { if (isMaxSelected.value) { amount.value = @@ -618,9 +651,14 @@ const sendAction = async () => { fromAddress: fromAccountInfo.address, fromAddressName: fromAccountInfo.name, gasFee: gasCostValues.value[selectedFee.value], - priorityFee: priorityFee.value, gasPriceType: selectedFee.value, toAddress: addressTo.value, + encodedTx: bs58.encode( + SolTx.value!.serialize({ + requireAllSignatures: false, + verifySignatures: false, + }) + ), }; const routedRoute = router.resolve({ name: RouterNames.verify.name, diff --git a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue index 238dc2525..22824a093 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue @@ -102,20 +102,20 @@ import ActivityState from "@/libs/activity-state"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; import { BaseNetwork } from "@/types/base-network"; -import { toBN } from "web3-utils"; -import { bufferToHex, hexToBuffer, toBase } from "@enkryptcom/utils"; +import { bufferToHex, hexToBuffer } from "@enkryptcom/utils"; import { trackSendEvents } from "@/libs/metrics"; import { SendEventType } from "@/libs/metrics/types"; import { Transaction as SolTransaction, - SystemProgram, - PublicKey, ComputeBudgetProgram, + VersionedTransaction, + TransactionMessage, } from "@solana/web3.js"; -import { getAddress } from "@/providers/solana/types/sol-network"; +import { getSimulationComputeUnits } from "@solana-developers/helpers"; import SolanaAPI from "@/providers/solana/libs/api"; import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; import { InternalMethods } from "@/types/messenger"; +import bs58 from "bs58"; const KeyRing = new PublicKeyRing(); const route = useRoute(); @@ -153,25 +153,33 @@ const sendAction = async () => { trackSendEvents(SendEventType.SendApprove, { network: network.value.name, }); - const from = new PublicKey(getAddress(txData.TransactionData.from)); - const transaction = new SolTransaction().add( - SystemProgram.transfer({ - fromPubkey: from, - toPubkey: new PublicKey(getAddress(txData.TransactionData.to)), - lamports: toBN(txData.TransactionData.value).toNumber(), - }) + const transactiontemp = SolTransaction.from(bs58.decode(txData.encodedTx)); + const solAPI = (await network.value.api()).api as SolanaAPI; + const computeUnits = await getSimulationComputeUnits( + solAPI.web3, + transactiontemp.instructions, + transactiontemp.feePayer!, + [] ); - transaction.add( - ComputeBudgetProgram.setComputeUnitPrice({ - microLamports: txData.priorityFee, - }) + if (computeUnits) { + transactiontemp.instructions.unshift( + ComputeBudgetProgram.setComputeUnitLimit({ units: computeUnits + 5000 }) // adding few extra CUs as a buffer + ); + } + const latestBlock = await solAPI.web3.getLatestBlockhash(); + transactiontemp.recentBlockhash = latestBlock.blockhash; + const transaction = new VersionedTransaction( + new TransactionMessage({ + instructions: transactiontemp.instructions, + recentBlockhash: latestBlock.blockhash, + payerKey: transactiontemp.feePayer!, + }).compileToV0Message([]) ); - transaction.feePayer = from; - const txActivity: Activity = { - from: txData.fromAddress, + from: network.value.displayAddress(txData.fromAddress), to: txData.toAddress, - isIncoming: txData.fromAddress === txData.toAddress, + isIncoming: + network.value.displayAddress(txData.fromAddress) === txData.toAddress, network: network.value.name, status: ActivityStatus.pending, timestamp: new Date().getTime(), @@ -189,18 +197,15 @@ const sendAction = async () => { transactionHash: "", }; const activityState = new ActivityState(); - const solAPI = (await network.value.api()).api as SolanaAPI; - transaction.recentBlockhash = ( - await solAPI.web3.getLatestBlockhash() - ).blockhash; - const msgToSign = transaction.serializeMessage(); + //transaction.message.serialize() + const msgToSign = transaction.message.serialize(); sendUsingInternalMessengers({ method: InternalMethods.sign, params: [bufferToHex(msgToSign), account.value!], }).then((res) => { if (res.error) return res; transaction.addSignature( - transaction.feePayer!, + transactiontemp.feePayer!, hexToBuffer(JSON.parse(res.result!)) ); const onHash = (hash: string) => { @@ -216,7 +221,10 @@ const sendAction = async () => { }, }, ], - { address: txData.fromAddress, network: network.value.name } + { + address: network.value.displayAddress(txData.fromAddress), + network: network.value.name, + } ); isSendDone.value = true; if (getCurrentContext() === "popup") { @@ -232,15 +240,14 @@ const sendAction = async () => { } }; solAPI.web3 - .sendRawTransaction(transaction.serialize()) + .sendRawTransaction(Buffer.from(transaction.serialize())) .then((hash) => { onHash(hash); - console.log(`https://solscan.io/tx/${hash}`); }) .catch((e) => { txActivity.status = ActivityStatus.failed; activityState.addActivities([txActivity], { - address: txData.fromAddress, + address: network.value.displayAddress(txData.fromAddress), network: network.value.name, }); isProcessing.value = false; diff --git a/packages/extension/src/providers/solana/ui/types.ts b/packages/extension/src/providers/solana/ui/types.ts index e0453d229..1085e6da4 100644 --- a/packages/extension/src/providers/solana/ui/types.ts +++ b/packages/extension/src/providers/solana/ui/types.ts @@ -18,6 +18,6 @@ export interface VerifyTransactionParams { toAddress: string; toToken: ToTokenData; gasFee: GasFeeInfo; - priorityFee: number; gasPriceType: GasPriceTypes; + encodedTx: string; } diff --git a/packages/extension/src/types/activity.ts b/packages/extension/src/types/activity.ts index cb0a716f0..295e67192 100644 --- a/packages/extension/src/types/activity.ts +++ b/packages/extension/src/types/activity.ts @@ -19,8 +19,8 @@ interface BTCOuts extends BTCIns { interface SOLRawInfo { blockNumber: number; transactionHash: string; - timestamp: number | undefined; - fee: number; + timestamp: number | null | undefined; + status: boolean; } interface BTCRawInfo { @@ -126,7 +126,8 @@ interface Activity { | SubscanExtrinsicInfo | BTCRawInfo | SwapRawInfo - | KadenaRawInfo; + | KadenaRawInfo + | SOLRawInfo; } export { diff --git a/packages/extension/src/types/nft.ts b/packages/extension/src/types/nft.ts index a7600f8ca..bd16b62d1 100644 --- a/packages/extension/src/types/nft.ts +++ b/packages/extension/src/types/nft.ts @@ -2,6 +2,8 @@ export enum NFTType { ERC721 = "ERC721", ERC1155 = "ERC1155", Ordinals = "ORDINALS", + SolanaBGUM = "SOLANABGUM", + SolanaToken = "SOLANATOKEN", } export interface NFTItem { diff --git a/packages/extension/src/ui/action/views/assets-select-list/index.vue b/packages/extension/src/ui/action/views/assets-select-list/index.vue index f7bc831d3..63206b02f 100644 --- a/packages/extension/src/ui/action/views/assets-select-list/index.vue +++ b/packages/extension/src/ui/action/views/assets-select-list/index.vue @@ -90,7 +90,6 @@ const yEnd = throttle((event) => { const searchQuery = ref(); const listedAssets = computed(() => { - console.log(props.assets); if (searchQuery.value) { return props.assets .filter((token) => { diff --git a/packages/extension/src/ui/action/views/network-activity/index.vue b/packages/extension/src/ui/action/views/network-activity/index.vue index b2198966c..7193d8f86 100644 --- a/packages/extension/src/ui/action/views/network-activity/index.vue +++ b/packages/extension/src/ui/action/views/network-activity/index.vue @@ -67,6 +67,7 @@ import { SubscanExtrinsicInfo, SwapRawInfo, KadenaRawInfo, + SOLRawInfo, } from "@/types/activity"; import NetworkActivityLoading from "./components/network-activity-loading.vue"; import { ProviderName } from "@/types/provider"; @@ -179,13 +180,24 @@ const getInfo = (activity: Activity, info: any, timer: any) => { .then(() => updateVisibleActivity(activity)); } else if (props.network.provider === ProviderName.kadena) { const kadenaInfo = info as KadenaRawInfo; - activity.status = kadenaInfo.result.status == "success" ? ActivityStatus.success : ActivityStatus.failed; activity.rawInfo = kadenaInfo as KadenaRawInfo; + activityState + .updateActivity(activity, { + address: activityAddress.value, + network: props.network.name, + }) + .then(() => updateVisibleActivity(activity)); + } else if (props.network.provider === ProviderName.solana) { + const solInfo = info as SOLRawInfo; + activity.status = info.status + ? ActivityStatus.success + : ActivityStatus.failed; + activity.rawInfo = solInfo; activityState .updateActivity(activity, { address: activityAddress.value, diff --git a/yarn.lock b/yarn.lock index debac56a3..cd7126f0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2778,6 +2778,9 @@ __metadata: "@kadena/pactjs-cli": ^1.13.0 "@ledgerhq/hw-transport-webusb": ^6.29.2 "@metamask/eth-sig-util": ^7.0.3 + "@metaplex-foundation/mpl-bubblegum": ^4.2.0 + "@metaplex-foundation/umi": ^0.9.2 + "@metaplex-foundation/umi-bundle-defaults": ^0.9.2 "@polkadot/api": ^12.2.3 "@polkadot/extension-inject": ^0.50.1 "@polkadot/keyring": ^13.0.2 @@ -2792,6 +2795,7 @@ __metadata: "@rollup/plugin-node-resolve": ^15.2.3 "@rollup/plugin-replace": ^5.0.7 "@rollup/plugin-typescript": ^11.1.6 + "@solana-developers/helpers": ^2.4.0 "@solana/spl-token": ^0.4.8 "@solana/web3.js": ^1.95.2 "@types/bs58": ^4.0.4 @@ -5971,6 +5975,232 @@ __metadata: languageName: node linkType: hard +"@metaplex-foundation/digital-asset-standard-api@npm:^1.0.4": + version: 1.0.4 + resolution: "@metaplex-foundation/digital-asset-standard-api@npm:1.0.4" + dependencies: + package.json: ^2.0.1 + peerDependencies: + "@metaplex-foundation/umi": ">= 0.8.2 < 1" + checksum: 075d3d6fa16d923dc74490a3deab9a2d17979f135550201ff9a4e0202de3734bbb3027475fc25c1952773f3258883e4f044e79273ca2afcc178fd0ef71e45a49 + languageName: node + linkType: hard + +"@metaplex-foundation/mpl-bubblegum@npm:^4.2.0": + version: 4.2.0 + resolution: "@metaplex-foundation/mpl-bubblegum@npm:4.2.0" + dependencies: + "@metaplex-foundation/digital-asset-standard-api": ^1.0.4 + "@metaplex-foundation/mpl-token-metadata": 3.0.0-alpha.27 + "@metaplex-foundation/mpl-toolbox": ^0.9.0 + "@noble/hashes": ^1.3.1 + merkletreejs: ^0.3.9 + peerDependencies: + "@metaplex-foundation/umi": ">= 0.8.9 < 1" + checksum: 66e9a6d5bd6a672fa359596ca32945de010eb51a9eb9106945b1538d88ac05993667642103684e9d660fc375d2b51b5b3ac6a02835058bb421a963b7e58a02a3 + languageName: node + linkType: hard + +"@metaplex-foundation/mpl-token-metadata@npm:3.0.0-alpha.27": + version: 3.0.0-alpha.27 + resolution: "@metaplex-foundation/mpl-token-metadata@npm:3.0.0-alpha.27" + dependencies: + "@metaplex-foundation/mpl-toolbox": ^0.9.0 + peerDependencies: + "@metaplex-foundation/umi": ^0.8.2 + checksum: ec79071615b418a4efcfac50616dc6a873f6a827589a5c83990e68e8aa3617813893f8574268cdd53d0cb0330997a979913494ee2e1a722b7716f5536dd579a4 + languageName: node + linkType: hard + +"@metaplex-foundation/mpl-toolbox@npm:^0.9.0": + version: 0.9.4 + resolution: "@metaplex-foundation/mpl-toolbox@npm:0.9.4" + peerDependencies: + "@metaplex-foundation/umi": ">= 0.8.2 < 1" + checksum: 712d1c2e243582cfe5a0589500d861ae65092ea740fa1f392dee88fca41153421a76c73943afa63a45b055d78065db95114c16fcb04668c6ef514f8784d18bb4 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-bundle-defaults@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-bundle-defaults@npm:0.9.2" + dependencies: + "@metaplex-foundation/umi-downloader-http": ^0.9.2 + "@metaplex-foundation/umi-eddsa-web3js": ^0.9.2 + "@metaplex-foundation/umi-http-fetch": ^0.9.2 + "@metaplex-foundation/umi-program-repository": ^0.9.2 + "@metaplex-foundation/umi-rpc-chunk-get-accounts": ^0.9.2 + "@metaplex-foundation/umi-rpc-web3js": ^0.9.2 + "@metaplex-foundation/umi-serializer-data-view": ^0.9.2 + "@metaplex-foundation/umi-transaction-factory-web3js": ^0.9.2 + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + "@solana/web3.js": ^1.72.0 + checksum: bda48dd681ba70716292f36dbb230f754e83127336f62300164a9453cba238fcf4a06eb80da0b33a25ee052f7cab78956f3311b67d9e65a9b35f233ab572c35f + languageName: node + linkType: hard + +"@metaplex-foundation/umi-downloader-http@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-downloader-http@npm:0.9.2" + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + checksum: b0a95d51d22231356a616050405101523016849adedbbc7951cb5f14b2d9edb6ff991fc8c7578eae0897b6cb0efd44287ce74396cbade5bf7275c9cef16c3d4c + languageName: node + linkType: hard + +"@metaplex-foundation/umi-eddsa-web3js@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-eddsa-web3js@npm:0.9.2" + dependencies: + "@metaplex-foundation/umi-web3js-adapters": ^0.9.2 + "@noble/curves": ^1.0.0 + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + "@solana/web3.js": ^1.72.0 + checksum: feb807bc03c4c5db0122c5b8c7864710227c570bb7447f7bc15fd4aa65db0dc4aa0f865b90c231c424357fe716722ab47b17509a11b4be6564b48a6f50c51d7e + languageName: node + linkType: hard + +"@metaplex-foundation/umi-http-fetch@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-http-fetch@npm:0.9.2" + dependencies: + node-fetch: ^2.6.7 + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + checksum: b9ca0f1717f3c179188ce207f273b904719c174cd9c32bb602631c637aa1a11ef8feed940f44ab1b9149ecf35dcf3d77d8997ac136c2a7d19463ce3526d09d65 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-options@npm:^0.8.9": + version: 0.8.9 + resolution: "@metaplex-foundation/umi-options@npm:0.8.9" + checksum: 09ea3d2a9ab73a32248f1e7a6701a6f9c4756752239075ee626b2b1477ce83e3ba4af6e20f1bb1d30dd8510bf48bc4be178cf928bfeaeb0ad587b8ca5d48dab5 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-program-repository@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-program-repository@npm:0.9.2" + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + checksum: 99305260b8c3c5b3095c3c5a46169115f4d456dfaafc3db25e46a6bd41ad049f95e7a9b1f3299e257f00d2b64643ae1b9e1ac6097395b48c2fd6c6f71578d569 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-public-keys@npm:^0.8.9": + version: 0.8.9 + resolution: "@metaplex-foundation/umi-public-keys@npm:0.8.9" + dependencies: + "@metaplex-foundation/umi-serializers-encodings": ^0.8.9 + checksum: f5d1bf557ab9a7b8f47426d9d5186064780b906fdf2a540ec69f4c2ddfe514f2fb8aa7b708ac9a33d7c7e6155f83893a1650ca86ccb7549c754325b6228b2ecb + languageName: node + linkType: hard + +"@metaplex-foundation/umi-rpc-chunk-get-accounts@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-rpc-chunk-get-accounts@npm:0.9.2" + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + checksum: f8beab80aff209f04ef739e2ef583b6f91a8a06ac26720724012b32c23e151c81451784cdabf6d9d96bd334dabd3078e5959314845856a7be15c81cc492ff217 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-rpc-web3js@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-rpc-web3js@npm:0.9.2" + dependencies: + "@metaplex-foundation/umi-web3js-adapters": ^0.9.2 + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + "@solana/web3.js": ^1.72.0 + checksum: bd69fc64598dd4782e5614accfda0f012c8a25b102310df8eb0e2a170f8c67de99055ccd0b76c745ab18c952c7a3d634df5d089d091d06a79c1ce6bd133d4e4d + languageName: node + linkType: hard + +"@metaplex-foundation/umi-serializer-data-view@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-serializer-data-view@npm:0.9.2" + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + checksum: 305eb67360b990a4ec80ca8a219b2c0aba89a58d3a83f3f15e641a8b11740f57abbe65954a92881fdd41dfe6934fb4883c95b0069ab0937198d94dff593e8d65 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-serializers-core@npm:^0.8.9": + version: 0.8.9 + resolution: "@metaplex-foundation/umi-serializers-core@npm:0.8.9" + checksum: 5305f893f3038e8493d0852864b80469492884e4052f1e03205ab276d9334858f92c9bd68dc4311ae0e62ebdf24862956d97bfc76a5d942a02ee89a21096bcbe + languageName: node + linkType: hard + +"@metaplex-foundation/umi-serializers-encodings@npm:^0.8.9": + version: 0.8.9 + resolution: "@metaplex-foundation/umi-serializers-encodings@npm:0.8.9" + dependencies: + "@metaplex-foundation/umi-serializers-core": ^0.8.9 + checksum: f32d1acfa020da9712fe9cd8c470f013d39546803f1eb0fa4a97305431ce235cf066f686638c3c6f63dcef2824d4f0b936ba203b86e94c914fd738d5b91f042a + languageName: node + linkType: hard + +"@metaplex-foundation/umi-serializers-numbers@npm:^0.8.9": + version: 0.8.9 + resolution: "@metaplex-foundation/umi-serializers-numbers@npm:0.8.9" + dependencies: + "@metaplex-foundation/umi-serializers-core": ^0.8.9 + checksum: 3b8144cbcbc41f0bd69832b8756983fbb05794cad4f1a759b054b332cd5ff13713415a7bc1713f729d7358b978361dfcd6a88c3b6d0036df5a5b772a1f37029d + languageName: node + linkType: hard + +"@metaplex-foundation/umi-serializers@npm:^0.9.0": + version: 0.9.0 + resolution: "@metaplex-foundation/umi-serializers@npm:0.9.0" + dependencies: + "@metaplex-foundation/umi-options": ^0.8.9 + "@metaplex-foundation/umi-public-keys": ^0.8.9 + "@metaplex-foundation/umi-serializers-core": ^0.8.9 + "@metaplex-foundation/umi-serializers-encodings": ^0.8.9 + "@metaplex-foundation/umi-serializers-numbers": ^0.8.9 + checksum: 3b12e1bb706a2ee78b76a030d77f6197f7a705517d249c001ca564091da2dac91073a74e573766bef20e09cad16f2e36b10839341fce2b7f4a697c67a4e05c93 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-transaction-factory-web3js@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-transaction-factory-web3js@npm:0.9.2" + dependencies: + "@metaplex-foundation/umi-web3js-adapters": ^0.9.2 + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + "@solana/web3.js": ^1.72.0 + checksum: 5d8b6bd17e8eaa7b4db439062583d0e77a5e01e0e521634d89af08ae28abb3d737e20ab0ef4a05d73638dbccd468b4c8c62b2d56ea3a07e6f92177500fad8117 + languageName: node + linkType: hard + +"@metaplex-foundation/umi-web3js-adapters@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi-web3js-adapters@npm:0.9.2" + dependencies: + buffer: ^6.0.3 + peerDependencies: + "@metaplex-foundation/umi": ^0.9.2 + "@solana/web3.js": ^1.72.0 + checksum: 0fc9cdb24059d47e4eae13e4b0e2caac39f188bb5df8cde8ff34cd482e3b3d2b20319d7bcb5b043be171ca3ad63d0e6e5d668fc8392a7128f42b014971d63eb1 + languageName: node + linkType: hard + +"@metaplex-foundation/umi@npm:^0.9.2": + version: 0.9.2 + resolution: "@metaplex-foundation/umi@npm:0.9.2" + dependencies: + "@metaplex-foundation/umi-options": ^0.8.9 + "@metaplex-foundation/umi-public-keys": ^0.8.9 + "@metaplex-foundation/umi-serializers": ^0.9.0 + checksum: 1178cfef1a5ccf9364c32043dae873103b59f2ca2e36f02cee132007f1224ad7e5ea29f28624852392d73993532c3f3f3e7deab7716835cdc1eea2d3f96970bb + languageName: node + linkType: hard + "@mobily/ts-belt@npm:^3.13.1": version: 3.13.1 resolution: "@mobily/ts-belt@npm:3.13.1" @@ -7572,6 +7802,18 @@ __metadata: languageName: node linkType: hard +"@solana-developers/helpers@npm:^2.4.0": + version: 2.4.0 + resolution: "@solana-developers/helpers@npm:2.4.0" + dependencies: + "@solana/spl-token": ^0.4.8 + "@solana/web3.js": ^1.95.2 + bs58: ^6.0.0 + dotenv: ^16.4.5 + checksum: 847e1676ebab87b5f7420a9440b0a45d5ba36ac2813e0b0052e937de2b2c52e735e6f664b84364468f6908f573891c30dd70c86311b3f21bedd17c170a2db82e + languageName: node + linkType: hard + "@solana/buffer-layout-utils@npm:^0.2.0": version: 0.2.0 resolution: "@solana/buffer-layout-utils@npm:0.2.0" @@ -11052,6 +11294,15 @@ __metadata: languageName: node linkType: hard +"abs@npm:^1.2.1": + version: 1.3.14 + resolution: "abs@npm:1.3.14" + dependencies: + ul: ^5.0.0 + checksum: af5fc49949f0694f458b7849e8ab9f10d2f6a2e1a93b3ac5cb25d62ad331d9f4d37a72fcbc1a84591fdf90fa3fffba8bf6de60dd483dd1af2200166f3436b3d3 + languageName: node + linkType: hard + "accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -12651,6 +12902,13 @@ __metadata: languageName: node linkType: hard +"buffer-reverse@npm:^1.0.1": + version: 1.0.1 + resolution: "buffer-reverse@npm:1.0.1" + checksum: e350872a89b17af0a7e1bd7a73239a535164f3f010b0800add44f2e52bd0511548dc5b96c20309effba969868c385023d2d02a0add6155f6a76da7b3073b77bd + languageName: node + linkType: hard + "buffer-to-arraybuffer@npm:^0.0.5": version: 0.0.5 resolution: "buffer-to-arraybuffer@npm:0.0.5" @@ -13005,6 +13263,13 @@ __metadata: languageName: node linkType: hard +"capture-stack-trace@npm:^1.0.0": + version: 1.0.2 + resolution: "capture-stack-trace@npm:1.0.2" + checksum: 13295e8176e8de74bcbe0e4fd938bed9eb4204b4cc200210ff46df91cb20b69e86f6ef42f408a59454f8b62e567ef0ee6ee5b5e7e16e686668bc77f2741542b4 + languageName: node + linkType: hard + "case-sensitive-paths-webpack-plugin@npm:^2.3.0": version: 2.4.0 resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" @@ -14089,6 +14354,15 @@ __metadata: languageName: node linkType: hard +"create-error-class@npm:^3.0.1": + version: 3.0.2 + resolution: "create-error-class@npm:3.0.2" + dependencies: + capture-stack-trace: ^1.0.0 + checksum: 7254a6f96002d3226d3c1fec952473398761eb4fb12624c5dce6ed0017cdfad6de39b29aa7139680d7dcf416c25f2f308efda6eb6d9b7123f829b19ef8271511 + languageName: node + linkType: hard + "create-hash@npm:1.2.0, create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": version: 1.2.0 resolution: "create-hash@npm:1.2.0" @@ -14238,7 +14512,7 @@ __metadata: languageName: node linkType: hard -"crypto-js@npm:4.2.0, crypto-js@npm:^4.0.0, crypto-js@npm:^4.1.1": +"crypto-js@npm:4.2.0, crypto-js@npm:^4.0.0, crypto-js@npm:^4.1.1, crypto-js@npm:^4.2.0": version: 4.2.0 resolution: "crypto-js@npm:4.2.0" checksum: f051666dbc077c8324777f44fbd3aaea2986f198fe85092535130d17026c7c2ccf2d23ee5b29b36f7a4a07312db2fae23c9094b644cc35f7858b1b4fcaf27774 @@ -14616,6 +14890,13 @@ __metadata: languageName: node linkType: hard +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + languageName: node + linkType: hard + "deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" @@ -14669,6 +14950,15 @@ __metadata: languageName: node linkType: hard +"deffy@npm:^2.2.1, deffy@npm:^2.2.2": + version: 2.2.4 + resolution: "deffy@npm:2.2.4" + dependencies: + typpy: ^2.0.0 + checksum: a06f44306c676d5fb663120610060a3abc48c745200f306a11acc2936095f901b170018fa5ffedbc1ebddf43b83467dc11b90b9ec5fdd232f970d85d66515543 + languageName: node + linkType: hard + "define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": version: 1.1.1 resolution: "define-data-property@npm:1.1.1" @@ -15089,7 +15379,7 @@ __metadata: languageName: node linkType: hard -"duplexer2@npm:^0.1.2, duplexer2@npm:~0.1.0, duplexer2@npm:~0.1.2": +"duplexer2@npm:^0.1.2, duplexer2@npm:^0.1.4, duplexer2@npm:~0.1.0, duplexer2@npm:~0.1.2": version: 0.1.4 resolution: "duplexer2@npm:0.1.4" dependencies: @@ -15309,6 +15599,15 @@ __metadata: languageName: node linkType: hard +"err@npm:^1.1.1": + version: 1.1.1 + resolution: "err@npm:1.1.1" + dependencies: + typpy: ^2.2.0 + checksum: e9b8b5226724e32c7fdf2a14c1380093e130e1bfa4e15f6886ffd7239f0a51b8733da7b8790f01a6681f641a97838d0537e18d553528ab52245a05e6dcf75fe7 + languageName: node + linkType: hard + "errno@npm:^0.1.1": version: 0.1.8 resolution: "errno@npm:0.1.8" @@ -16395,6 +16694,16 @@ __metadata: languageName: node linkType: hard +"exec-limiter@npm:^3.0.0": + version: 3.2.13 + resolution: "exec-limiter@npm:3.2.13" + dependencies: + limit-it: ^3.0.0 + typpy: ^2.1.0 + checksum: 61c4d7e222bf5d062e9bf9a067cc9346c6d16cce935e5e4ddaa0c2fbcbda9b214545f04aeabc3bb902a17b0b340b6710f4e7ead4999ed255764c028074a1b3c7 + languageName: node + linkType: hard + "execa@npm:^0.8.0": version: 0.8.0 resolution: "execa@npm:0.8.0" @@ -17106,6 +17415,15 @@ __metadata: languageName: node linkType: hard +"function.name@npm:^1.0.3": + version: 1.0.13 + resolution: "function.name@npm:1.0.13" + dependencies: + noop6: ^1.0.1 + checksum: 376bd4247cacffb50ae425c64e99c42fd10a875197e09db7e65002a5bc0f539608b03f1ff7e27234516cd5b3bbfd9d9d8e912fa9aaeec52d3b422d501f290fff + languageName: node + linkType: hard + "function.prototype.name@npm:^1.1.6": version: 1.1.6 resolution: "function.prototype.name@npm:1.1.6" @@ -17293,6 +17611,23 @@ __metadata: languageName: node linkType: hard +"git-package-json@npm:^1.4.0": + version: 1.4.10 + resolution: "git-package-json@npm:1.4.10" + dependencies: + deffy: ^2.2.1 + err: ^1.1.1 + gry: ^5.0.0 + normalize-package-data: ^2.3.5 + oargv: ^3.4.1 + one-by-one: ^3.1.0 + r-json: ^1.2.1 + r-package-json: ^1.0.0 + tmp: 0.0.28 + checksum: 69c16f42e9dfbfd60daf5f7cf33642b2cf4ebf90ffac452b4eacf12c3d9f1728da1c0d771348f6adccd7f4c4a3a7f271e19fbfbb81e16c4096143dfe7ad7df4a + languageName: node + linkType: hard + "git-raw-commits@npm:^4.0.0": version: 4.0.0 resolution: "git-raw-commits@npm:4.0.0" @@ -17306,6 +17641,34 @@ __metadata: languageName: node linkType: hard +"git-source@npm:^1.1.0": + version: 1.1.10 + resolution: "git-source@npm:1.1.10" + dependencies: + git-url-parse: ^5.0.1 + checksum: d3efbe1b32994c82827b43fa5e5de2503bf5e7f44c048b27514d6617f6e0119f4f609c899ad261c63661749867938767bff0a5180c2a3e6193ba386e497e17be + languageName: node + linkType: hard + +"git-up@npm:^1.0.0": + version: 1.2.1 + resolution: "git-up@npm:1.2.1" + dependencies: + is-ssh: ^1.0.0 + parse-url: ^1.0.0 + checksum: 45a939df02e949a1608858b472b50d7165a17521ded288365d0c5b0eb8fa157ba14a6ceaeda316ebdcf4c1c455bbd037a86cc48432723d8c094404d881357b0d + languageName: node + linkType: hard + +"git-url-parse@npm:^5.0.1": + version: 5.0.1 + resolution: "git-url-parse@npm:5.0.1" + dependencies: + git-up: ^1.0.0 + checksum: 081c37feac708e93601ab8b0c6c5b465984dd62334e0f5121ca95f4d4d22fa668f97ade78ed5fb42f3b637ab3c60785eae2e60402e5c356fae97292791d425b1 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -17550,6 +17913,29 @@ __metadata: languageName: node linkType: hard +"got@npm:^5.0.0": + version: 5.7.1 + resolution: "got@npm:5.7.1" + dependencies: + create-error-class: ^3.0.1 + duplexer2: ^0.1.4 + is-redirect: ^1.0.0 + is-retry-allowed: ^1.0.0 + is-stream: ^1.0.0 + lowercase-keys: ^1.0.0 + node-status-codes: ^1.0.0 + object-assign: ^4.0.1 + parse-json: ^2.1.0 + pinkie-promise: ^2.0.0 + read-all-stream: ^3.0.0 + readable-stream: ^2.0.5 + timed-out: ^3.0.0 + unzip-response: ^1.0.2 + url-parse-lax: ^1.0.0 + checksum: bd8e0d0b28e27bc34b81ce98a7ff116b2dec77ac70dda9cf624000eca303ebff51a7c00c1113bede3038afa2e865a61e6a5a6d2c645c5adf68ac8ed5e5b8d064 + languageName: node + linkType: hard + "got@npm:^7.1.0": version: 7.1.0 resolution: "got@npm:7.1.0" @@ -17593,6 +17979,18 @@ __metadata: languageName: node linkType: hard +"gry@npm:^5.0.0": + version: 5.0.8 + resolution: "gry@npm:5.0.8" + dependencies: + abs: ^1.2.1 + exec-limiter: ^3.0.0 + one-by-one: ^3.0.0 + ul: ^5.0.0 + checksum: 969eb7a98f8e5f290e2fab9e689a2cef02099ef92abceafdc9d7074356e34e2ab275a56f148867ead9d7db79b6dc7458a8208b805c4a9dbd43b5a406d5402d7c + languageName: node + linkType: hard + "gzip-size@npm:^6.0.0": version: 6.0.0 resolution: "gzip-size@npm:6.0.0" @@ -18309,6 +18707,13 @@ __metadata: languageName: node linkType: hard +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + languageName: node + linkType: hard + "injectpromise@npm:^1.0.0": version: 1.0.0 resolution: "injectpromise@npm:1.0.0" @@ -18725,6 +19130,13 @@ __metadata: languageName: node linkType: hard +"is-redirect@npm:^1.0.0": + version: 1.0.0 + resolution: "is-redirect@npm:1.0.0" + checksum: 25dd3d9943f57ef0f29d28e2d9deda8288e0c7098ddc65abec3364ced9a6491ea06cfaf5110c61fc40ec1fde706b73cee5d171f85278edbf4e409b85725bfea7 + languageName: node + linkType: hard + "is-reference@npm:1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" @@ -18760,6 +19172,15 @@ __metadata: languageName: node linkType: hard +"is-ssh@npm:^1.0.0, is-ssh@npm:^1.3.0": + version: 1.4.0 + resolution: "is-ssh@npm:1.4.0" + dependencies: + protocols: ^2.0.1 + checksum: 75eaa17b538bee24b661fbeb0f140226ac77e904a6039f787bea418431e2162f1f9c4c4ccad3bd169e036cd701cc631406e8c505d9fa7e20164e74b47f86f40f + languageName: node + linkType: hard + "is-stream@npm:^1.0.0, is-stream@npm:^1.1.0": version: 1.1.0 resolution: "is-stream@npm:1.1.0" @@ -19001,6 +19422,13 @@ __metadata: languageName: node linkType: hard +"iterate-object@npm:^1.1.0": + version: 1.3.4 + resolution: "iterate-object@npm:1.3.4" + checksum: b63496c489177babccb4b487322279ea4377e08d02b93902c3ffba3032a788f014a74e03c615da2a24807fa3fca872f69c9570f7801c8e88181df7a49298904b + languageName: node + linkType: hard + "jackspeak@npm:^2.3.5": version: 2.3.6 resolution: "jackspeak@npm:2.3.6" @@ -19905,6 +20333,15 @@ __metadata: languageName: node linkType: hard +"limit-it@npm:^3.0.0": + version: 3.2.10 + resolution: "limit-it@npm:3.2.10" + dependencies: + typpy: ^2.0.0 + checksum: 3a809aad23f191d2abd469d835829391c8e85074de109a25af44c2d939c41fc92643ab8190f362191bd9157119f32574cebbc7eef6e99695f354a01f7b2a7b76 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -20551,6 +20988,19 @@ __metadata: languageName: node linkType: hard +"merkletreejs@npm:^0.3.9": + version: 0.3.11 + resolution: "merkletreejs@npm:0.3.11" + dependencies: + bignumber.js: ^9.0.1 + buffer-reverse: ^1.0.1 + crypto-js: ^4.2.0 + treeify: ^1.1.0 + web3-utils: ^1.3.4 + checksum: 93edb8ec66aa6c9f59aa0902e675590e3791692893bb3e8c1018f758367ded1bf7d6b1057ccde3729b283ca946a316838a631a922960b76889b3be528c43ef4e + languageName: node + linkType: hard + "methods@npm:^1.1.2, methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" @@ -21504,6 +21954,13 @@ __metadata: languageName: node linkType: hard +"node-status-codes@npm:^1.0.0": + version: 1.0.0 + resolution: "node-status-codes@npm:1.0.0" + checksum: 10fe52de31cc94536aa49a2a8a28e39a880d02832ac268e7edd2b082292232abcaa8e44fe4a318d072a08ce114851fab269ab8d7f9527bd5609aebaf2bb6df17 + languageName: node + linkType: hard + "nodemon@npm:^3.1.4": version: 3.1.4 resolution: "nodemon@npm:3.1.4" @@ -21538,6 +21995,13 @@ __metadata: languageName: node linkType: hard +"noop6@npm:^1.0.1": + version: 1.0.9 + resolution: "noop6@npm:1.0.9" + checksum: cc46d03eb22c5a990b3ce5e3ff71a82628efadcdeefdae566639657d2a947033ea919d1f4bfc7bfbcf674d43c21b3e580c2f07c8043e7ef487ac527237e2532f + languageName: node + linkType: hard + "nopt@npm:^5.0.0": version: 5.0.0 resolution: "nopt@npm:5.0.0" @@ -21560,7 +22024,7 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.5.0": +"normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.3.5, normalize-package-data@npm:^2.5.0": version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" dependencies: @@ -21693,6 +22157,16 @@ __metadata: languageName: node linkType: hard +"oargv@npm:^3.4.1": + version: 3.4.10 + resolution: "oargv@npm:3.4.10" + dependencies: + iterate-object: ^1.1.0 + ul: ^5.0.0 + checksum: f713a1995da354236ec87e8f4dcc21326fe3289129a2c3731b868432b845043ffc4a85ce390c734e25c99e2a8650b745b25282c5b4dffc61496d7f7432dd924d + languageName: node + linkType: hard + "oauth-sign@npm:~0.9.0": version: 0.9.0 resolution: "oauth-sign@npm:0.9.0" @@ -21700,6 +22174,15 @@ __metadata: languageName: node linkType: hard +"obj-def@npm:^1.0.0": + version: 1.0.9 + resolution: "obj-def@npm:1.0.9" + dependencies: + deffy: ^2.2.2 + checksum: 93e28098d186a5609968bf0aed4d0816f0e5baf0354093a6f79687d9e419bd26c38ff6a5674b009ed22987634cb915936cf077f5180a5dbd9e824c80a74c0064 + languageName: node + linkType: hard + "object-assign@npm:^4, object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -21866,6 +22349,16 @@ __metadata: languageName: node linkType: hard +"one-by-one@npm:^3.0.0, one-by-one@npm:^3.1.0": + version: 3.2.8 + resolution: "one-by-one@npm:3.2.8" + dependencies: + obj-def: ^1.0.0 + sliced: ^1.0.1 + checksum: 0af8cef27306172a67423001a1b8b242115ab733d18890275c9cd4adc8ec3414f0b453395915ca8eaddffbbbf71a68e74d16eded362dbd8fac22365af81277e1 + languageName: node + linkType: hard + "one-time@npm:^1.0.0": version: 1.0.0 resolution: "one-time@npm:1.0.0" @@ -21983,6 +22476,13 @@ __metadata: languageName: node linkType: hard +"os-tmpdir@npm:~1.0.1": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d + languageName: node + linkType: hard + "ow@npm:0.17.0": version: 0.17.0 resolution: "ow@npm:0.17.0" @@ -22127,6 +22627,38 @@ __metadata: languageName: node linkType: hard +"package-json-path@npm:^1.0.0": + version: 1.0.9 + resolution: "package-json-path@npm:1.0.9" + dependencies: + abs: ^1.2.1 + checksum: 4528ba905217628e5abf8bf843e7a5c6a9bb368068105ecca8c9d7d925922b5b9f982295710b0df63e1a51705b8077df449252a9fc17765e3b7e0358ae476860 + languageName: node + linkType: hard + +"package-json@npm:^2.3.1": + version: 2.4.0 + resolution: "package-json@npm:2.4.0" + dependencies: + got: ^5.0.0 + registry-auth-token: ^3.0.1 + registry-url: ^3.0.3 + semver: ^5.1.0 + checksum: 0120e4e8222e796f0b7c3e23c25d02a6cbb4818f4488f97e9dcd619383d56c8a7e7d9a0e46dee6a28b56ecabdbfa07ffca0049bff268ebf0ded0e7f1d906e1a0 + languageName: node + linkType: hard + +"package.json@npm:^2.0.1": + version: 2.0.1 + resolution: "package.json@npm:2.0.1" + dependencies: + git-package-json: ^1.4.0 + git-source: ^1.1.0 + package-json: ^2.3.1 + checksum: 579c4c3d6bdeb67e6e501bbaca82ee0a8c9590bf23c6da9eec8f7c2a4dcb3dc0b5dce9ce90ccfcde4c235c8269e1cebd84693d5123d16e5c1a0a22152579f6b6 + languageName: node + linkType: hard + "pact-lang-api@npm:^4.3.6": version: 4.3.6 resolution: "pact-lang-api@npm:4.3.6" @@ -22211,7 +22743,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^2.2.0": +"parse-json@npm:^2.1.0, parse-json@npm:^2.2.0": version: 2.2.0 resolution: "parse-json@npm:2.2.0" dependencies: @@ -22239,6 +22771,16 @@ __metadata: languageName: node linkType: hard +"parse-url@npm:^1.0.0": + version: 1.3.11 + resolution: "parse-url@npm:1.3.11" + dependencies: + is-ssh: ^1.3.0 + protocols: ^1.4.0 + checksum: 33e36566ed248cc8289a35c6c094f98cf68ee42735bd971f9696db4e75d4d85889e4cefecb4fbfab1da4990854e0a5b548434726aede7b9c72714d9dc45736c7 + languageName: node + linkType: hard + "parse5-htmlparser2-tree-adapter@npm:^6.0.0": version: 6.0.1 resolution: "parse5-htmlparser2-tree-adapter@npm:6.0.1" @@ -23473,6 +24015,20 @@ __metadata: languageName: node linkType: hard +"protocols@npm:^1.4.0": + version: 1.4.8 + resolution: "protocols@npm:1.4.8" + checksum: 2d555c013df0b05402970f67f7207c9955a92b1d13ffa503c814b5fe2f6dde7ac6a03320e0975c1f5832b0113327865e0b3b28bfcad023c25ddb54b53fab8684 + languageName: node + linkType: hard + +"protocols@npm:^2.0.1": + version: 2.0.1 + resolution: "protocols@npm:2.0.1" + checksum: 4a9bef6aa0449a0245ded319ac3cbfd032c3e76ebb562777037a3a832c99253d0e8bc2847f7be350236df620a11f7d4fe683ea7f59a2cc14c69f746b6259eda4 + languageName: node + linkType: hard + "proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" @@ -23717,6 +24273,25 @@ __metadata: languageName: node linkType: hard +"r-json@npm:^1.2.1": + version: 1.3.0 + resolution: "r-json@npm:1.3.0" + dependencies: + w-json: 1.3.10 + checksum: 9a2aa9b92a2f4b7932c7eb45175d9c7ff078e322eecaf1ca2c9cdda346ea68e73062004c1b3631a9127e84eedf982fc816110f0c7a1d07c6b2b3344f6d621791 + languageName: node + linkType: hard + +"r-package-json@npm:^1.0.0": + version: 1.0.9 + resolution: "r-package-json@npm:1.0.9" + dependencies: + package-json-path: ^1.0.0 + r-json: ^1.2.1 + checksum: e94b2b02e75dee37d42226656a66cacf69332324acf67743ddf4aa8300acc06bc35861c15379a4061232ca40d40d76f5a1beb82fe18b9e5d6225e2b722a3a138 + languageName: node + linkType: hard + "railroad-diagrams@npm:^1.0.0": version: 1.0.0 resolution: "railroad-diagrams@npm:1.0.0" @@ -23816,6 +24391,20 @@ __metadata: languageName: node linkType: hard +"rc@npm:^1.0.1, rc@npm:^1.1.6": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: ^0.6.0 + ini: ~1.3.0 + minimist: ^1.2.0 + strip-json-comments: ~2.0.1 + bin: + rc: ./cli.js + checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e + languageName: node + linkType: hard + "react-dom@npm:^18.2.0": version: 18.2.0 resolution: "react-dom@npm:18.2.0" @@ -23855,6 +24444,16 @@ __metadata: languageName: node linkType: hard +"read-all-stream@npm:^3.0.0": + version: 3.1.0 + resolution: "read-all-stream@npm:3.1.0" + dependencies: + pinkie-promise: ^2.0.0 + readable-stream: ^2.0.0 + checksum: ff7bf7c5484dcb6e857d9eccc388d2d32674e538c88cad61703e3d8ae9386a7fa74e8b30b6eb82a3979ea60413e933b90238e99a59f782d7fabebb7833a5b9c4 + languageName: node + linkType: hard + "read-only-stream@npm:^2.0.0": version: 2.0.0 resolution: "read-only-stream@npm:2.0.0" @@ -23908,7 +24507,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.0, readable-stream@npm:^2.0.1, readable-stream@npm:^2.0.2, readable-stream@npm:^2.0.5, readable-stream@npm:^2.2.2, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -24059,6 +24658,25 @@ __metadata: languageName: node linkType: hard +"registry-auth-token@npm:^3.0.1": + version: 3.4.0 + resolution: "registry-auth-token@npm:3.4.0" + dependencies: + rc: ^1.1.6 + safe-buffer: ^5.0.1 + checksum: a15780726bae327a8fff4048cb6a5de03d58bc19ea9e2411322e32e4ebb59962efb669d270bdde384ed68ed7b948f5feb11469e3d0c7e50a33cc8866710f0bc2 + languageName: node + linkType: hard + +"registry-url@npm:^3.0.3": + version: 3.1.0 + resolution: "registry-url@npm:3.1.0" + dependencies: + rc: ^1.0.1 + checksum: 6d223da41b04e1824f5faa63905c6f2e43b216589d72794111573f017352b790aef42cd1f826463062f89d804abb2027e3d9665d2a9a0426a11eedd04d470af3 + languageName: node + linkType: hard + "regjsgen@npm:^0.6.0": version: 0.6.0 resolution: "regjsgen@npm:0.6.0" @@ -24847,7 +25465,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.5.0, semver@npm:^5.6.0": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.1.0, semver@npm:^5.3.0, semver@npm:^5.5.0, semver@npm:^5.6.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -25305,6 +25923,13 @@ __metadata: languageName: node linkType: hard +"sliced@npm:^1.0.1": + version: 1.0.1 + resolution: "sliced@npm:1.0.1" + checksum: 84528d23279985ead75809eeec5d601b0fb6bc28348c6627f4feb40747533a1e36a75e8bc60f9079528079b21c434890b397e8fc5c24a649165cc0bbe90b4d70 + languageName: node + linkType: hard + "smart-buffer@npm:^4.1.0, smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -25932,6 +26557,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + languageName: node + linkType: hard + "stubborn-fs@npm:^1.2.5": version: 1.2.5 resolution: "stubborn-fs@npm:1.2.5" @@ -26351,6 +26983,13 @@ __metadata: languageName: node linkType: hard +"timed-out@npm:^3.0.0": + version: 3.1.3 + resolution: "timed-out@npm:3.1.3" + checksum: 7952bcc926fd43f3206f7cb9f27dc54912a48c08058da0208d33dabef35b6759d9f1d2d14976c529d2209bd92a109bb057d377211fd2d2d962f4ca0a8d3f15f0 + languageName: node + linkType: hard + "timed-out@npm:^4.0.0, timed-out@npm:^4.0.1": version: 4.0.1 resolution: "timed-out@npm:4.0.1" @@ -26398,6 +27037,15 @@ __metadata: languageName: node linkType: hard +"tmp@npm:0.0.28": + version: 0.0.28 + resolution: "tmp@npm:0.0.28" + dependencies: + os-tmpdir: ~1.0.1 + checksum: 8167d2471b650f88fde1515bbf6c62d2adef07972d06531569f789863a2436c32027b6d5fbe3102ed2c430b86043dffd337db12494f1f982534862d9487e4eff + languageName: node + linkType: hard + "tmp@npm:^0.2.1": version: 0.2.3 resolution: "tmp@npm:0.2.3" @@ -26527,6 +27175,13 @@ __metadata: languageName: node linkType: hard +"treeify@npm:^1.1.0": + version: 1.1.0 + resolution: "treeify@npm:1.1.0" + checksum: aa00dded220c1dd052573bd6fc2c52862f09870851a284f0d3650d72bf913ba9b4f6b824f4f1ab81899bae29375f4266b07fe47cbf82343a1efa13cc09ce87af + languageName: node + linkType: hard + "triple-beam@npm:^1.3.0": version: 1.4.1 resolution: "triple-beam@npm:1.4.1" @@ -27078,6 +27733,15 @@ __metadata: languageName: node linkType: hard +"typpy@npm:^2.0.0, typpy@npm:^2.1.0, typpy@npm:^2.2.0, typpy@npm:^2.3.4": + version: 2.3.13 + resolution: "typpy@npm:2.3.13" + dependencies: + function.name: ^1.0.3 + checksum: e415782245876bd2bd069e227feb93fb0e4d93ccc4c1f10c0bd2a2ba223a92dfca18a4ed95b8c87eb226337909f4fa1509c6e962d7917f6d648e7d24b497a13e + languageName: node + linkType: hard + "u2f-api@npm:0.2.7": version: 0.2.7 resolution: "u2f-api@npm:0.2.7" @@ -27147,6 +27811,16 @@ __metadata: languageName: node linkType: hard +"ul@npm:^5.0.0": + version: 5.2.15 + resolution: "ul@npm:5.2.15" + dependencies: + deffy: ^2.2.2 + typpy: ^2.3.4 + checksum: a47735d307da2e9b25568977d8b13d5ab2845b2f7a14ad75b22022945f3879e0ecfef8b6134cb661fc2e46a2e86e3f69c44659816c422d0be50181aeaf44413d + languageName: node + linkType: hard + "ultra-runner@npm:^3.10.5": version: 3.10.5 resolution: "ultra-runner@npm:3.10.5" @@ -27330,6 +28004,13 @@ __metadata: languageName: node linkType: hard +"unzip-response@npm:^1.0.2": + version: 1.0.2 + resolution: "unzip-response@npm:1.0.2" + checksum: 09efe5d1d23a40534f5f67f268c6f4d2533cba4f2d40ae3233e50f9d7d3ee1db5503c52014f3265174517fff9fdebedd9ac6ec0c57b23a4933791d754b722187 + languageName: node + linkType: hard + "upper-case-first@npm:^1.1.0, upper-case-first@npm:^1.1.2": version: 1.1.2 resolution: "upper-case-first@npm:1.1.2" @@ -27878,6 +28559,13 @@ __metadata: languageName: node linkType: hard +"w-json@npm:1.3.10": + version: 1.3.10 + resolution: "w-json@npm:1.3.10" + checksum: 8535a207e579e616797efc4d5140acc7c0aefd11f0c9f846e6739816a2db8637d235492d86fc5c47bb2dba5821413d72b2d62df9184ee9d6e22e67b3f90d205b + languageName: node + linkType: hard + "watchpack@npm:^2.3.1": version: 2.3.1 resolution: "watchpack@npm:2.3.1" @@ -28879,7 +29567,7 @@ __metadata: languageName: node linkType: hard -"web3-utils@npm:1.10.4, web3-utils@npm:^1.10.4": +"web3-utils@npm:1.10.4, web3-utils@npm:^1.10.4, web3-utils@npm:^1.3.4": version: 1.10.4 resolution: "web3-utils@npm:1.10.4" dependencies: From 52ba5d5f84a4cc7becf5373ce6d61ee1bb613c3c Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 8 Aug 2024 19:39:15 -0500 Subject: [PATCH 235/375] devop: add forma network --- .../src/libs/keyring/public-keyring.ts | 10 +++++++ .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../src/providers/ethereum/networks/forma.ts | 25 ++++++++++++++++++ .../ethereum/networks/icons/forma.png | Bin 0 -> 2443 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ packages/types/src/networks.ts | 1 + 7 files changed, 40 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/forma.ts create mode 100644 packages/extension/src/providers/ethereum/networks/icons/forma.png diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index c9a2048e8..efb4a2307 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -64,6 +64,16 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; + allKeys["0x4eb92ac9bae0d94ff5cbe17bbf7efccb9e303020"] = { + address: "0x4eb92ac9bae0d94ff5cbe17bbf7efccb9e303020", + basePath: "//", + name: "fake forma account #5", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.secp256k1, + walletType: WalletType.mnemonic, + isHardware: false, + }; allKeys[ "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y" ] = { diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..cdabd6dc7 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Forma]: "forma", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..66dff3379 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.Forma]: "https://explorer.forma.art/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/networks/forma.ts b/packages/extension/src/providers/ethereum/networks/forma.ts new file mode 100644 index 000000000..4a4cc6da2 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/forma.ts @@ -0,0 +1,25 @@ +import { NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import { EtherscanActivity } from "../libs/activity-handlers"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +const formaOptions: EvmNetworkOptions = { + name: NetworkNames.Forma, + name_long: "Forma", + homePage: "https://forma.art/", + blockExplorerTX: "https://explorer.forma.art/tx/[[txHash]]", + blockExplorerAddr: "https://explorer.forma.art/address/[[address]]", + chainID: "0xf043a", + isTestNetwork: false, + currencyName: "TIA", + currencyNameLong: "TIA", + node: "https://rpc.forma.art", + icon: require("./icons/forma.png"), + activityHandler: wrapActivityHandler(EtherscanActivity), + NFTHandler: shNFTHandler, +}; + +const forma = new EvmNetwork(formaOptions); + +export default forma; diff --git a/packages/extension/src/providers/ethereum/networks/icons/forma.png b/packages/extension/src/providers/ethereum/networks/icons/forma.png new file mode 100644 index 0000000000000000000000000000000000000000..15f45d6de62799c8d37a2905ad1b8183dbc1b4c8 GIT binary patch literal 2443 zcmV;633T>}P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rj2nZK91v&$$^h1B;M^FCn=fC)62!(1b(&*xFOeX*;7>!2jps9D|@czYf=g&X&?$oc-rgT2~Mo7wg3*vE#G>0KP`?B0|^H3ov(l6+h2Ql6+s#p zb8pZc)_DwdFslqRig)|mz?L`cp*9nI0`!NzQcj05vB_UwF1nb zsAt2Ot=t;-{D#UTNkgGHB@(Rdn|Yw)x{c@lp- znJmNfwzuXeK@2fdBRCjl{YXE%v?w@~5$%Ge9kOlTyDk(E2IYNU{_nfzBTy2i6yBYQ znrD}c^0ZwMyBI_lBM7FrksAL5($K8z7g5PVtWk+4tN+b5Cj~_xpCXQf>9*&W0IhA$ zHvbU=Ljnq}cmhR?VTC7ii*90`EbXkR6?CI}3?Xc8 zZeF-m&kAe^3R_qrfEA6yz887y(;je=67gBp``4I%Pmz!6M7{rWCr(s1ZcKpT$=+mh zRunx^d@_?j@}~E?LwQNijgtjbL|sHs!3FgI`$$;|C;-%z-b@)T`N_xESMcE@Dm^qtUTDBL8ccax*C+Yfd~*~9JZ_9WIR z&7qEaj8R0cUcG8&b*xoBMvFUU<|h30#kmV6YR9H&1!l8Zuh+YH@#3XRmtu^e2>U-G zu827#r~}iSA=GUy?^sRqhY6~>v9U24jZ#WLiV2v1v(gRfn;k7Mn82i9tI)b=fxFsq zs(ArgL{dt1T|fKmvnNiR074PWETv?r`KoEhV#I_96WEw;O^1UxTuoBsHQZjK*tY); zZhPOandVIJGtWHp{PWL`$K%OlqN*W;m}0)P*u%@Yi0t_Ky#9|juUSf~D-i*;PKxvR z_7``Kl_#Ef;?-AQt*R=;q^f0E?xq=tDFMB;@}D1k^wQt{df}r{l)})w@spvalvKk( zK-?4P5W;voK7IQ1K}F)uH*oJ=NX-~9XL=Jha8o!M$l z-qpN4rhDE9$Ca?S>`O8yXOX|s$r@cQw%610gqT`k1dh%&1RN| z#F1OrbH?sQBPpen(tIrD8B~L~Iqr(6B7z1)5Tz)}vMk*_w-%Kn|2pyic6HKbi2Tai z0000bbVXQnWMOn=I%9HWVRU5xGB7eUEigDOFgR2)GdeXiIy5&cFfckWFi(2p7XSbN zC3HntbYx+4WjbwdWNBu305UK#G%YYVEigD#GBY|gG&(dgD=;uRFfeQ%bPNCh002ov JPDHLkV1iP@pWy%i literal 0 HcmV?d00001 diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..85dc07c60 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import formaNode from "./forma"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + forma: formaNode, }; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..d2576888f 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + Forma = "Forma" } export enum CoingeckoPlatform { From e61ae3b022dbecacd15a838ac8ac76837d2f243f Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Fri, 9 Aug 2024 00:24:53 -0500 Subject: [PATCH 236/375] devop: add godwoken network --- .../src/libs/keyring/public-keyring.ts | 33 +++ .../src/libs/nft-handlers/simplehash.ts | 1 + .../ethereum/libs/activity-handlers/index.ts | 2 + .../providers/godwoken/configs.ts | 7 + .../providers/godwoken/index.ts | 212 ++++++++++++++++++ .../libs/assets-handlers/assetinfo-mew.ts | 4 + .../libs/assets-handlers/token-lists.ts | 1 + .../assets-handlers/types/tokenbalance-mew.ts | 3 +- .../providers/ethereum/networks/godwoken.ts | 28 +++ .../ethereum/networks/icons/godwoken.png | Bin 0 -> 6412 bytes .../src/providers/ethereum/networks/index.ts | 2 + packages/types/src/networks.ts | 2 + 12 files changed, 294 insertions(+), 1 deletion(-) create mode 100644 packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/configs.ts create mode 100644 packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/index.ts create mode 100644 packages/extension/src/providers/ethereum/networks/godwoken.ts create mode 100644 packages/extension/src/providers/ethereum/networks/icons/godwoken.png diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index c9a2048e8..dd44fa074 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -77,6 +77,39 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; + allKeys[ + "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y" + ] = { + address: + "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y", + basePath: "m/49'/2'/0'/1", + name: "fake ltc account #4", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.secp256k1btc, + walletType: WalletType.mnemonic, + isHardware: false, + }; + allKeys["0x9a991382cbbcf03a7a8f59277478152f2c81f4d1"] = { + address: "0x9a991382cbbcf03a7a8f59277478152f2c81f4d1", + basePath: "m/44'/60'/0'/0", + name: "fake godwoken account #5", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.secp256k1, + walletType: WalletType.mnemonic, + isHardware: false, + }; + allKeys["0x51f6749dee3510f983c15b7c239cc6df4e4054ea"] = { + address: "0x51f6749dee3510f983c15b7c239cc6df4e4054ea", + basePath: "m/44'/60'/0'/0", + name: "fake godwoken account #6", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.secp256k1, + walletType: WalletType.mnemonic, + isHardware: false, + }; } return allKeys; } diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..1a83f6d3d 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Godwoken]: "godwoken", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts index 300826277..d36b8c5d0 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/index.ts @@ -4,6 +4,7 @@ import OkcActivity from "./providers/okc"; import TomoScan from "./providers/tomoscan"; import OntEVMActivity from "./providers/ont-evm"; import TelosActivity from "./providers/telos"; +import GodwokenActivity from "./providers/godwoken"; export { RivetActivity, EtherscanActivity, @@ -11,4 +12,5 @@ export { OntEVMActivity, TomoScan, TelosActivity, + GodwokenActivity, }; diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/configs.ts new file mode 100644 index 000000000..cfa90a7d7 --- /dev/null +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/configs.ts @@ -0,0 +1,7 @@ +import { NetworkNames } from "@enkryptcom/types"; + +const NetworkEndpoints = { + [NetworkNames.Godwoken]: "https://api.v1.gwscan.com/graphql", +}; + +export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/index.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/index.ts new file mode 100644 index 000000000..195723038 --- /dev/null +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/godwoken/index.ts @@ -0,0 +1,212 @@ +import { EvmNetwork } from "@/providers/ethereum/types/evm-network"; +import { + Activity, + ActivityStatus, + ActivityType, + EthereumRawInfo, +} from "@/types/activity"; +import { BaseNetwork } from "@/types/base-network"; +import { decodeTx } from "../../../transaction/decoder"; +import { NetworkEndpoints } from "./configs"; + +type GraphQLResponse = GraphQLErrorResponse | GraphQLOkResponse; + +type GraphQLOkResponse = { + data: T; + errors?: undefined; +}; + +type GraphQLErrorResponse = { + errors: { message: string }[]; + result?: undefined; +}; + +type TransactionListResult = { + transactions: { + entries: { + block: { + /** ISO8601 string */ + timestamp: string; + }; + /** bytes32 */ + block_hash: `0x${string}`; + block_number: number; + /** bytes32 transaction hash */ + hash: `0x${string}`; + /** transaction index */ + index: number; + nonce: number; + from_account: { + /** bytes20 string */ + eth_address: `0x${string}`; + }; + to_account: null | { + /** bytes20 string */ + eth_address: `0x${string}`; + }; + polyjuice: { + /** base10 bigint string */ + gas_limit: string; + /** base10 bigint string */ + gas_price: string; + /** base10 bigint string */ + gas_used: string; + /** byte string */ + input: `0x${string}`; + /** bytes20 */ + created_contract_address_hash: null | `0x${string}`; + status: "FAILED" | "SUCCEEDED"; + /** base10 bigint string */ + value: string; + }; + }[]; + }; +}; + +const getAddressActivity = async ( + address: string, + endpoint: string +): Promise => { + const response = await fetch(endpoint, { + method: "POST", + signal: AbortSignal.timeout(30_000), + headers: { + "Content-Type": "application/json", + Accept: "application/json", + }, + body: JSON.stringify({ + operationName: "getTransactions", + variables: { + address: address, + limit: 50, + }, + query: /* graphql */ ` +query getTransactions( + $address: HashAddress! + $limit: Int +) { + transactions( + input: { + limit: $limit + combine_from_to: true + from_eth_address: $address + to_eth_address: $address + sorter: [ + { sort_type: ASC, sort_value: BLOCK_NUMBER } + { sort_type: ASC, sort_value: INDEX } + { sort_type: ASC, sort_value: HASH } + ] + } + ) { + entries { + block { + timestamp + } + block_hash + block_number + index + hash + nonce + from_account { + eth_address + } + to_account { + eth_address + } + polyjuice { + gas_limit + gas_price + gas_used + input + created_contract_address_hash + status + value + } + } + } +} +`, + }), + }); + + if (!response.ok) { + // Received error HTTP response, probably something like a gateway error, + // blocked, rate limited, server down, etc + let msg = await response + .text() + .catch((err) => `Failed to decode response text: ${String(err)}`); + const len = msg.length; + if (len > 255 + 3) msg = `${msg.slice(0, 255)}... (255/${len})`; + throw new Error( + `HTTP error fetching transactions ${response.status} ${response.statusText}: ${msg}` + ); + } + + const result: GraphQLResponse = await response.json(); + + if (result.errors) { + // GraphQL error, probably something wrong with query or variables + let msg = result.errors[0].message ?? "???"; + const len = msg.length; + if (len > 512 + 3) msg = `${msg.slice(0, 512)}... (512/${len})`; + throw new Error(`GraphQL error fetching transactions: ${msg}`); + } + + const rawdata: EthereumRawInfo[] = result.data.transactions.entries.map( + (tx) => ({ + blockHash: tx.block_hash, + blockNumber: "0x" + tx.block_number.toString(16), + contractAddress: tx.polyjuice.created_contract_address_hash, + effectiveGasPrice: "0x" + BigInt(tx.polyjuice.gas_price), + from: tx.from_account.eth_address, + to: tx.to_account?.eth_address ?? null, + gas: "0x" + BigInt(tx.polyjuice.gas_limit), + gasUsed: "0x" + BigInt(tx.polyjuice.gas_used), + status: tx.polyjuice.status === "SUCCEEDED" ? true : false, + transactionHash: tx.hash, + data: tx.polyjuice.input, + nonce: "0x" + tx.nonce.toString(16), + value: "0x" + BigInt(tx.polyjuice.value).toString(16), + timestamp: new Date(tx.block.timestamp).valueOf(), + }) + ); + + return rawdata; +}; + +export default async ( + network: BaseNetwork, + address: string +): Promise => { + address = address.toLowerCase(); + const enpoint = + NetworkEndpoints[network.name as keyof typeof NetworkEndpoints]; + const activities = await getAddressActivity(address, enpoint); + + const Promises = activities.map((activity) => { + return decodeTx(activity, network as EvmNetwork).then((txData) => { + return { + from: activity.from, + to: activity.contractAddress + ? activity.contractAddress + : txData.tokenTo!, + isIncoming: activity.from !== address, + network: network.name, + rawInfo: activity, + status: ActivityStatus.success, + timestamp: activity.timestamp ? activity.timestamp : 0, + value: txData.tokenValue, + transactionHash: activity.transactionHash, + type: ActivityType.transaction, + token: { + decimals: txData.tokenDecimals, + icon: txData.tokenImage, + name: txData.tokenName, + symbol: txData.tokenSymbol, + price: txData.currentPriceUSD.toString(), + }, + }; + }); + }); + return Promise.all(Promises); +}; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..77be93f2a 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -135,6 +135,10 @@ const supportedNetworks: Record = { tbName: "degen", cgPlatform: CoingeckoPlatform.Degen, }, + [NetworkNames.Godwoken]: { + tbName: "ckb", + cgPlatform: CoingeckoPlatform.Godwoken, + }, }; const getTokens = ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..f90052602 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -30,6 +30,7 @@ const TokenList: Record = { [NetworkNames.Blast]: `https://tokens.coingecko.com/${CoingeckoPlatform.Blast}/all.json`, [NetworkNames.Sanko]: `https://tokens.coingecko.com/${CoingeckoPlatform.Sanko}/all.json`, [NetworkNames.Degen]: `https://tokens.coingecko.com/${CoingeckoPlatform.Degen}/all.json`, + [NetworkNames.Godwoken]: `https://tokens.coingecko.com/${CoingeckoPlatform.Godwoken}/all.json`, }; const getKnownNetworkTokens = async ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..8d3412e1b 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -52,4 +52,5 @@ export type SupportedNetworkNames = | NetworkNames.Rollux | NetworkNames.Sanko | NetworkNames.Degen - | NetworkNames.Blast; + | NetworkNames.Blast + | NetworkNames.Godwoken; diff --git a/packages/extension/src/providers/ethereum/networks/godwoken.ts b/packages/extension/src/providers/ethereum/networks/godwoken.ts new file mode 100644 index 000000000..636734eed --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/godwoken.ts @@ -0,0 +1,28 @@ +import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; +import { GodwokenActivity } from "../libs/activity-handlers"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; + +const ethOptions: EvmNetworkOptions = { + name: NetworkNames.Godwoken, + name_long: "Godwoken", + homePage: "https://www.godwoken.com/", + blockExplorerTX: "https://v1.gwscan.com/tx/[[txHash]]", + blockExplorerAddr: "https://v1.gwscan.com/address/[[address]]", + chainID: "0x116ea", + isTestNetwork: false, + currencyName: "CKB", + currencyNameLong: "CKByte", + node: "https://v1.mainnet.godwoken.io/rpc", + icon: require("./icons/godwoken.png"), + coingeckoPlatform: CoingeckoPlatform.Godwoken, + NFTHandler: shNFTHandler, + assetsInfoHandler, + activityHandler: wrapActivityHandler(GodwokenActivity), +}; + +const eth = new EvmNetwork(ethOptions); + +export default eth; diff --git a/packages/extension/src/providers/ethereum/networks/icons/godwoken.png b/packages/extension/src/providers/ethereum/networks/icons/godwoken.png new file mode 100644 index 0000000000000000000000000000000000000000..42cbbdebf30280bd2af4e94722e83a7f5612905f GIT binary patch literal 6412 zcmV+n8T00eP) zdyo~?oyR}F?!L?m5F(%ikf6L`Q1L}YO|}$Qq7WSs6;~_CM&s_fYb9B$wzev}d7#^H(OifCMK(?ijOFxQNj4gT1e!v5Q(A!0wEYO6PSSk=FZ&i{_P*9&%HgDdEA-l zp1CvJFLmoO_tmG*_ji7;^E>AV!wjk_fCGq#_+7j|4ww$i0cHTF1Ji&>z<6K`PzO{2 zZuGSPXalmqVW1gk0)7YV0CoY}f!!ipOuD(QQ(!e9kUI9~An0K5V`3A`*Ktx@}r6XbG1SqVTyd|q{`>e;|w z0@q>ex`~& z{}TqPDq8TCQPm~dnfOpu{pfkP!`@3=h}Ws=HL?45)o6v05A96+xvIJ<)-iz&&(U5g zitn#MRp)orH-m*ilRAyrJyjhGd=2<2CLv?Pq!UFQ#_zWs_&)G2B63)Z{GqflC<34{ z&sSBK0N(>? zd@%Q}n7%j@SgooLsA`RfglbaEsUkHE5UG4uMEuCk{Ro)PiKp&MMZ8}&1GkCD=12&F zv`j)OBt+yBk^e>Dbqx7F$0tlGFtGjNW9BseS5?1gC%iPJC?RnoBHN`RqN@5`;D^9y zjJ-=;rHuf1n7$ef{7_X_V$#T}DdY?il`8A(sma~{7+8wAnR3qFl`Cvk(FIlkpA(T* zO*oaD7%4IGCt)1D3o+`fGU^8g+lL!~B_h(4q!1*cQexzv4!lf-{3PLF`tm~HWmP>r z>gzbK)PPLVg;seYzW1BqH0B&;$b#fEf8RfLAe7wkL98CvDii-2+@E zBD)4E1pPJvk+*Mc{<9eJeJbRq2^Z7H(}CwybyCDZzj^GJ28hL^wU~0K3#g3z!G!JW zjliXtf>!NMvZ&9Jqp<=_;HMb!D40^MGFiH4JS* zW(5YeFtrW%q=@{sFOfk>9USmG2Kq}b zhO?_wb&-gy=}ri`(=)dI?4E(Pq(2BF*UlB;aFF9an%?FIjqmXLY>Vk6Cxe%%K~X{- zIc}gULLd$qNmQfVqpH888-MvY0f?o0>w)tbRHIESqzdD*8uFiR+08}oJj1gGcj9_g zIF5&}Av$6s{#4;&I9vc+5v?}r#AmSp*k1lBiE5+nVK3k!toU#f*KL21Kl*KWUNwPg z-XEx---vS>{~L&z02?c+>L-9JqL))0{TgkxqbPUmS<8Rz--7E^qsV}5{BR5mO_D{D zZoAFrT%oF;5Rtdzc>%BJgCS;59$Si>+FZYJ=FIadH!|4P0<%qOZmo=JGbw7ou4&rBa^8m z*T+$BNQWQ{34$DG2;zX_Qtf7_5*JT~Jab(#T!BD5PWGyj{%P9@%T)F2B62k1Jiq+d z!GsJ8fvKcC;S)sO{@s7r%)|TN>NEL{2q=UR>0?LLv7l}W7uB7@{F;+Ft!gym-BHv! z9;1d?qDWCjMMB%pEMQl#BmOjugWnLn78I-azo7HBXNkj-|MQmJeDn9e#`CI6Cf}<1 zAjko*VDu^6I$9l+!!^rkq7fQt5z;JU1P1mQ;YCEW# zfY~C_qN?IiC^7yNhWyks1q!F#26_2!al3-3%+HeTuJ6Itwq# z7W%3M%w_~pcIYy?-xPU3P>c$1 z2|D=4ed`g&i$cJj;YQ?tdhAr5nz@LHk-y-H(`kA*3`4>&#Bm%P$H8@nm*Y2xu%&#T zjyMmz$o|g&=0+b%-u6eM^`XYM`7qmz=T+w`db)!v4uPNL;;~bCVfJF`9FIViOf0Ok zquq5~9LK!g*x1O99Xr^!Zy&9#t@wV)CGtZK5kXa{uC8YJ^5s-jB_0l1Zs!6sL}Z86 zGYcqeO_J#Fv7^7)Z|C0|-$tBFucP01`W?)!J(;IxF3OW%JnHRe|KNiUc%Z}dQRMM+OY3O2i~W#{SdBK z)1%`jfM`gKo8j>@u3%C$ClDt;2m)N!rKzcjZ+zn$Jo@OP9655N@EamHj+11^4GOFV zIQit0(`>ut_(I^PRsiPPHY9yDSA?8~Jbd7NMC`VB-NT7g|Ggi(lyho6f*;v@3rqf{ zO`BN0d^tOJ?gWg}6n6lFVEApsZ3Q4@vt>D+58y@d|LmeS6M-GMZys%8+p#|(PNv5> zeOH7aXy<~lQ~0}yACJCYAm7^i_3PJj<&{^`+}unilfn1>VP)%w7?$H%s(O-xIaukG zqBj$PrTXcX-4OV=z5KfU{ECmBha=J{8x@8jBEsIid#SIlr@6Tq*LBI|a>G948)Von zJq4KI05dU8K}doEphP1Y<)y>>z;SzY{#+44zk`d$PT|V2QwgI2kz(9-+imRMzaP)@ zhNYS>0|PThip9Y949;DhX8wq={a@k*%bQT}SeTpXm6umnMX<2XF=#1p*q z(o1-rS5f%`gYDhZtqDjRmcZY%9mMzBaU+%973`GmxKU$Ra?)vlNf}!>j)U*}eEZwq zM(mtG1xa9rL+8Vo631_j9e_w1bO%QSLZ6FAPhz51-DyEY5Cn(_uf6sfTeohl2tcx! z=3yoWAf;J|ciRv3`qP4dhFnr-e9=%fKe1ySyvHAZJRjeeA^+bVqWVUPrCwZ9TRO2ru0_*Yb&$VId{<=q~3Xa44+LNP(6q@3B9=TkO*I$1vx|ef#nWpWa5V z9feb;PUY5HZ)MV?Nz~TXGHTSQd~V%!-IDX{VHlFlW{-P4o6Y7!Q&pv{tu253j*bpG zIy!J1C;z#YmKN^6|9*Vm≀3FvbI_qdyWi0Ua998v4EevMQs!Do%1o6}@aaY46^> z7ua&}R1m1r z5!#;R2LFODe0h2Yw2uN@L0fPw(@1S=fl#*HJB z$s}D68i(b&$pQAJafNb%@B3sj8CI`eO?`d+kO)CjQxiabf~qG>o;(>~Fxt1r!E7r! z;*rbc$Ye6CS+j=v`uaih2~-tTWzU{HK+h(?zBhB`%=~v##x4i=z+OM?s|_`Bx!j;T zh9ZK9uxZn#lD{*1_Uzt2G%#4McRIlP6!rifk$ylN#g1W`LZGTRj>Dlthj`_cSAd?? zy3Jaib=FxxYKbGIu)X{aYXbfldvnC2DQ_|Ak_%Ka=Zl!OTjnTcBFOHa)lLwhK2@~EnAj|5Lnya*4CDnWTAbV6wXDC7wm8XEGNz*ZOa2bRpoAAg)3J9hMHTI{vXKKpFu&6|g+ zrnSd`QrHn@0~Ai1+y%TF`%q#Sgi|sSfejHG8XCCah8yVUFk80wRS2x@&t|jSd+)s^ zjecwYZ@lrwUQNXSVH@%;@PVp|L*YcQ*C}ifli1b#Xwycs+wbxJ?CXJczi!BugQxun z!;q?~Dpsvp#nPoq34)-{0^s{TuIsXLt0Z z+LK1(bxO|xcaY!~F&@G=ZxlK8am4L%X_z2{DvWkBU9JTL)2V}%wry{3$8}wf9Xp2a z`&3s~mz|*OCV3vp+${#juw-8s=$5b^`)tpvP62dUl zT+VdYyYIfM)2B~YKpn@4pa0P1!*yK+^ro9`QdL#o_tR`@P7Sv|jdL#ckLZk`Yk*ZG zr~&#?6xyAZ&=OY!B?UV&ds6!v?LuO!eH$7Y_|liYL{n2!NsgQy`Bha_Y}vAfnKNhR z%h^(b<@6d6c~;|R2x+7WRJBf3_e2sCq$!TW5n&jr@B5ubYGY%g-g)Pp`B7cU$OqK( zJO%Vy-};uSrat;DmwVN02%hIW4^_20hkq~na3W?P48vjh2!cR^AW+};HJ8gBN6`NL z`}I5D`HoJRGDX3h&KaH1S+eRs@4WN0y}ez1-`6keijpJdglRrw;1zQpb}#H*^RV*UE{%$qkazj!1?D5m^>ezylk zMC3cs2VNq9^8&*#q^YSX&54b~psIMDm-pPW*({BXjqKjNn{C^+v0=joHg4R=haY~J z|BemwN+sX=6+sa2@WT%?Z{EDL!#*e+_We>Z`EdM+AeN;EFappo)-(#=T3cH=|NQf5 zX=xcyYIQK6s$?>m{N6)Hj~>lu1LLs!5B7z4FyyZq!y>YI_>=(BfX?OAhkvyK@vrX;&qt`FCB)$=@cUAJT#U;Ge}yxq4>pA8*T zhUIR9s=69++nWGbXRyBLM@mLq0LG6WuOgz3 zx?;r&ZEtT^)j?JJss*l|?-%*emz?PNELH7LlT9i~cby0VVEr1;^Eze!YHDiq_SA{m^*hamtJ})S6y`#mt1lQ)zxOdExWnpAQKOT37_r2 z`M^;M+P6#e7#2iz0*;6rQPn$u7b#Sg^qM4c9EW-H=F!^P+DQXsGMQd8gJ~Cm_`aVf zsw;>Hp68LtWEeAM43j2JV%oH6OrJiTbIv)3IdkSPefsp{esc)VEV5<@;BQ2vH5&ar zc4A4HJ}pcaKLp%KAI=r-io{Y!Mp^=3>-Bpp)6Qfvy|&d>5tqRUC6<$iMC8k=>WN6N zTauJ20M-~X z0l&uVFW75AZ&yT@LTgRzUlkySs6_fi$3YFhB6qzd>dF2aUlI69|lpQ&hq^kDmT4{(`??COih-xUTF$VTM5 zBC-p(B5GJg6Qlz>^7jB&BtbqTu=pb;1lxgyz*dZNQW1jWU>&~S0t-cCdlKYBk_SZ= z%)vz97ns9|E78HgVf%0c@L3UQOp1I+a3yd|6Ep#rW5N@ABz<|L^@bOe!qo0Fz~xDk z4+#nY1V&Ra z38ldH(GlRwBJ!hnefpaPBKvFhSX=Q?Vzia_+6_L$qO1XnH z$hQ|u1yOCiojceJTmpPQx~AQ!vf>+1A~#g=>#@zWw725I4^#@3^$>LTEN zz;3~DA}5aG_x?U`mx%lV3Q<+s4H&e^?xIPgvA{n8UjeE(@ytT}e%mqY_Wo5w4y!5Q z?(?M1uz|*E)Kzu9sy4(*ngbo#8&eeD-zqi!(Q$nsOq|+j`Fp{bqHmS zP>;WtwW_)#cK@#SwrF!CLW|a{sp>LSeWR!Yb2>b=LZHX*va(iHmvwjlLxHl8IxVt$ zs=65XTi`Pk@&>jX-R^Z)j!;ZHg@QlhW6J6OQ$*}it-L=pB(030tU6MQJYQ8k8~7Y> z17@n(BBW52Jd``l+Ja2mmiTDi1N`%tOUR!(g+$09mini7p}+5I8HA5 zik)wWkG!Ps&3fhWg)zlW+kW7ez*E4>QA*sdvy^fo-l8l8z@n>;Q`L`PYTp-O%AwAr z>pX%b3JUjG{CwOcW6$w0EG}4a1ej{5*MaAObs};w*49pfT#hJf0kE*D6U>BD(d%ab z3ovzw=KynniI_z!NumR@&FXewGiG{r1F$n5vuh!`85Xhpun>SaV!|L@l|ZZNNti{f zvw#`EOyD$(P>cu00@av;R!dfZNyr?<9HrZgIZ$&i=2W#^z Date: Mon, 12 Aug 2024 12:21:28 -0500 Subject: [PATCH 237/375] devop: add immutable zkevm network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../networks/icons/immutable-zkevm.png | Bin 0 -> 17843 bytes .../ethereum/networks/immutable-zkevm.ts | 26 ++++++++++++++++++ .../src/providers/ethereum/networks/index.ts | 2 ++ packages/types/src/networks.ts | 2 ++ 6 files changed, 32 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/immutable-zkevm.png create mode 100644 packages/extension/src/providers/ethereum/networks/immutable-zkevm.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..6cfc361f0 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.ImmutableZkevm]: "immutable-zkevm", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..f74b76f68 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.ImmutableZkevm]: "https://explorer.immutable.com/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/networks/icons/immutable-zkevm.png b/packages/extension/src/providers/ethereum/networks/icons/immutable-zkevm.png new file mode 100644 index 0000000000000000000000000000000000000000..90f00f09629b228812234deca0c500e9800c95ec GIT binary patch literal 17843 zcmcFq^-~tU!_C?ym3W`$xP# zWRl&TWG2r{l4rBK(aMT4Sm7AmO<003eCYpDMz0Ht#_xc_yCR$>Zb06;?` z#HH_5lEQ4glcL7yuB+1OSMgaynIn{xg6~c+k`k!VR-h;bMXA*m1`A>v8F3Q#4!P0t!=@aCMq zyr>9s3#-lh+hykE9cDcWB_;}R8~7h}-*umPZvi7PNx95NVAK--Z-ZD0GyrHCk7g(+ z0)k21cH??dj|vb+hloo=A$~+MZ?2)V8WTLENCSdYMJOVdc4X;E ztp!C0+y7hGuy>(IG6<$CYP~*8;SP|3kQxPC@$>2%eLdP+o`F)CU>@R@OXRr?kUPMA z;IkQS8NGpLh{|$kHh|KfoBscZaL}Qcs@6gm-@ZHgAS(&T>>_2=-6uXVATeY@K_nDm zZ9KY#AC(go9M)ZzHVI_+WbIzA-!|v#v_pPn0?a@CrPiY?q&qCemFYe?E&BOU)=~Ii zKL#R@;cK~A~uTc=dPB3W5T>{{gx$)$Kr>xVSXnY9ETIO-B}2Wm`v-xBZWClX>>)6x$s^!6dZEHlOYbi=>LpB+f(r>;w^+ zRh8VP)pat2+NO;*?ybGuu5>pt;Uu*|S6g3cR{wb^^*YCxYck?0Jy!5^MBJsOurDzqQxy;J9>z*r*i68N3Znx2 z`8~+)(&jP83A1mklSJEB>0d@T1VoLX3dB@6+(3* z^j2=*i(V@GX(=Z}DMKFi~U8U)&z>PG6u8U}S3 zweV$Oah0Z?mnxL)v9S=! zruOG<^}7?k`(sf(rcF=AfsP&xLL}HM)0b?mlwhEW~cVh{BEhvR?ayZpK@dQdB zF4$qwVhn|Ucl_Ws2fXV#1Jb^xzd!9Xo!8)n2tsH^038Pv%xpvdrhFcQmu(P9Ln6X~ z;-${_!^C}FdNmF?1!8C|_wp2b#MGO7z#;*}+qXn{N28O=Yc6v(OU~2s zKUH9K*zxj=T*(&M!GLGdNfE=J$r^fz76lv5=hGkpbQd?bAROKm5H%p`6R7@qzpr^@ z+*N=8A3fP(w92SiDXe_4lN12A4qnukS@u|xZH)Zw>a?qO?YAzbQW9JaulsuuMQ!#l z;(BVL0`p#(&G7ywYqgTjw)K|Vjj4Q78}UIy9#{(dCF8g8m{2#MtiC6|z}0+kfAr?b zvH9z~xh43fcD-ESys52i36td#qNPZzpJv{)6S`-xC&Zdps;)(9CT)^_e3Jz6k%4RJ zCABh-a{aN(N8#+O(J~3z-)Am0b6+;Fx6GSN$t4@w=yBairIQuaslWMW(9ry}=MDyj z8(^tAAG`DGZ2J?45sV+mrCa=prHuO3Y8Wvfh6*WX;Qv=fO;Cb^nHw{G@J3^Bdho%2 z_r7eA<>ZD`m6@U6x&)>BO?4RFl&CFtU@Z$L3=Dh=9&I&@bV%fA02UY%To3l@w*&;Q zB{2uwkPYe1QyoERK6NGzSoX1NTb9rvR5=KS7Grg9D!9)f(MWQgUhAGYkpRp2DRuTtHnXk5y8N zR7*)N^GJGI_vJb^j0{4KFKC?RVGaQM=868(kIgC9=hJH6@Hg%%$n8EoK*u79sttdq zOHD)~c#Oe+)m_a(+*mRJZDbf_HVpa}BppJ|nOUTI{3^!PJX-xIbt^Kx0@353)q5VL zfZ=YfQZj#5emA}OkNEl>5}Od|rAKdsJ(2#^9s#oISx`a|qWw1Pe5`Q}r`5kOeSf}YYA|1fo3u-3CEW1M8nN#~TX9MFLSnJ!)UiOa{*d@XW|hq-nKdN<4~1dXGS z#buYZvNT7cN(12Uzj-?U;vpXsN`0~K>FU_D2BIM}knhRb263oDhc-tra;;WY6a&r- zQ}h(qBre;^5@;fTbK_z_akon_S~K6_MBoMg!6V0o`H1%AZxj%6RI8CUfJyc?W5qWo>7*Y{xJ{>GP)s2fgT*9oJ)ablfOH+8wX1)kQ@^tieY`wR zPJ(jq@X3o$d`C-+$d!urfBNgraM1P<8SASsi zvd^NlIFBhRQpL_@4kvgk;kAZtnq(Lr*yUnjH77owZ3M3|?5aH;`Ygz}H2OPVFYD^g zQJ4%_+m-{J`dWH6s97C-v)?MG>01e1*@uH&bdMJYeQ|pZYMxl)~d;x!i=WF*#rdlTh{p@`I|tuUI;KhEKXth*9qfwn%C{zetu*C>}q4 z%l7-H2R0bk{Xm_4JC+2HxAZIRtR#g3#DD*6lOe#B1(;$+e+l4_)tYYVys4JTpRHpG zaW}6Qxwd=qpXKJzd*FjQC?|r0NN<)wxdUSyqk^NBhR9loojQZBYJQ1-td%{A=z=1W z#bbaB13kPnNw~UFQJ%gBsTQ*9GVoBhgj({E+Y{cu_lteCMK~o>SHBrjT`}1R+-edj zK4SyPvlX}PU$)%7KQckRk3C<-6k&GXT<^s?BoypP&IrV4RT%*lJDNiN4xeSm7$Tu^ zj>mnXC)3Ef(M1fViy!J92ZV?WU$%Z2t+y=GF1zM0#$|nA)P5+K5I|gR0W@sdS*@1)FGF5%dxF_xi9oZhsa58-90s1HSJWAqbe$rZun4jMc{yDaC z;q8#u3F^=iRla*HH+f@ku3ANTRIaz5^+C48?Blnjw}+>)wSWk0(Pv0wCKzuxKx z3^0!8q~sQ;G;!MJZmz)wQtfu4to zpMy!JEp>l|Ce$9OfP?1f*ZV~(^9;^A=$1@5#m0CkKi2z2RLTN^4c=ae1a~qy=}B{{ zS})8W+TMC8)#Jdy)2o-$K}&CXZUfxcOzAja0i>k&7-4VsKO|&^1wynxMH+GDL2vrc zS{CjPFDbN=-C9q^T7sWvRB3r%i#^h>JSSwRquU2A+7c56~jWu+W(r{ zM^H|eVKI9J=!(lW3zELWcHaJ`L{U%}9^*@Ri1h(~lne0Wzgt_BkG?YLoo1erbN}+* zQ?|g}p;)36mP<0yAZj*-BGZVO+ndyZCN=u(`b3>X+w(E!6Gzdf1Y1t8M~c=V-@dVN ztondR^Wg4FohLC+V=swx85m;LhGY1HC|0945i`|l1jAA1`G(wAeuN|{e62n#IxL#5 zp4lUCLJ2Cm6N*(WQbVXyfD>>THyEr^*m+ou4}`?^HvM;H3U_*8h!ClIRItc*YFrzM z1}N<>OJBSK>3(tv{fj~CoTiCA{NSmuE0-VB^X2dY*PX-~iQ%&Z6)n0dP+*~f=g;0$O7Ntw79-3rB*%7E_i_C! zTXJ=mcc47#V#7$+CtcXy;Fp?J=fn{boK2f2E2&SYu#i|x;nsi6t!(GIy)pr-8XszW zfAv1Yj37#5kD@z%!e@_FA&5i;toT}3dQwc3+3dgt%PJGzsy`KHUgFPxbCh0h0`Z-D zU&P%7=0b!*=~mqG?E0QJ#6&EA;=^p~jB2QI^W{gCGG4#5$ig#%d3#;}vo{lnRBnkC zwWfC&Z&?m-q&=NmwdPH(h$@j>YlbCSx+k{fBCAfi^SP|ku}AX8gd(Ze$MDb8%ET@J zwH|yX-I%}!J;7*{#T#5+`-)Nx(R^)-1Kvi|QXXzu%Gnl1k4BJKP%A58|KLE{1U1B^k|d(9cc z@8cJy&Gt|wAu;~z!f7|fBsCbh>sd_`>mOEbyp;^z|IT}=c8P?kB}^pe%TnKL=y=v# zc<;3*5BNkZxz^6In-xsFy|R;`k+m$j&IzBYra_AEND*Fsj$6G9f$R;n#~9_uvb#FH z5{=&L?^|3|dW@(`8%5x@@6IE5D@FHTITjcU!aE_8r$s2qn3Ftpg5>Co1Vuh|6k{U{ z7GDw}ZL)w+Xf}iJ#Sam5${s9m?hYdV0R7iT=c%vB!r2nch?@d?NG{146fjILIh}G)4B*Mb+hU(Gj9RE6@>*J!AeTdXB-OQhky6$i* z5DOHrf`S9imufVR(s{)o<&*U&beyzm^r=J;p~rt|CF~^2&F1`Nw1*^}NSAT45qXg? zxndCoMa2XhkqS(aB)=yhtiQZ(Wa)NYTYc_`B&(1LTaL=qX>UCR8^eV5{J5Ol%UuFm6ClvB z`~;jyY&;H5stZX=wVYy)g`@%RY(mE+(SweGVpIqmux%5l`xA|Lzl_EIJkZ}C!EAa~ zT<^_Ss!V@kj@m=ywyu_{iD;}NhPoAw?VO+{9E!C9rIJJVPV{mVX2!64KKpT0V_QQ8 zwXpC@8(yMmg=)N4TkJtoT5h}03wZI9_fi9i*j&`lxUB{PTva&}D%zoVrCL)JC&l=d zG(=TC-Mr?SpB%2#g1*}nN_%|1Q^o_WTT+Sfu!JZ>sZV$?)HsoQa^5Bd_)MC`+GrZ$ z*`$c19ArFmQq(`YQ_>7gwZv<>?TqnvM{M|i`;{9mdaeVaTmA&ON6!$Z5DJ^o)%ngF zeg>mkThFvem@*=rUj3>XZM~`8Ci6HocNSqE86|Y&BOsa2_Bj(4hi<6nZct8H_TFL(yuMd~Ez(@fnCBSmlObc4ZJ5Db* zrNA&&&xcY-&>sb0e;n{IU2*Y~u3g~E_~Kfeil_y(Tv3l9760K68QEDL?8p8}lu<_T zg+35<-B|6L_({NPN92&*$|}OIRBUgcFpXF+mf_VzXR!$$$P<6E;DX5Zr%Oy6U*{RH7r6x?F}Z7=(kRj@O(bk-}( zXq@9=XW~W?)2{u-?pLvSJA%;H+iY0*hyTQ^eW_~ngakJyp|P3IdQa3)%l`2Wnj&>hKcuS7$D%H% zODvLj6pX+|2g(Q`4T2W}obHqiA0t+52Y&1VqFMThfXLBdJW=Kp!W*o_B4XBHTr`5z zL;k$aUVuW$55QKy+j%;QKC!1`$#jD;kZ2r@{W><0-;*%R9RjGnTSLKCUNa@yrA98! zkqD3v(KH7rP!>ilmb~3hw=Lq=F05@E3AT@T$G9{d)ZvGE&{w+VCVKW(}2Zvvu0eTNaKwc~Bg$dChOJ z#^Qg|^BeteVL2>?F;Khy?VA<0w`mK^0kQXw3a>p9AgwtZk)2e{x%7EzDhVYz0=cYg zLD9=n9vU?wQ19U$I*n${`?rg$6eFi~5@jesuC&SnMjPi96>eF`B3FbAAa-ss@b=_P z$!h|-x8UJBH_7kZXVv#8QW>GEr%o9vV08%Fh~VyPm7`&jM-|g?x3Z1OlwdG?E0kCA z`k}}lt}dQ#iBeA;0xmDnLSL}{d%Ga72`Ek}VvwYDt6+hTsjW3qO6g&c88If(;O8Pf z2L>FTf*Dg)4T}=r+sEI*;DXg18&*^PODcH3)8#@abIOkw#3ca*`O6+9bdGO-2gtTQ z59y8`bfjiqhQ;n{a$BAECdy53)R=j%5ROq{&8b3u?z_T5KoV*hvUlYz)CZ}U29bru38L<8EC!~cG=$~pD$ju+848Gtp& zfvUjF+ipC}Jm|aApF2*+r3ys^2pAxF$5|BzKo0_G%6cJP>?Io2Gle2?6(CM0{t5|4 zf%JobOY`i$lWO@y>><|A>6E@`AzUt*K2ug>?MDPDtw|B$rQ_kyysO8-n91F|8-;j) z61DP2j&q&C!@B&7418KOz5AStr9E=zEEq!I@8wHt#~{GZIbl(O*R7WFeR%0oIZKIH zI{Q3I&cj3K3g`Y$ed!=W21X0`55zy2-RCp(hLpyw>J$ua-noA3C$Vg;Ee}u_ldpTrh9Ns5FroSC9gIcXj-g#m<1S|JydMg|7b*zq(gxNUtI z<_)e6`YH#?U+r4|aw4Mb`;}x_O8q_7<*O?MC*1!=2ub_JjSO%};7kSq$!%TTCHGgZX9G_SF;mqY+$CM)BbKzK&cT z!kkv0=3n`4EAvC{^Wl3r>kN(Wg1cCDNCHhsD52i#6-n$2rVf-(#jz!KX0@2GN}MM9 z;U=Dd=j25j)EYdZ>Q7ByOp&6He1VmjcjTKrpQQLs8R-{#s={fo@!@D19sLvsgl9d< z_pQdYEqWX{r)12b%Asn{9A_Z3&sxVDsORQYvQ{Tw}bzMg#PD0NjUT9nnws^qZRi7T38nnYHghY8)focvZ zy)JcTaLTLy_l0?5W2P}z0+70!rKNr6vsU#boS-mq?)Y}H8*S)MDl@0guh>RYe*5Cf zYaaBBF?Hp+kG<#EN9w|KJ;&CH zdRD*>T8d}D!-B=DJ@ngBl2%{sd;$Et^Ku#=&8TEE?@08C+$7}-I-$RQ@W7K-N3hb*R$$2NxWhwMY)QT{>b4ro-2A-j*O97{ zo0!IEAPTpj_op!LC-B7x{kANRouL?9LdrOLFSxg9}x!@}q-n*N$fdZBr`zf#7G&+aeY*We(g zq6>E0^`c$1NhrpKRz)r)c43pPbc05F(il_80t+kr-~5j-;srcRyC&%+tjwx%ZPzts>Uc&4iqwmTAK^>H82{P# zQft#ER6>pjO}(ey^4zmL;LBiQu5B0wiKP*Ee9#(;&O!a-Q#4}5>?#(Yq8^E|DuJlL zRWc6{WxD_c7hndQfDDYFi9)o#A*b23od+BWsk6Zcc@yTE2;hjot!~?_`^vkV$Y$o= zum8oU{!2)pjeOan#OMJu1vbD0wlTCEI46YS77B>g*m;}$l9er{*&M5V_GWuC4y%ul zVB=iGKckXz+%B@Zu)geK8-wtOy2&iYd@+$o_jDFIp4+;(nUqFp46jPLHF=Vno{*q= z<6DnSa?J6+do7ni7>zvCp!TKgGN+ZIme!XoXg%Euy^KvwMMAXui zKB&Te4;qi)7Psv?FU(~nf=d4bzDE@gqu||4t#MpKBHaLbL6oKW&2i_jRVr?V6%`4U zr3Eo4GfY;-2F03SNsPtDI>OtQy-SC~Ut;+_lD_9Z9wpd zF0z(UT}(I~%jS$s-+>tR=Q8W~xd5jKwO{FEzX+HoAHy@2S?>A$jxZ!Kn9dfpPGVsD zme0rU67?6FGf1*0AB0(WenTJW3K2e~{^Z zJ*Y4?Fo&*0yNM{`A(tLBelV!=csn@I(urBI8z<^+cCW&ajLZ!GV=VC{`l9K!To8*2 z$u?-=4|% zJOv(|hYSL+)-s^c>E-G*mVU4IvA3v!8O2wPsJSwh~+b_yi_QQ!s(28Dpm$8>Lq z3fKj<%6=oR)>Ld>;*xaCzt<)*q)JNTN8TesW9$b|rz$mec3sr0M{f%Cdy=~TyWjXh zwX$rcKx{}wpejfZ>OvQf2nv%VioIqR^$!&TXvA3 zT|3G`gt<&;O}@p;z~LVydYHpBHusA$|7zwxb)AFI&eaiS!{ZbUS=(8{KUp8!t)`^8CTrP&J#wYhhbM>i1b%st3wA@;UZiSrd1f;IY)?tpOUODMlhTu?BY%2-%_S+k+)5ba zbfj!CL0miYAq#G4IxBjIi)*?q;wb2$Lu6))NN2Xx@z0%B9ANw=KsfMU^XGw%D=~Oug%u4 zAdrEbhMBahh?>N{0F#8m-`_k@CD)#=r+G!>w`EPbZ3>JnY`IzAE-N%zT-K2Nv5>gp zr!h$nQG_;|5o#2_VL`Q`$e0`z&h11zyBrgh#ur^Nk+`sg3)4k+q=x&yu{ayuUnXZP#9GduD`ruLm*r`v6SsQYMFw!- zRbl>RGt{7VGOT~j zQpmkg!Co6#ysxgy9?hkyX%ua+HJXI66_L)daJfTE*pHnnzDg%!kEk#LMEavhMai2Z25n9FoanKXWnvm#`+AZa+IqSi3P%XJhl8^Q6nf}QG97K{3>W7mOlf{EYOwK%FlsozmsX#PGvi|)W_)Abzs z2m3$xE*9Ei=HH(y@mZtLEH+k=7?Y9x-Idqxao=m`AmQ+PI2MEOkInRmX78U|f@&w1|B@$@J%>y_R`NDE zi8TG}NR0WUT1cG+Fz>P1_BH&RZcTe1ni9;ywG3Hv`ZXhL-(D?) zn^Zjy=(&0gI9++iyl`Q9R zrhkK$uum{3aNM3G+z|k(KoZ|Mq;;ci5FSJaCRHjVQ0MFv=x-@3X9C#IYst~D9=Ra- z_+zBFZ~oR>ho}@|K;z|=$3ex1r!H`nOR^{4OFa=#k$8VCm)8@8gnxAAT&Zft344&t zF3IlPN5UHh;JP11Y_l!_$ zhDbE?ZEGV04RKf4e;+&PVn(bgfG>`M;k};F(<2G6NFIA z5~WAMC%!!bB+`8r;To*P9w#vJc+Y+rk$l3_G83Gb1;a8|xv)-1!(6M+ivS-NGUZDt z$%6Adl1pu7bFkVGI}(vv2P-#ufub`8EjL)Dm=6@W0;$=*v%eF%@d~Dcb{P= zw3+akfH(?`p};f=XIS4`P@A<&61xFopzeP8C&Xv+UiZLK?WI&aj>+7weih z_tQr=fAia5y-u}cbhJ6?x1AN%2oJH{d7d#s^Q1_cuIm;QImsj-N7K(HZh1ujK1#s$ zM|jd?gx?Gr_`EMXj<-A$^{AVL|8g5+|Bvp`{$u@x=aVwWR?XX;B&4hfmFgi174h;j`Cy z)hL2#j*l@`5leK&roa)}x(#r4b2xp|!sfdu_EUlGCid^L_z^Z5%|H8+Ty0=Ly zY&z++Qez$so7citp3qN{SlX}8`Ffq{bfGQ&_dE7_aD&&zB$EGfaAtiRL-A(BnT*>a z{SPL2mUe~h1x2N5b=*KEYd#ixX(v>IDk!BiB_Q1RVgHBQ0CmmmwWMBiStY~!N}U}O zD$In3<&)rAFos_8!i~wCj{a=~LbG_0F(OT7yX&Oxn^ZhLO81$glrb~LgreLqQD~b4 z0S%BkuW?~zn)yPVOW!pN7zRP;`C2+X>RM+d-HLz#Zz%4y#1e_Xg&H**hHKx(JTUfe z)K@Vh9g8crN}PkU`J3u@v)?cq20o1{e*I!yVE9g1yx8N1)GB)d`zYhvtOIKV7L)<9 zQIS&E2H_LC`;N!52tnXjHL;Jgem*L3AJ>{qzh0ZDFcn7y8#u2tNME}Z(uVKk*Cu>S zso~;FE>zh4x$K&UKG&(QNX@}ih-5mK_l%&leq&u|>?9QEB;*cI?!QPOPn&=F*r;(C zhYSM?%a6HZ;>89&4jGZOr;m@~c4r$5x*`7P*FpgGB=pIh`qME_NJ}S|+94_F2F}~1 zlc3W1m@AhO2&j6^k@C*go+MqeYQxrRzp>ZX!7ke`>F6 zhUsQY1RQH|n@vLCQ-tyd(4oL0qT*rDFG%;4#e9d0Je)sS>Q`US9WE=N$%af05QPsh zUFTgB%Jw|ahUba$NeJViLHFtFsC}!dD?E&KS`)OKi?s&w34%bjoD@FX^kpG!Jk@tu zd&}Ux`A|_`l1!Gm7s5LEXgr&tVhrpu#%=bf`px7Zvdc#5Zqw!VIu&Z~( zr4@p@qD2_ub*Pr2=*suRY*&HCr<6U(j|0{jLMoJtx#P!Q&pOii1xI7}kv9E}Us+L6 zXI?DPg9iiE$YUB>-`$S%KIJ&0E(LMIw%%WUIg0c7kSKCIhNR`g#lB?lebeUPglY*F z2`Sp(^cw7cC*I5w%IsfowXPJgPx`A-QFIyQzQ7IlR z5x69S&ccDwef4{Bjab(f;^{H;7@h_SQkEw7dvtHj<(~SW<1x%2Odjh0wo%RkWFXn_ z;C*q+Rz)659?$B!)$%+IIM-Ex0{a8D?ap{gf8wSNBw>_tkX7R(HbXsf7oHzUb;x^~;dch|((6r%c-Mj8v z;v{iYAz{*qJh9uQT1nnAGdnxSmCWOsT2#TIY-g_>?jiO~#|#S}Pk0lLv9~Z7-Kq;x zVREegf9Nz^SY;zL=pBxB&UW+3S+DrrJn{a}Eb71h#UnvA#w0oTCo{yiFT9vMSzEW6 zLm6DH=5F8EoO50?Pu%BsM{(66RS94if!gUHL{o6vKcy6r5OCf^7CJ$QT84v=GA^s+x%K`oiZ+U^>SKvAGL$wh z|7vkm;nb*$X(QP6!-sqi zM?^UP7h-+2%bKo|eFKM5f)Ye&qmgJvqIrtI>~X~pRDDk5oBMhQu}j5a=`0^)cNM1k zdc4>H-wV5P?@%E$GhTy~+LIc_?GK==TZfpxbq@ng?jQ#0f8 z-|``+vlKOK{mhUeZtuPevjsm za9RD~gyy8^GDQBVbUMrZE$hB~as8;s^zH2w@dRiI!h%*rUP?Q6S(+kt+?Qo_D|$o4 z@z%x0CVy?b2({6T`*;oit(2H`c(@{Q$r5e+57l7T%$LU)v3)$ioh8L z@#*9CYh6&X*WT~-gxdY+7*kwfjrN^vMg$ad`V48+d0gk&dkVBw3SWmzd}cSSwObzQ z-yq1Xma$`qCcvj(J&g@uDzrve`s&KsA>e0wN9OivE3QF&!PWUh$h-vC@>=vKx{M~_(AH8ad*GmsK{HYg}HdjFrw zqWSYRhO19{bMy7UqvFBMU-OKd)Hx(K0yOXpptAbr2oESIe28%!Y|rl_6VXxBdbG~> zcBLhLNCpGAGlnJOa<3+%@?D>3&2;k6kMi`@3OE#Gn+6TCv5$Njz8UoaSr2QCm@SzeU{gC)OcAY09PQB}$Mtp+BP^_NLZVBmSeU zkDQl<8{j6vH5U>9BX!yu-(+cX0zpuZ;gf`7{YINvh0nF@qG`M^+g2+3{lhzt0k5Jo zd~P3}v`mVEqEG1}cfM6)G%zVj0cP0s+AcGDz(ih9wH*Z8e7r=SW?vnZWP_79ivERhu74)4qWm`9)8f)$WM|DM7X5F8soQFV(^`QDym1 zM{T|e04W`#H1_jaZg-WMySk$0GH#>3Uh)LaDZ)}k1TI-9iN~2ZV?`=KKb#=(#h_}o zSAEGnD`|kMp22Hoh6JI$K|w|rAr*opZj#9CaIc71(J44$20(cg$o8@V8>cG12jMFp zwLw2QK(6<%LU)8&e*D$&KB`|px!h$>_|J_c!IP1T{tvdeRD2l73>`M=FZ%4;sG+`s zTiZ}#(NwVGP)7OJCLzmNKn@I(o8NG*3SKUp<*F)ygWN;OE9=UaZ%H6>6(&@sXhlaBoHoi9= z(=SI$nM2p-<;7$SHl?a?e0Wd=77-!XuJanoD{9CVpMw#W4!@+fZ*}3MaB?)FPIeGV zel|wz^54GIT+l(@JMhocpvhH5JS($)yF7gf=TNp0qU@wjWtv_P$9BIQzQH;0nbt06)?{g@ z|0@l1{M#UV=8{ZC{#Y_kN_;8v96$a5abco`+5rf-O2qQ0Yb=n zdj)c;3yG>hu&`g}Qt2g{5}^t72fvGqM?|{En&ES%L7`Fp?-qkdl$8%jwFpzpzmire z8RTLwLwb*bd0{d{mE z$QZ2%LtHk-Rol}WFMfkJ=3LrmfS*XrcS%8k_x0Ln0P#x2Y@3~IGS6QWV`Nl82 zddF9`*%M|n73HMTD4KxkAd;TrZ0}#U&EQ?^W8^dc6<&$#e^|w|El^BTsm<=D_vWBD z;l0QNk@nyEz71?E+O6WZxx>GLVBcqkW9`6_-ER3>+O68Pf*KQau<0d9e($G9oaj%u zIL54_&+qJ@L!9-CRRJeYQNQ)}Mqo-tir0%%&tnW<;%ui35b)&<13D%oD8w!HZ99QU zZu%FcR>vVw8T_c^pJ!Qj^eNEy#(lGnRoIs^dlqGUi^K~8hEH{Z1N$PFz9IWM#AzjE zSj}nSzPYbS#@;6tScDkXj0(*XQ3&pCG`P|m16CSS#yGjrC9|`LT$jI7W<`EGn*M#; zvePEY`wxyK2sI+Sg}$%;13KE_>~O@%%tdB6D$~Ge*~=%h)BUo@K&>*lOy|R@M1u&_ z&IM7(>^s6v~3r}Jwg)Ek^ohrY@L#Zp|A*YYQXz-aQ zV zO^!Rv;9lL8wq@|alqi9-5@DU0%9G?|cl~7K;U>~B$BuSHm#7nEp@(_2CSttq~(qt*ScrZC6-;> zs1nH2BVToocgg0&d%aa|Mt8nEe5%woZ=b4*&ZT2bYtMKvC0boy;K*?$?%VA-#U|Z( z2RCm2@yofq%|+H@LfNfHXZR+rz3Ws~{WspanQ?iB^LV*8cQwrJH9Ek2K1)32ZpyvI65HR)3T-N?atb~dAaZ?g@%yjWnRsu?q@*a!FM8+2 z7QVyudsJ$q^a&&Fm!9XP&sl^drc}Ssil}(SwDE|a{tr=4zt(Eq2^W6)ztr9QxzCuX zkjJEL`Kq(2RabkirB|3;XO%tt%%AyFW9rLWD)ryrNC|kJ$apa$-_GjNqT<%P$0t7D zD*JWp?S`9|8)mTXYC5yN`nlbNKptL)j*Dk2rztXAUu8mGOwPMBanJ9+?z+xKCQ{MN&BvtGY<5oTn`+&n z&6TDX^L2(B?|}(0}u)=LzMXsbFjb9>!hGuz#j$tg@SA69q&tNm`J zuvCI8>9uli%Np75OFW#v?%)W%Ka zb{(rJEDIJ%bg+iJ|2pjjkLJXp7yNm(DbI~gS%_W^p1Awp!7rs1PODxmbadV}W!F5p zIkOj}Pu+4Qz+mHnf^u4%`|UO_QmvAUQh^kMk%5tk zu7QQFfn|u1p_PH9m7$Tgfq|8QfxP{}KPVb<^HVa@Dls(}7(+C$>@Ug!YGCkm^>bP0 Hl+XkKu`~p_ literal 0 HcmV?d00001 diff --git a/packages/extension/src/providers/ethereum/networks/immutable-zkevm.ts b/packages/extension/src/providers/ethereum/networks/immutable-zkevm.ts new file mode 100644 index 000000000..aead4468e --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/immutable-zkevm.ts @@ -0,0 +1,26 @@ +import { NetworkNames, CoingeckoPlatform } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import { EtherscanActivity } from "../libs/activity-handlers"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +const immutableZkEvmOptions: EvmNetworkOptions = { + name: NetworkNames.ImmutableZkevm, + name_long: "Immutable zkEVM", + homePage: "https://www.immutable.com/products/immutable-zkevm", + blockExplorerTX: "https://explorer.immutable.com/tx/[[txHash]]", + blockExplorerAddr: "https://explorer.immutable.com/address/[[address]]", + chainID: "0x343b", + isTestNetwork: false, + currencyName: "IMX", + currencyNameLong: "Immutable X", + node: "https://rpc.immutable.com", + icon: require("./icons/immutable-zkevm.png"), + coingeckoPlatform: CoingeckoPlatform.ImmutableZkevm, + NFTHandler: shNFTHandler, + activityHandler: wrapActivityHandler(EtherscanActivity), +}; + +const immutableZkEvm = new EvmNetwork(immutableZkEvmOptions); + +export default immutableZkEvm; diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..e9640662a 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import immutableZkevmNode from "./immutable-zkevm"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + immutableZkevm: immutableZkevmNode, }; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..888319fbd 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + ImmutableZkevm = "ImmutableZkevm", } export enum CoingeckoPlatform { @@ -123,4 +124,5 @@ export enum CoingeckoPlatform { Blast = "blast", Sanko = "sanko", Degen = "degen", + ImmutableZkevm = "immutable", } From 9a56c446c456482e8254be4c1e0e2d9800e20302 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 12 Aug 2024 12:25:04 -0500 Subject: [PATCH 238/375] chore: cleanup public keyring --- .../src/libs/keyring/public-keyring.ts | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index dd44fa074..d882e0448 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -90,26 +90,6 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; - allKeys["0x9a991382cbbcf03a7a8f59277478152f2c81f4d1"] = { - address: "0x9a991382cbbcf03a7a8f59277478152f2c81f4d1", - basePath: "m/44'/60'/0'/0", - name: "fake godwoken account #5", - pathIndex: 0, - publicKey: "0x0", - signerType: SignerType.secp256k1, - walletType: WalletType.mnemonic, - isHardware: false, - }; - allKeys["0x51f6749dee3510f983c15b7c239cc6df4e4054ea"] = { - address: "0x51f6749dee3510f983c15b7c239cc6df4e4054ea", - basePath: "m/44'/60'/0'/0", - name: "fake godwoken account #6", - pathIndex: 0, - publicKey: "0x0", - signerType: SignerType.secp256k1, - walletType: WalletType.mnemonic, - isHardware: false, - }; } return allKeys; } From 3adf948fcbe1519bc257e67b012f1b5bc5cc68fa Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 12 Aug 2024 12:26:08 -0500 Subject: [PATCH 239/375] chore: cleanup public keyring (again) --- .../extension/src/libs/keyring/public-keyring.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index d882e0448..c9a2048e8 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -77,19 +77,6 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; - allKeys[ - "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y" - ] = { - address: - "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y", - basePath: "m/49'/2'/0'/1", - name: "fake ltc account #4", - pathIndex: 0, - publicKey: "0x0", - signerType: SignerType.secp256k1btc, - walletType: WalletType.mnemonic, - isHardware: false, - }; } return allKeys; } From 90b311ad5e51874065a6a24d5f71591bdf6b9719 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 12 Aug 2024 12:26:57 -0500 Subject: [PATCH 240/375] chore: cleanup public keyring --- packages/extension/src/libs/keyring/public-keyring.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index efb4a2307..c9a2048e8 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -64,16 +64,6 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; - allKeys["0x4eb92ac9bae0d94ff5cbe17bbf7efccb9e303020"] = { - address: "0x4eb92ac9bae0d94ff5cbe17bbf7efccb9e303020", - basePath: "//", - name: "fake forma account #5", - pathIndex: 0, - publicKey: "0x0", - signerType: SignerType.secp256k1, - walletType: WalletType.mnemonic, - isHardware: false, - }; allKeys[ "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y" ] = { From 038fec6090829b22db483c800d7701b36f74285b Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 12 Aug 2024 14:26:48 -0500 Subject: [PATCH 241/375] devop: add linea network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../libs/assets-handlers/assetinfo-mew.ts | 4 +++ .../libs/assets-handlers/token-lists.ts | 1 + .../assets-handlers/types/tokenbalance-mew.ts | 3 +- .../ethereum/networks/icons/linea.png | Bin 0 -> 3997 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ .../src/providers/ethereum/networks/linea.ts | 28 ++++++++++++++++++ packages/types/src/networks.ts | 2 ++ 9 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/linea.png create mode 100644 packages/extension/src/providers/ethereum/networks/linea.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..dc5e7e607 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Linea]: "linea", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..b93fd2772 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.Linea]: "https://api.lineascan.build/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..0f20fd3d3 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -135,6 +135,10 @@ const supportedNetworks: Record = { tbName: "degen", cgPlatform: CoingeckoPlatform.Degen, }, + [NetworkNames.Linea]: { + tbName: "linea", + cgPlatform: CoingeckoPlatform.Linea, + }, }; const getTokens = ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..6835c4ad1 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -30,6 +30,7 @@ const TokenList: Record = { [NetworkNames.Blast]: `https://tokens.coingecko.com/${CoingeckoPlatform.Blast}/all.json`, [NetworkNames.Sanko]: `https://tokens.coingecko.com/${CoingeckoPlatform.Sanko}/all.json`, [NetworkNames.Degen]: `https://tokens.coingecko.com/${CoingeckoPlatform.Degen}/all.json`, + [NetworkNames.Linea]: `https://tokens.coingecko.com/${CoingeckoPlatform.Linea}/all.json`, }; const getKnownNetworkTokens = async ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..8479c3375 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -52,4 +52,5 @@ export type SupportedNetworkNames = | NetworkNames.Rollux | NetworkNames.Sanko | NetworkNames.Degen - | NetworkNames.Blast; + | NetworkNames.Blast + | NetworkNames.Linea; diff --git a/packages/extension/src/providers/ethereum/networks/icons/linea.png b/packages/extension/src/providers/ethereum/networks/icons/linea.png new file mode 100644 index 0000000000000000000000000000000000000000..2be7f7cd4eee87ff02183a9ef06f0b40023a8934 GIT binary patch literal 3997 zcmV;O4`T3%P) ze~cYf6~{j_^IEno+p;9x{)6D6wTVCK651vbjDk`Ff=HSal*B*`i8diIMnfOVR0ZszPfVY4l;5aZ=<(>sV0b%snF>qR4fI1-VGDIcmVpJVr4DD_J($Y=RF9bdXTnBs__$aZ`O(Y3$i0eCD zz11|IrU9A=fFrztSx1Wm zlEhyJJcCxONxHP~RuNv0LHJY}LkZXw)k)xB4FS-u(RB42faj@HYPHtY2_l}sJoZ9V z$LZ>y8zfu67pWv(T2ec=_C~zIe&9<+{gWOr(=ds@40wvlR?~^CeKuaftl!f>|1`SE z9L!d~6nFqV@sbDPXEKB$@L;49$f!3+y8AbXl~L_+DlcNz{Z(MSp{LA@4GPicB48VF zg-c|kk8e~$DhG={iF9S^t|Q?PSD+vGC%S@pbNBU%sh7j(@ez>@JFZJGr(JIc-bYs~ z`B-FSs)&x>k93#RXWPT&(44j-y=HRi5W5&-0Y)y2^2!H18q0J``~vOXubV64Y^sBYC-R`L64#LZL9@ zZ^R%{G6vE4&WM*e1(D`rH3hTWURBxagvb=%=&Boh-8<==RoSMfh{gy{ZZ;5)?JGz~Jh|21sOSFY=p|6a9fmAd!dd)5B^ z`_lb9UR6Ng9 zfLgwMx!S&cyBZ%KS4o6nsKPLua{S1VBWmNujpb`KXauq_bv)w6eYETi8Z-ilBEAfC(S$*v zxD|=#=hpQL`8V8fgPNF_D7*M-Eqyu!L7+;dl2S^k-Me?I#fulG(H#gU+as=0^8#|A ztD_s_Hn<~wet&poUSV8w6f=1Ag#>qVhP)Eh4IGUw zp3B7?@@&6o(IPcCIM^`xNh8>_X;T_TAmg%O;Cxc(3dDjQif)j5*MHYtcPXV**@ZU> z86TWEb4K;{_LdE;fwGDhcrd}?tRdF(3G|z>xgGU8j-wpMQ5Rfrff^YZDU+5K#FN~2 z-+c)6ejTLaI0Qj}>$>#!_m`)B(?$>kIF7^RmtS7KZ%X(9n#-zI zTW#7<=96y(E+>W7pTeAX%hA)*LvOE+zBbb^`}+E7|ENBQ7gz_}fDYVEi4`Obz(Efp zJmC9jlw#q+gb@_%NqVox*XP)ZK2qkb8G^b+KsCqT2t^AeJuG zZ-}K_-|wN{L!6SSBxwLH+G^GVYlw|u))2+@^z^W2&z`wlf?IC6g&jL~;CUXt-_#)2 zv=AbE-=|b6HT{0YVi8Eq%XnxG*8$g{)7Xe-0H%%s#O%IBJfds}N-4(2#|gubAP5M< zu%?tsrSfOH;OyD6jE(68Va@bLZ@>L^+LtsrHNOLu2H>Kt_@w{}WM8YscDaF2h z`xqS^#q+%KJyU{kxdF|wPZT3azH@dpa1jYNk#~e)i063>4i2(s&mJ7dNqtc2I1Z0I z@<^)JG$7sk#lYu`V^c`}3h{ihg#melz5DLFDHe;VJ(`L~dE$vD*tc)rl=X!vLgF|Z z&4Xqp&Sk*ou_?@|A`C-Z*JW^UkjsB6n>@gNBSb*>QbLy|9lqjr zNNbsR&ElguzTP}2E??g2O=ZQ8gfn}4d&|qG>RmS{;nocsHdKUT+eOSp8@Jtdn;IDz zDVIGAL*@IvDwRqVk_;j5+O!CSL86%A$`f8$i+sdV71- zJ@?$BhK7b_tXHvERD1XCRX5&vWBEGsNWRH!DdM~w3s^@y`C|uwbwEYy0zA*-^y$;w zfB*e#*|LQ-Yu2!K?OIl@T*>+8pHC13y!-CEy!6sb95`@*p`jr_KlVwec^+X-3atZ< zi2cB zM}r0I1W;ZetG)`rM_lx-TVMx(d4h0#sdNDr`9z-SvXbmE{z_90xq;{yL` zWl1briW4q+7b=T<;w=|=Gx}m<0r`P&J?x^BK>N&)OU@!wP-w1w;Fxp)qsB>#Y(qF6 zCF%mkfT6@mi|j%;J_?LUFzCg^NsH`4IDQf06fuXQPdgCIK7`}HLu>#C(SrgH>jkn5 zh342NYV?vf<}KiL<3|?RgmC*h`tiSMKceS;JU}Jg{SIt5 zkX4BL|4s5B#4Uawa1z@MWDS!0`QN~wjALa3Q0RmK=YZdtKd{IIgv;NeIW7=A5*Dib z=rQ0<;z^;F%?^5=N1;%lP^h-IRr{ljat6ud&(EXp<;I;f02g=_*h?Gi7dSRHhVT0= z+b<|12++LlMRQxxy;s{c4B#hd187O>m(*%E-EHc)6P!Z2jPf(4vBd6Heb zcC~cZGc<<|np62cBV@GrH*^;;r!8X}NfnzF96WeX0gY}3-G~TxhtQsU%5LJ-I#*dO z@+08MTGrA`v@n}yLy)xcvddT-;D^L1VrSeq65{1y&!D4(>uAwfAnm<*<_nTKw#DTa z&i;YsQW|yzrkn7QTymS6RXU4#!)9j40Xdxki1qvd*iB-$NsG3J@VA>9{LM7wE1mCM z==}1Iam=E9A#*n+GhGs zt84$~dZR4T6?_-?4Dbo#SWU=$zDn$%kyXe9);tD+WRmA);BIEoNb5BKSx!_0z6u;b z=NGIQEp!}*rAzabj8vkR%a$#hkJ||c=YU(I&$^fQ&nC_)RyGK10)By>S(@=0=gytu zp@$w~;lhQv@c>~MQYaKSdh{qjv!}C#mrZDHrcC#y4Iz9h+R7$rO`yX{tow%(+|-S^ zG)Gx87yvtgFH^%4bn1eRM$zPPfav^bGzap?H!n|UVgyUjp++rBch}C zBi$wS*)ed4X9q6>4x=j;5WlKyB^FaJ|BQ4-q{EIQ--H;!BJ|QS)6(tOKmgr2c5HR(z_xY%f)73w>NVb6M(0L0@1$Kg0kk)P*Yzh5x=5k{-|^ zLQ*NK(KBJksouH*T5AwtqAcdQZGKMrD<`d!o9uCGqV(@Q{oa=EAxQfh*AS37-W%N_FL$>*JhhK9f+!r!tOD zmpd^4j-c}_KZ_p7o-xkL^6a*Kovz&tKwuIOB#wUwoy1}d@JV15IwZX? Date: Mon, 12 Aug 2024 16:12:10 -0500 Subject: [PATCH 242/375] devop: add manta pacific network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../libs/assets-handlers/assetinfo-mew.ts | 4 +++ .../libs/assets-handlers/token-lists.ts | 1 + .../assets-handlers/types/tokenbalance-mew.ts | 3 +- .../ethereum/networks/icons/manta-pacific.png | Bin 0 -> 13354 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ .../ethereum/networks/manta-pacific.ts | 29 ++++++++++++++++++ packages/types/src/networks.ts | 2 ++ 9 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/manta-pacific.png create mode 100644 packages/extension/src/providers/ethereum/networks/manta-pacific.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..6b6c1d29a 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.MantaPacific]: "manta", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..28ed0fba1 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.MantaPacific]: "https://pacific-explorer.manta.network/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..8838664f1 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -135,6 +135,10 @@ const supportedNetworks: Record = { tbName: "degen", cgPlatform: CoingeckoPlatform.Degen, }, + [NetworkNames.MantaPacific]: { + tbName: "manta", + cgPlatform: CoingeckoPlatform.MantaPacific, + }, }; const getTokens = ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..471b2096e 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -30,6 +30,7 @@ const TokenList: Record = { [NetworkNames.Blast]: `https://tokens.coingecko.com/${CoingeckoPlatform.Blast}/all.json`, [NetworkNames.Sanko]: `https://tokens.coingecko.com/${CoingeckoPlatform.Sanko}/all.json`, [NetworkNames.Degen]: `https://tokens.coingecko.com/${CoingeckoPlatform.Degen}/all.json`, + [NetworkNames.MantaPacific]: `https://tokens.coingecko.com/${CoingeckoPlatform.MantaPacific}/all.json`, }; const getKnownNetworkTokens = async ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..987743872 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -52,4 +52,5 @@ export type SupportedNetworkNames = | NetworkNames.Rollux | NetworkNames.Sanko | NetworkNames.Degen - | NetworkNames.Blast; + | NetworkNames.Blast + | NetworkNames.MantaPacific; diff --git a/packages/extension/src/providers/ethereum/networks/icons/manta-pacific.png b/packages/extension/src/providers/ethereum/networks/icons/manta-pacific.png new file mode 100644 index 0000000000000000000000000000000000000000..3e12ff06a0c3f30bbac08caa58e90c4f1e828911 GIT binary patch literal 13354 zcmV+_G}X(AP)Fjb%bXbR8;^2h=|0;_mRl*b3|vk-lR*GXxZ{BBE2&)fs`D>IRGj8KNU1$*AiqflJcYI$$+07syR< zGpabI*bF=hJea<=W{Iwy#2uKz_)?hL}Vas|1%i*birxG04d??qEl5b0Nx3_4yV^WZ2B^c zoY^xCO<%q(St-#4{0H!L5qYfs1J&SkVuaIz0ggfVR{(ziybK7_ulbqhiGDi5GecGq z#lX*j&xy!SpkdRTPKyigIIH=&N_=pA zSKL^f3;bMF|4~(oB4X9Kn5PxfCIM2BABae-suuxY1}@^cC+^3J?6_zrt3BR#{!xyiG&~bc$Wc zQ`U_P@#ovnFv9?O9C344@+mWfszlZ^hi43n#EPvZ1c_yCvv9%k99LY_%-S_Y!nEhp#0Y+D zyMU`jWXEKgV8RUGEz(ry-wvF|6wmx5L-@g(<)$6Oe0ke24;@KJtk4`7B5?#ytee%S zo8h&@P>ls*0h_7-F(3vJpCalPDw!CRXw&1+g?4Xfl?9WEdl59uq4` zB_@xua#6(9&u``83z{k99re|^$4(*q7;nNc!J)~l4kp9^nKfw>E*$E4OySH|Qk^PL zv&vVt5AxZk26((DA!iItK>$`rtef4ULTnACnqXrWAJQBJENcl^-EKI0mSJU^VNtU% zuPC(VoW&m*XTT*^sUg1EP;WwSe@wY#i4sdOa7JUnXsR-t z&0wn*Q%g8=e#q4?YG?h$Z3LmzR~u7kEc&s25V#5#(5e%07LB_}+6d6J!1saIFoiQe zJL`YGf0&Oy-pjp5suaXfGyzGf#|=)e57nR+3y}#}(-!jL1rb**47qr&VQGsYnu6I^ zsws#2El(dz*u1C8);%@$AFMJwln|+Yl~)-lLsGeS-;)Zz;23;~+b>mxzaBT5`}738A&bgEeN)3c2<*^I3gSySt}O znM&|9c!!95ZM;k{<|bq;{_}x*fg)27keR3wh)_zDk8C{1KR?|^-WUodpq2=zTgvrU zLDX>l!XocKyM=2P=Ii%}Gk$@Y^4R*dKcghX{)1H>-Z03<4gK^Ttx7t!Hp|h38X>z6Z!j3B}RJ%s};**5A^czuZ}Ww zq)c0rfl5qUbHJ5vU&g#uEmOq=o+kgVi2Tu5rNBv_ni2ii0Jkv(n>(KP-`m&AA3m~& zniYzv$Tt{bEA&;A8y2_nsf*^Yv^hMcC-8KJV+6&dgdHA?+3>3)Y`WtJCQc|Ah*Wvu zo0qcW;*P0cg6!te%S7boV_||5J~0*jf=i}+2$y%~#m$7^iT~|=J-lbbE^-nOiXl!d z{GnJ0F?{^|dAxU3d-|Ja58;mmYa5JkWN(T4Z{EkD&HWTZh}3fFo0oCM^JY&46Zo8j zoj5f;%t=(i$r!-T{!ama#w105tV$@tclP)2-bcE~Nl>5h5r&?M<;pw?m$PVUn84d+pAwM|olFWG_ets!78F>E z^Ed@e!s_=k|K3SzqfaQH$1o%wL+LW zbOH=VDwdbdYv*g1oIy)yp7kPsEbv5*D+wFFvx|Lq9HdwZc;| ziW5nJV?H56{FehiVG_jm218e=!Yl57lI}`E-h{*ngemb~zo>&Ru3thVGQuhJ+m0-e zx8J&-ZQtHWYe&SzA6!d*cD|8=JTZ8hy;MYQIUW-n&zRFx1$=zMkH>q^lu}}O@5XH$ zs#GZkhQun75sp?9uAkrboFqQrh_6l>ta!;nF1T?u<)algfAJ}7&7zu#bDKCmo>Aw| zz%v*iUGrPu)xdftGy7FBBK)_lUEI?{+=PvOx@J!HoUI*v?@%bFQbuYaSAE{rTBtGJ4JNkps z62M!F*W&j0y<=fquMiMkws*t*T9Wb`#VGG^d(fEW7< zU$-0+z`#R?onK&Ls=yn7*Qx4xKEWjW;pqRr6X)%lP@tgzRcra=jvWY2bO}(l%A#V9 zPn@&Fse>sdz9+aRvfmyK#3g-%#yOUP(br6xSCC5C#7=aarxsr9FMRVF1|K|xEhny1 z<8PbbXc+=Grq@jNLsV5nL{+sJcnUa!3Hbc|?Elt*gZw{FZDw|mqh`Sn&|OLR%y}z$ z>*Bff?@a}cw>ubHI8aiy_bXik%DzE3S{4RtV69LLgxPsm+^no@hc%tTg65I;g;Q*t zrq=QB#-qeXO0->l1{1WHJuPe!vu-%_U475B;lX-?51c835pTJ zKrQA)o$dVIqB-@Y;bh=vyU7G&D6pv~;m!l@_1IBmXFv2;1Zu|R3-~Z`E14ufOCeC^ z7nHTL;l*bPuUu_7cU~IRn~6J^ain6uY3*$KZ`)1MS0!klQ2k3E!+9po!2dydE%6e- zd;Y!&yorX$7&Gd#|KI`M|I|~=3Ub8OMe_{Tly6^rE|+z*O=|WZYfJdi?wFgqs{CYk zjg8&Pa5*KkamgVDAy7dvs5X*BP^pJ^8&xDxY|R-3bMwm8%M9;aA9C4pHw-=-X~u2V zborEYm#KCQP+T{6qVZ%g&ZhfU5qXQJxn#tDJFXt?+{RPLXp zBGRj>65_Zb23~|C{$S`#E3OjmWcaPFtg4RH34;{}K3vC4J8y-}AXV5tT-Z;JWCy;Yt*7}J@DCb5WB3MipkN<#_Po|orOZfK*WXlC9n zn0Ua1r)>sL3ky3H_HPG_UIdIC*N zaPJ=Fh9AcaRNeiK=ld5%GQv3v0{;1}E&To!1qLfxUjZZuG#3nqdo6$S)g$aaP$Mui z$OIFIC&onpCSCup8TH|~aNj@=R@GVm;uzrhZS6!xNTy+z#V-r9%%H$qSLL|xh8F(# z!W^ZVBUT_#wNPw=`*tfg-fo=~7|SzE>VGiszH6KKZ?9`XfoiOnK!`0A^Fnuj!r%PM zA-3$SJR6w6(|EP2wj12RO7lm3cv5)l-=aJ|)K8RJ=86+5m(6OQ%0?d-o*4vZ$mM=f41ky+(JrTTKPb|E2ZJxh(3 zoG@IreDT;CP-(aGAoKWzopfE zX9gF_VJZ<~3vXE+^1YWA$Q$R}5x-=Mgpb~>^i)z?Y79)^r9ooh!etTv>#gl{v>1lV zjtLSAxk!i;Fz)ep%;?!(o!{=o1Ot5-U#9zO&gGF;f zhRT*OaNa>*4dkY89pV?ab=Q+c?dhiye0NuP6)<7!C=XLnThG$1sj{M2Oandjlw|Ju zjhjjW?^qM?`ZWR7sygFNK?3;3W+wr1L8FdV5>-|fi|*Q_+c$Q2 zM-MbAf93->!{53(zyysw0z!E72>f6>Jb4rj4nZ|(ECmB|;sB8#RV#Da1OD7X8#gt!eLn1KEV*jFjL$e+|5 zE5MS1%i*7i{$&F~{F-)CkL6eU6MnPLvZ>nzgP2rI`^J}Jc4{QC!a z;{IONzi<|3UDQsYDdTI?QSp8v_0+LxgunYdQPrn$$E%Ke3s`_RKlvbc_V&;cxWW!Y zvGVovF5s$;&MA%j8I92qJ39w0-`!E=J3C`G9JZ8vTz~|K5dwU%$i~)ipstorU|qnV zBo;}OCb7&fDr@HoS1b>>a%ITb3xZ=l+e#@Lx<+dF>PT^2Fc} z1ruVeP_uCJ1?ySc(lRB{KhJo!HtGWd+6d1qQQQY4KF7+D!q(@3B!1DLcL zXtrW#4#yB;m85Es#L|(23l|!$KPTeqb8_{%!QOcEJrse5A0OiTKRm)fca`>{ara9s zIdP0&stHnw$r+`+HKcQ1j@gTfw9n1cGA~b|Jx8uNBy0|+qG-f%hcRvTVNulqpk*Sz zF584xY`llAa+w^il9yV;FV>kK{M{4}t<3s#tSB-KFiecakPwR_D zx{WVu4Yfo_5|b8<6dJXI1tTu-qkt;}8L4$aBHE}N8YD_wwMcAP)CyOfmE#o`7dUHi zqd1yZFUCM`U(C;bew2+H`Uzr7OJ2x{yN|o46550?c69~A*b<@SjZ%n&rlKKVFcg~t za>amLF(k?fVa^anh9Gd#CCCK?*DZ5<-xJ##7z%O4o+gA?m9kCh&sBxIG2|w(`*$qZ zRLlkfdxjD|v2lQ#o-Q+3gSIfBkau1=zjX^RT%*4I*P4Sx?J%z(GzEfHp%TMzRp~83 z|1gv*FkEp(A6pHy1Rw@9C2VsJqP#F%QEq;q#O)h~dBN%&FJE8e;x&c3r60%2toD#M z{qB4&S>MW?w|BE=>mW&DY0iner@GORKnR0?940MToq$!UgEh3zk|dVMj(p|RF-sID zIY^b9M_2HHYE zoMD$UN>foV7Vh0tX2Yfu7c7go{*q?apIanKiy9<}vT|h;D_1tLbK5YFKhVqWC;KV& z$K(5+NP&JqDpBrvY3ZRkSXjJitZMio(uL6JCt=5VqRDZzw-%SJ;o|4!Ak_qIK>X=lQ*rIo8j4CbgAJa3^l;nj`mG z*dn}evGDc_3^g0E`HXJQe*4>m{LV)kDw4ZMle8gQHU%&xwFF7r%S9_6!GGV zn|a;^&9t^Op1*8W6U$aL(bqkPJ(~wPux*f@-9uD+DpZFP)FvnjMx7){_tnL(5LD~$ zsJid^ZP!UIwM12YwCI@O)y-fMbNyp?aj04&A|SRxPC{;3cL|I0`3a}DXZO~>yuF`~ zJkm>d#nK*z#J+@_7|O9QT!odb5$`#>$h%e-m{VvxF&;(i(QVPpe{AN$=xD2rdlP>4 zc!fJQRXEZc(`=Ns$kq1=tSc%VVX>72saY0w1YCT66YJKtu;k3bF(+wUwG14tFmR~M z(18-wo(geKg}A#+(p{+=rcqkLKGd|7eMSZ3S|f7*^9m=(CpOqg2$XR}pvH|*T+pW< zNFy#XxRzQ(6KRuQIu6E`KizPIuWTQnB?xHG8REp^#}m6(yte}c>fFMTxK30%84VC~{2-hFw2Up`UcmJKC#?yXV~#fRxz>pXzD91IL4 z{PNemJaBg}OBO|}TG_&rxU!$mI=T&d{;ANXOzLaiyKX10{N&9-#ZNZsMcm zlMj^Q+?bPFDU?E7C8=g6K(Cw_T7nQuxt_`tt1{rX!p0fD?uoy1sK(pxJHS1M%goM2 zBv$H#wLoNq53X(ILu*@@la^(#+D7WvWZ@--9}Sx_!|WEr8=ha}wa+VX$Kw@#@!$|! zyDC%@OMBjJd}#t8fdLxcz%dVy-wtjIT#7g1{;sKVv{tP@Wvp;T zp@fHeO1$m9{p=i!nOg{{*7s~3MG{r!({; zYc4Es&4mRX+EV7$`v%#(txUC=&>Fdksj0D%%L%!BNN6odZ0YZ=GMreVG!G#skTXg? zZ;0|jU^U&oObbONkPOEJfg+(Go^)2BDVj`p7(jmr^rU}`>oz{hw=;_BK_3FttmR;} zGVYdy0=FI<Q#Lkw7H^vpZjsns%1|UE& zHpArN7{}I>xDpct(Eh^tbk9&*N9F;D`d z1fq2hqPH__q9oS3ovS24LTH+kXZE@CnZ154O)J~zyJZ(zOPs-HQ~$*53A=DStq+I5 z?#T?snT4kM{S*j{ux;4w5T0zzJz@3^*LY%}%gWbgXQpZFwuk z>otYSt^x47jef;FziG0~?+Sq(6Zxed#}$QU@+NQrA}WMp*jXyo^94?%S3EJ6H|O~O z)|~;kfgFe}2g@;gOEEhJW1j4*@nm1j=DvizLzYsk1h{j5B56pTLLivHP)*?G?J+lR zPq^-kh>u+oarpu_nA25*Fl#5MI>wkYH)77*cDS@16iTIp@?cD@;`SPhfhcdtH-$vS z05hs#YPBv|YX?fsK?L3s#!Q|8c7(w8^p9~3ix2f$QEXyX7%>=I0w8aM-Q_ZSD;1U& z3S%}b5>*73w$&aP+M^t6T60`IukoGUs^#(C8h0G3@|y!SHXMyPIBY=;#lSH`V%>e3 z^I%o@#qNaLc3a+gcEl%M5VD|YdTS47OUA2rbD`K|o)C7nF*s@Z(yiZ))iEKe~I`pZfwZWwA-p_qd( z6#ivn!VCVr#*cS40zxP0L^~;5+zMQ5COBVP5iHUTl>tbb{YU1j$m$zT-;j3Zra zk-1HXcS4MR321OM-)3+s;9%y%v2~8L4j^!Tb1OBqb+223a$j%XxLTFHuV2OmnU@!Z ziMl1D0!x|$-m$94cdlvU!Pm~>lb1Ge_N;)xiZUEKW6`hS3q|M}R9)U2AJBp}T zivoqfu&p%Arokb1(`gER^HRd6dnF1@p>X3_IqrX5Gk^D@Jgt#Xt}3B8J3|$6P4JKR z!e87?J*@k*Lprm|dxxm(AHqaVLu+D@)*Qj=S?+t|*Z-avk3eJl{DJg+e1>3pw?(-E z7q+xhwoVNggyAIN$48Egc;a-zGlN$Xg#bQqVZ^3Skd%|g8n&7cE^o(l6lm0*9~b;D9)t!1+)ty1%(#Za=Lfu`V-B%e zB+V8o1_8Gm?WQ!vYT#t>YQhuxtXYOzUz6hxE()oXU1&J!97`sI_uXpQ*?;V$(NhUA zf~{Hl9y#Lt0qJr|6D4bW0(dzD5-nES!y1`5s)d@A#$u{SgoK`-f;%bZ-EI1QmG z8pD>MVQxR_Jk55R)WC7u1*zC~#QofrA@5%wP%US2{zB*-hW~z-Jtg@I$AdTc2A=Gp zv~L)R+>WcpifPM{yC7wNiHrZIfE}tT2Jm&{??}HeE{$k##9f>(aCv(NLrH?k4CgoY zA8>6QZ&RlTL8_+`g->4*aKl+bEtLd`goM&KN^2PK>+W9e>Fsxkq^Bqo!UuyW z@cF9(=Cuh)oJt7;gB7^xiPW8aiWxxD0La0egY-SsOHd445($7n(`5_OFHY$8J_zmS z*$Y08^=@1VF<(t;>~~Fd{FSq2b74zcT?(W=3;s{n-U+pKD&d!W^PAugE)cZZ(EC9E zKi_WMl5r-he;o_ytlsyFJ=m(P2PbI75-n{dcTT6@iy!Zuy#welaA$fgF=>s!Kty_h zTbO_v@J^vfgx{OLh^kHMgWDPf+;+5=yL+4zn2ve@V}P*@D>Iold1v|h6W3C%>sRD$d7ts>Hw(p*RL`?r{&8t_u!_4DR) zR#OYZNist8{`L0VX+Y-8tq7jkM)$sE7Mwo^GLXhO zv}(zn(L(e3c@v%e&=CLsI{G3sX8diqg2Llg16~R=1p)tM@e<03btitS(i$4>?C#^6 z`wpd&;nYb1pWnA`E|7qT+i^=QJe^8_Q_(s<`}f~}nC_?g2#P^HI@VSbW?jD&$p;g4 zs`(t9J;3dmYmNa@H4uu(5b&Ms7si7?T-@4!TCjli?QIMuamobH5{7(Y+irH3Drser zQ;SvYeipfR5jZ@onJY60b?g30ZIYAbAAY$1Ev*zD z`qMFMH;F{}@UrFZhN<4o8{ts3#z!~ra+2;8o7+ukR+rz56QC5QAI>lb z__5gZ-CdM=s~ErTcONqMb<2@ZCZn3X^XDt+-}U)dX8?bagor!={DMXh?)aXRF85yC z(ZL(%&!?wWBNP|*H7gAH;lUohxa$ys2=OUZ1^(F$v41L#uki;+?!5Cb`yM<>t~o#x zcP$x;nf1c?w46Pu!=?Qy?-wHS#OPB*M;m+o3I90i@9`lu2>)`$a?UIiC?&RTRJ4Tw zAKSc}`+EloPtmGCfqg@1Q`63C0ZX9h{eo_#dm5r<+91J}{|!_P;!`gT19{ zDlsO|tqH=HvU&6fF8Y>K1qdvkl?HCiKsz+m`=!1b_kDFcHc=O7nm*jtENA|w6-2Xg zE){HI^iOc)co4WPrR@l*eyru5NezTgPUw*-f^>GjYTg`fJYyk8Yc)dS>gqNHhF#?< z@7}PJfjF5l7i>DYI8uTK4*^jl#V#MhxoKh3=`Q)|qquA3ggd{ogTW&e!kj^^3lgmj z)>v@mLORyXsjm(uiT|0pem!mLcm@NANSt!Y4{=h!pFlZom~?i3Y}GPeIIE4mT1=Sg z{#jwjy*-1x^WmLT?acV$eGdP3w=2B^uEd+*ibCag`5iJ4AQpk7hLD!;j@i-TJS z$Q45uULFXwQp~K?Z7h4;(#aCv*L{8n_+hI1!!=bpb0N1J8sI-~*hOucnZS$rnuULOM8PzCDzzG1zQoX)Yh({kOB+(+TdUmu zwJy3I>m%P1VyzSZNyU%Ktfk1y!}_iDIs@$Lw6lFAfdxJ9l@nr&Mz>eDy@g$)jdn5skYJ zD1UW#QYU^OP^q|+!meB*&p423s^AMu5B9};?+ab**w~*E-&yx+6&ovS-?oB|m93K% z{obun13r|-dmMKtkIMl5oLLdsh+9I8+dZ6xU-!ReekcF5b_JD0Qzmf5C1*zg_xB9* z@;ke@>&S4u%E)A-fzlxUrXJ;uKaHuRc5ybq@~e>$bzh;{#HobX90_XyAgJO(VIv8_0<)}=|M-`U^I zdmrf{A|Mn)%?c3#gEb|RfRCIrhd)}?StpDy8ZnlkQB6-pNWc8cy_UD!Qe*#+5C!fu zk<*K>O z{MlKZyktQm1s=koV9lWc1kQ*P`#s0FTJqW2;Ns~bheKnUDdd<9M-oCtzYZnyh z%$;2L>>E~ou(QTzH^yu_tmJYoJS9mCffyKVxZN+rft1AU(hhy4X177m>Gg+{*#nl{|yz{}+H4bvP!G4K^bT|tO=FlOoUBGi;*RQ2t^SD6A;03${4 zclY-5p~nufdnjR66sCtmntFv#cO<=&3`trF76fC{^MUP1!mAoeWk3w?IWOdIFAr&r z#!mb!!C@rP%T?vUEoFZF@GwtpDBi*~#wpa&YllkuDZ{!S{(A>izBXIV%!Sh1Ulch!|U_W->b&Tmi-BLKUwCX&1DW8su5vn z&!uHwQVTzaV#_g+D(f$5;rdt1rKK&LDv|Hu$Nqnd$Opzte3%#m2yShesOtBC8<-+V z03&DS&kqdo@yENl??{z`2`CzaRYQ_^qK_>8oMiw}!>g7={OJWboWhGIdCKtxMYt_t52pE>Nu{0BH1 z7{;jgvzU+&${2-3;8(bF2giNr(A>5Sko4;u*tBZ)v&n5ogdtu6AHe>UOHTrSQ)6m(P8D#pt7gevg1g?-tL5hy$R)# zD! z!hrLUC8|0P_$6>IQz!{wq%;_eE&tIq%;&cZ^6=3ZYYk0-GXiaD3)s;rpe7JI20@LJ zz2cZ7GH#V&tUEJ6)3X9hY_YK`%3Kho$tcZ%J2p0lCA8{_Hm83}q9m1soGNP;gtrzKhQq@~-{m5dKFWm#D#0}gu%2C9vWlY1zas6JH})29}AOTgEW|6H7=59DN`&7 z;F*j7uwyXcr+X^=Xm^bV4#gZP0oKj($T)@&9HCVkg!fVc>rM@cXdE2j4~_7(dIPH% zYtfp8*y;FrO>q9AfXmk8xO8=%`5l?lL{cMf8upa@n05iziOAN;5+A0hof#%r0em0l zD4KF6fCeKtOSEx)*P!K|LovVFAM@~G%hUbJ(UL$-oC-*#LnH4cRSSNWTU#f#NvvZ4 ztF(s7oII@Pfb-@DJa1{h+A|{Nw>PGDcGG8?;K%ZD;I$&MeJY3#Q^=?pCYTHS7I2WAcxBgg|=_fjj+}!y-@OBXym`dWqG!P}TIxxVeaLyu_ zV&m|HZAkyIq#itJsEm_!*sGWkrQ4Vhf@hH(tG^SGKZC~DPUVB9rCX_=z^9zO3-}D~ zV5(_V31e#8Nj{%hIv*2$j0S=Ci^!L=<2lt2o3{R@jSf<`@j6_}**Y3gMW;Fw|8zrk zTpj`5Eg~CKH3X9BAijUtv_M2OC4ML(8-UA!Pp8lHl`2nNZrJGqrBSKX0G|ae^TZdC zc)ExWGbHh{x=U5B2mS%)IfNOs4NgO3`@R|YfQbAU8V2=rH(LC_s{TM5NYdADD@OP4W_9+_Gsfn(8mcNfk`Z2` zs`rc)12_x+XTU#+$WLIT zJ#^dh{+ zX~h5@sYKAs(yUQ>c+E?*A-x8e$I-6kRfY5QHR z@6(9z9;YP(cpPisRJ9Wq`+hwx9O_(-?MLv0f{}?t+4pBWGV`8YhGiKmiv-w&tF!zQ z;2sg_&a`y|BcF~qtr@_>i%xK<>!Yr(1TMwJC0+=eg*yo~H^t4U;>xUU1vcQeXCDBb z&aT Date: Mon, 12 Aug 2024 16:47:01 -0500 Subject: [PATCH 243/375] devop: add mode network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../libs/assets-handlers/assetinfo-mew.ts | 4 +++ .../libs/assets-handlers/token-lists.ts | 1 + .../assets-handlers/types/tokenbalance-mew.ts | 3 +- .../ethereum/networks/icons/mode.png | Bin 0 -> 7278 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ .../src/providers/ethereum/networks/mode.ts | 31 ++++++++++++++++++ packages/types/src/networks.ts | 2 ++ 9 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/mode.png create mode 100644 packages/extension/src/providers/ethereum/networks/mode.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..6da8eeb87 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Mode]: "mode", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..1c559fd1c 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.Mode]: "https://explorer.mode.network/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..473ae6a55 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -135,6 +135,10 @@ const supportedNetworks: Record = { tbName: "degen", cgPlatform: CoingeckoPlatform.Degen, }, + [NetworkNames.Mode]: { + tbName: "mode", + cgPlatform: CoingeckoPlatform.Mode, + }, }; const getTokens = ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..a08d25969 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -30,6 +30,7 @@ const TokenList: Record = { [NetworkNames.Blast]: `https://tokens.coingecko.com/${CoingeckoPlatform.Blast}/all.json`, [NetworkNames.Sanko]: `https://tokens.coingecko.com/${CoingeckoPlatform.Sanko}/all.json`, [NetworkNames.Degen]: `https://tokens.coingecko.com/${CoingeckoPlatform.Degen}/all.json`, + [NetworkNames.Mode]: `https://tokens.coingecko.com/${CoingeckoPlatform.Mode}/all.json`, }; const getKnownNetworkTokens = async ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..dee2a65a4 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -52,4 +52,5 @@ export type SupportedNetworkNames = | NetworkNames.Rollux | NetworkNames.Sanko | NetworkNames.Degen - | NetworkNames.Blast; + | NetworkNames.Blast + | NetworkNames.Mode; diff --git a/packages/extension/src/providers/ethereum/networks/icons/mode.png b/packages/extension/src/providers/ethereum/networks/icons/mode.png new file mode 100644 index 0000000000000000000000000000000000000000..fa7daa3cb25f986374276c2a521fc03709596388 GIT binary patch literal 7278 zcmV-!9FgORP) zdyv(~b>}~)e|O$9Fd(CcA3{hViH8J|5Ju<)NPwP>EhLh7ce6>QQnl;ac$GLVZM;cI zPIjHOV{4tbYBwqGMqaOz-39Auy#T==3nK*(VDS_JA=#E?gJd-C8Rq_eXa6|ebMFi= zbMKuy_aV=>>cXAh{r!G@y3grzPM<#AEmRp)5x{K$Stg{1|GrykZG`CxmpPb`z{Lum z0L}%bD6{}gK%GDYpb!i6D)a#z0w;kJz)u_;N#K}+H&XD{B|`h~GTW5YQcxffLC3A~ z;{Yi)0l6SBeI2kyh_kOBflCs&7PvNstAJS!rqx1i3I@3m14-6rIF}sO7|wqpe_eny za0*T(a6;g92R}|=r^3$J@J2S%*DBF{_O&X6p`ryq)%YS=Oy8$Wt%2(t+!4c#3Cx)c zQ5K^}13HY)YIPOtpEK55Gxw{%FZ?Y6t_G;ZghPQ2h#edd*b>2pUf4EI_*EAD5uhR@ z#b}T5Kt&3G??r4mPLZ`wE+83!VPK(*(IvP*DQld(5EfJgQuo!0*OzPXkPkfL>q#5`jd$=001G z9(Q_8=rqt$1FiuxH+}H7z`6wf_vONCU_>TLR7rwR5dz?Q{2=3xD0js0Z-LudAk_=> zXH>c?7sE$`7l;IqI&k$sH>49-pMw83Q+O84cUcE+O$7)-SsT);MuMt8tgHt9xCWM_ zfG)c&O~yB?CIo*o)r@I{Q}8nIjZ1|`;q>~K1LaYj-m4F)@O9-*fiKm=5(T=vT9u4* zUd>SNkV>QXPfo!rY51$z!c+c+A*QdCD0#11Yc^0ti1#a39aWyJgQx3YNf#vDkT|pJ z5!KIp@O2SzJ-&Xmu($!9d_#Hab!CAFu?V_W2S=Z!Bd$~hW%v45lu75nmmJ(*3w52= zLy+oI^98|c1X{rLL%+h`ybu3*vCvU!ZBP;cSgS;9vebP94>!W49SjcPN-p`803U&j zCIdZi;1vAP9AN{Pe^3hFVB7_uO-U^i(%Y1VkHA-J;13n(Gv_X$8xHY~ivIU}LLVBOFpbj2sf(7k1X8yHN_qjsN>7^B17wqna-(Mi? z_VWz!c$tK85dd%R5kdDUzt;eN8$ojqqyOV$g1gTj2|zg~zrkEg~ev9x4{i1gMX3?@`Wegr}R}+V%;R zKV~STC!1E-(FJ#2Eu7FI&LPzH3>Gbxt^Y z;{t(HC&V>yQ44I`qs$N?9;;7Kum%W`DsS^Q*TdY2ozdA?+rHc_o8` zsM9pT!aDfgm#z1^LWCf10oZ~~>>PlvPlZo)z`#V$FFgcO9Wc-epFW^`U4(c`0i7@} zi3yVvdzIg5h5ywJX`Ntxxsh&x)Jgc)R|wzDcLFJA0SHsN2b6hr@Ja#=17%FeoPa?= zYd{_J_QT>i!oKY3_tB7(2?)039i>s=A5+jYVBy^f=9d`)atcU6lY@UcrqtgDnyWvM zlltCbc0ave`7cx9%98~Q_f&0CpxAH%u1xM{68pLBA|r}SwdM*3t{c*=aK%aZYZ3m? zM+!%6@llHj>SUj?yb(5?f;h=DHCr+7WKymVwJ#<@J}q(IUD zQ7_y!TUeiqDHyQ~uSVn$Gzq*~3$yw%*}Az=rBEYq;spHNS8{!7bT|h|0!wa%+wO$! z#IBVBNn-l;xu@afO&MB>g@5xUm^KXtG(SzCkko_p!?76V&$YgxBjpi{CIFF`gM)|Qj@kJ4_%0|(%WxrH@Y zz6b)ncRw6G2&o$XLlJ#}C{_6D9JmfhYT%C!D&G@f??|EIvo_Z{pM?^`SL>lB@ry4D zqzhF@r;GR*uy+m&K-*Jhi?synYc#R4+MdeLkRB**-E?fiBnfCe)F^xvjF)G-`HTXf z-g!8r+};egcU5TWc4(*`Wlfhe+fZ+LWQnUxN)rDhtziv7x5 z5t8f$CWBwL`0oP0+YBkqVIpC?k!xfxn1LhvVecM48Ym+5No?=jx5vuJNBx&7Iyn*v z3ULdh9Q;0Hcn$uGs%^TsM`=>{tzOEvcvHlBn~U=6WiGN|+NQ^$hT`^6Roe+{<6~Av zKI&h6d?Mc&zG6ba_1f3f?M#N zHa-sR1I0B1Q3~4Au<6O6W#xiYjnyTN{oZor5dzl_Nh4hN0o)R<4gQmb-%k1cc}hy2 zhbp9M;rf;E@b}<5ZCOGvO2Z|IHSU`SVef8eERq>WVw?7TZ5JFp;MMbB}t%XN6 z!^8h*b&6`r=Q{`_p0{fN*7@rxRolSus4}?^ZtXFf5tULIRPYo?&Bm`Pl+yhRnF8v8yG8=k(vR+kD;ud$hu*LJ~? z9M!*IwAR+c(z~q=QOfG{>Q0-t$jOY11H^VHQ-Qm}H3v3RB(Ut1-)pz@q-8woZ5z$w z2Ix&-)(p66$RK-l1_{+YUc@2kQK8k-fl8 zcV(G@Tt@?kV9yRy;f2f)YU0)ZPB?Zbcke%_|C{cFUa@O+4&HtT_U;^7*HS~w35;9J zJz4}_-AAy{@5x#=*$e@b-fq~w1?mA5`VyFV5iAI1AO`~#RP6I>ZMLgW4N&9Xk^Rn* z5P90JUIH^`nB#|^LwNN?t6RPSu3|$hEQ~*7!$$&PL3;4_@Z?k`1VU-u5v46BaGmO*3hEXf>F#~@5zvXEQ#MI=NYOQMbzSn2ZLLR+VjmBDx zX7x*_x30IJOSN!i6i5O|9i#*dH*9P_9*laZRU^GWQgZM`qeBCOdh0QHV0TEp69L%T? zx`0e09o`2=kJ#aUU>^01kHNJ!+26VJCh_;Y@Ob8cz|je?dtZ2b=sQM2Q2*E7Y&79Vz^{+0!`X7W(_nP4prk9(TY=jAy^Z@+xrc9=%B+2Qx5| z5P0?fejjXkX6QRcFAP?$HW~xH^;jJSPWjb7mDJM=pK!pm7{a-Fl>y&SFFtE~%8OVp z>lL{14rrd7`)DATfmgj57>S{=SO2eWgLjVQ=lwTNf*Wr)8l4}#q=Bs)a;|mBpdj8F zp6e8*_&QdM0E9;0^D?}9(uRYGsn+S|!=jt*_k7I2`gNHDA4fvu@6Gl7&eOJNsnHhH ze{BTsybn8n=<8JW1iK*+Pv#T{OsXK$1Z1LuAG{B{wwfwU;*1$sxjOfE1!4N(b8w>9 z#^q;H#j5t(iC!PHAvf<|y)n&J|4D2#?|B(IPL@CVcP99dON$ez_v62c(EyN9?>~Gl zD{n0_6?^?EQ@OdA0rh6!=WknLN#j|9F-Zaq3fo_VcYl(*_n&z6fBmYA`Uj)=rRRs% zrBdMM1aLM>O+$qVCy;6U?QPH=XO@=tCougyQ@N0z8F+5($jpc&6Z_A{`(L!wXbS2- zm9m-0!Qo$}saOVA4Ana-H1|Ku>K!`_dtc2saGF@AP$6bu>+|r-PP5P1Dp}R8{h})q zw8 z7E^-y|K~QlC!gR?ORIVRJ(98YDJ&}~j6y0It`Zi2CSF}{ z`2Lxl9r3>n-a86{`v2rI_{20gHB1mI&F-HCv2)N@9kgbkYLa`~8bEXNu)|E_*7fji zd&Ud|_5W^1X3U<;kWKwRtL`;gD$UCu4W8${E`c5g;rzO)K=x>$^_6 zPd`i%hrIvoTj0H4c=bO@ONdYVZaoKXx_zkkUky+!6-=Se33OJtnK})@418<~ELq_r zg?X5P_3N^v-6w3U|Gs_CRsD-t*&m%^v{Z@8AB1m;4hNj{b*>r>5FlO!hbiOH5P~+x z4%r5i&e^9QyOygt38rJ!YNMeF5t2bqI)&ptnpssu!aq(=x-xTo9dMySiN0 z5{BT<)M;?t3h(__nF&X2#~-r7sH!rDr`D9M>uEMH;b2fGceA* zFMe#_gc5&&S3;#K$A_wn8*5QUZZdhfsbS_?ouuYcJG$J|1p9eAT!1;9mS20pnI zK5|}WO+c{`CUrh?9$dFP6Z@}1s9$`0c%jf9RtD{Hq7qfO4N{kHc5hG~M(%a8vY{{DYhD}ZgF zcl_r=@5zR9mN9(O?Qm`roE)dkD90NLS`X3(hvvYWsz_=JM9YNq0p+DSnA=yTE#iuS z1RD*k{q~v7K)Cj^WAJBxaOQW6^xUfZ%Cvo2ks!7tOnRYB>p4)WKGOrD2btwMsNY_&{Jo!(hT_ zbs{0Nd@L?PEkf?#ihHWKQ2>Fs(V~DaTq3mlZR2fP_&$GA0{<_rVlxot2ClimRJM*X z8p!2+>ec@>Uj0{g8tvJk;QUT||0nx;s7?ZK4s7aypVU>U84!Viw5jT)clv8%U|4we z<~uX$zq-apgGlOZ+xVZg!sc)d!WQv@wkfF#gl^!`20*J&007fQm%zs^DtvArc>f=} z2(DRT@2pnuUwrUK;X9DwHDn1uI7wozus?>4&E^YKofZgY;3M_6TL%=zxbV!mL9!BvZV@TUqx zzu4)at_ybVgG~=APKIgq)0$-|IBb0Ql`zXzbr3s)cWNyx|CGO!hX90oZ}|#O=Aztcvn|;q|&9YobKd89N;0Il%1tO|Y3y6aOGOLL5*`XucyJEGyqe|6( z+yqf4ym}e@;6cSL7fuu9(*!_)hd{ie@aH8UbX*_;y$bUe!o`>S^@KUD`cbuKuDk|% za(u25p+E$GE<*CqS=O+ev1%g3Yn5n@u%R2CYqmUrs?q`?mi5?LlNk-0?y5PCXh3D1|J1sODXILX+xR1g8njh$cTeFfy3Th6K%q}0fA{@0=Xf#j6 zRQRp;z$4%AYx+i^K^!CwZu!jE)W0~ZZz0FUjnU+&vpN5P2p;hH9%pss&e|M4E)a>Z zcc1djsqn><5W50)6cKF3EnjCU+~40@nAC|g6+ZtOIR6v2Pf#xS=ybShp*>qr5DB9> zT|k{7x8rfn28Fm4Qt!jV^Mt*_&k7!n(fVYfirWu=(GK@Ez(sv_s8r6)686h$JqLd0 z{#>6jI3JC>e7-H<%$FGM@rz9_pKtXYsl2nH z^_)+*5&AwHIh7IA$bRKp zQ{dlyU~>g|S@dusXd#H)*mM1p*fx;P1+EA=|C$t@k5Gu;ppc#dsb9gj<_e#0Q&P*$ zFzg$STm?V?c?)X$VS58y(Ph3;l@5?TTu?ve?}69)VaZ|WyAKkP(c^eIF;E0u2QowG zOW?C<=&q%@ww3v?!l!yk+IFV@7Yl4kpIn#^dGz2lLfodL<_P21fOm%z$u)-*r1S}Y(u`MX2Yk~fy>qIXCrSX&KHn8sJMRkmtC;4 z#UDDE@4F^Y7!rT@V;Af^1)l{dg!wRrD0j##Iij4a&{hX?x+XNixI-b`45>cY-vi4R z2*-zK`Q(FwhjAh#Yn5oGaJ(Dt>W8xJdTVm=gcraMa$OlyW`n&8@r(ZSdey!~$2(F1pRn_m>>LlHx{A&KN_ z;ly#cr4yc-YRr!(B8K_Hw^=;Jy!|JR!!21hzi56|(Q{pbNBW@RejC2l2w&&}(hy69 zo=#F}P>3Ul8i8*3`sKnGA=9?SENfhnoqVte5p9b67`l4l z^Yes9vfH!R<&Dd1ULdqhNzD@;>4ck3!R{%>{G=LJ9E~@8nKmxfv77|-z~LDF_%h)c$Yf%THw`6Ac+Q?gdPSLZ z4*W-fe_sc6o!%tmlWSPb2qv(__U!3T;G6HmR~8E$szekR*DnMmYj6=X3>6m(9kYZ7 z`e1QC{GbtBlbMANwSN%m*95N7nEzBCTsKSj4~vD4FvKer^Px;j9z&7CFONB?_^!k?r716uaDpB@)_7UZdG(~5CTdWP2bC6q zTT*au0?X^*f)uuZqaT|m7r$;%O+!HO>!yBTWa7VzgQyN$a57-D{KCNtF+8fUX|~Ym zA9U+LDxt>@M@0%ifVYv7-DCDCQyXAO3@a6u#xQ5Ho%~LW3B>?|LoJ0N+u)1;=Zy8v z3QVaC4N{4KOJU4T`4_j_IQ~EcFD3Bo0K7a;_*EADLj<`JQPBbr5LD+nEImE@`VqJ! z4T~HsOklpkWe%p*LTz9am~aHI>`Yss3K>t+k%>$RX2egysRT}7>+W^~I~?qo2}iTN zckjs8hKmxI4Iu*Q_de(c zx&=CclfZF-pE`Imv7_}~?}4|k5gB2$n4XRQ51XIS61pScq5uE@07*qo IM6N<$g4hcft^fc4 literal 0 HcmV?d00001 diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..d5758c29f 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import modeNode from "./mode"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + mode: modeNode, }; diff --git a/packages/extension/src/providers/ethereum/networks/mode.ts b/packages/extension/src/providers/ethereum/networks/mode.ts new file mode 100644 index 000000000..98a20d7c3 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/mode.ts @@ -0,0 +1,31 @@ +import { NetworkNames, CoingeckoPlatform } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import { EtherscanActivity } from "../libs/activity-handlers"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +// https://docs.mode.network/ +// https://explorer.mode.network/ + +const modeOptions: EvmNetworkOptions = { + name: NetworkNames.Mode, + name_long: "Mode", + homePage: "https://www.mode.network/", + blockExplorerTX: "https://explorer.mode.network/tx/[[txHash]]", + blockExplorerAddr: "https://explorer.mode.network/address/[[address]]", + chainID: "0x868b", + isTestNetwork: false, + currencyName: "ETH", + currencyNameLong: "Ethereum", + node: "https://mainnet.mode.network", + icon: require("./icons/mode.png"), + coingeckoPlatform: CoingeckoPlatform.Mode, + NFTHandler: shNFTHandler, + assetsInfoHandler, + activityHandler: wrapActivityHandler(EtherscanActivity), +}; + +const mode = new EvmNetwork(modeOptions); + +export default mode; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..8b729a081 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + Mode = "mode", } export enum CoingeckoPlatform { @@ -123,4 +124,5 @@ export enum CoingeckoPlatform { Blast = "blast", Sanko = "sanko", Degen = "degen", + Mode = "mode", } From 374b1106bb46580513954011e61377b81276a57d Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 12 Aug 2024 16:47:53 -0500 Subject: [PATCH 244/375] chore: cleanup mode --- packages/extension/src/providers/ethereum/networks/mode.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/extension/src/providers/ethereum/networks/mode.ts b/packages/extension/src/providers/ethereum/networks/mode.ts index 98a20d7c3..da7f40b24 100644 --- a/packages/extension/src/providers/ethereum/networks/mode.ts +++ b/packages/extension/src/providers/ethereum/networks/mode.ts @@ -5,9 +5,6 @@ import { EtherscanActivity } from "../libs/activity-handlers"; import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; import shNFTHandler from "@/libs/nft-handlers/simplehash"; -// https://docs.mode.network/ -// https://explorer.mode.network/ - const modeOptions: EvmNetworkOptions = { name: NetworkNames.Mode, name_long: "Mode", From 493d2cf8aa4014eee0971849fccc3894020e3dc4 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 12 Aug 2024 17:32:59 -0500 Subject: [PATCH 245/375] devop: add opbnb network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../libs/assets-handlers/assetinfo-mew.ts | 4 +++ .../libs/assets-handlers/token-lists.ts | 1 + .../assets-handlers/types/tokenbalance-mew.ts | 3 +- .../ethereum/networks/icons/opbnb.png | Bin 0 -> 11088 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ .../src/providers/ethereum/networks/op-bnb.ts | 27 ++++++++++++++++++ packages/types/src/networks.ts | 2 ++ 8 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/opbnb.png create mode 100644 packages/extension/src/providers/ethereum/networks/op-bnb.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..d6045385e 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.OpBNB]: "opbnb", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..79047c9da 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -135,6 +135,10 @@ const supportedNetworks: Record = { tbName: "degen", cgPlatform: CoingeckoPlatform.Degen, }, + [NetworkNames.OpBNB]: { + tbName: "opbnb", + cgPlatform: CoingeckoPlatform.OpBNB, + }, }; const getTokens = ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..29cb4295e 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -30,6 +30,7 @@ const TokenList: Record = { [NetworkNames.Blast]: `https://tokens.coingecko.com/${CoingeckoPlatform.Blast}/all.json`, [NetworkNames.Sanko]: `https://tokens.coingecko.com/${CoingeckoPlatform.Sanko}/all.json`, [NetworkNames.Degen]: `https://tokens.coingecko.com/${CoingeckoPlatform.Degen}/all.json`, + [NetworkNames.OpBNB]: `https://tokens.coingecko.com/${CoingeckoPlatform.OpBNB}/all.json`, }; const getKnownNetworkTokens = async ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..129e493c9 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -52,4 +52,5 @@ export type SupportedNetworkNames = | NetworkNames.Rollux | NetworkNames.Sanko | NetworkNames.Degen - | NetworkNames.Blast; + | NetworkNames.Blast + | NetworkNames.OpBNB; diff --git a/packages/extension/src/providers/ethereum/networks/icons/opbnb.png b/packages/extension/src/providers/ethereum/networks/icons/opbnb.png new file mode 100644 index 0000000000000000000000000000000000000000..37745ea08fbd616a63ddeae2e9cb6287368d52dc GIT binary patch literal 11088 zcmV-WE3edvP) zcbr{S)%U+^pL6T9^hqFvL=dDspac~K1tg(HG(bQ_MbQ^4odAjjedtnb_}D8Dy7WYf zhyoAg0RfRBfsl}7X40nJe)f9**yqgL>62vc+=n=f+R`jjGCPCJ2Ihdy0G)y`URCOV8WBx^c;UwaAgfAFMB7x^C`b#) zo4~(Bcs=lfS4)}18yhz+Z|&!vd_Vyk{@i9D)xLpYBARq?lhyV5_NjHNSHIfpB9TyS6T&do z1t41KU6Ve2`t%9KqIoZHIHLOlyNVc31l-(eG|9auKO-)rPX~^XS$LV-jOk0D27E#EBE@ym;zhQ8@-USVX3Z2&!F^9fa>M z*AyfDY>_ZTf+c__B9z_B8sI?{y*VgkA6UPBeS7$sK7u?}FxCXXqip3)nX>(!;>oAg z%14cnS%{!k0kz@#qJgc}b12<{Y7lW+LKSOug}_a!_IJ(AZ#`G`8ILg}2xCP6dQAM( zsk08Z*e?hiYK-y2)fN3dn)I=VNEk#yVX)Sg1eSvN@!GX3?g`%)X{xFVLbV4nQr8w> z>eQJF6+J^l_5;DqIi>J@W`OS)tBACeFJcI7lg9-4-rBWq-V(m2$MaVM)e?XnE1 z3xG(?!?w5DhYJfJVhkuKcb1HNbKU9{&xF4pb^Bm61)yuyPnfV{y&o@}FX(B;n1r?V z-+khH!vYv%jI}l|a803*_|FX+{?*1PYlG1efG){)>Ygh_r}@!R?yzqL>x5D_0hm1|jRawHZtK`KiIrxH`;L_ynw%f~C?^ni{z5W-f`{AN|TX-fg!DrX4Ui}PC2%!YfB=sx3At`8XKpdM7IX0$YQO;L^!7x zw6Sr<Fs!FY@1~_T{KMW3ERRdM2732M~aoUV4=+0`5_uiX%BG9uPD(&Y1$myNqY%hARL6R{hqY zWQ_5Hz&>dtam3oS|7u|bg)~$Q%RYpJ)Y^?x< zYQJ$d#2*qPvqEEUOb2#61H}M3vjPIONyYad7_+pEE(9Xtsnr!wIIyXy>2n`plF11THHxa!2xAx}5%JaP zix4}oscCsLTM;$fQUMTv#>U3968p0;-aa8cYD}(t5x43)vO-|th<6uQe0+wzcM3q^ z$(MaDTaxD9Ct}2Ws7We;9n;%FAYwdggQtYz2b-FjvUHPEHVa!K08vuMHcp*>yD{E^ zvApMd9u$kvo)z|bTZzTTXF2jc1*|%O5TG{g#_jgMCb(=#iWlDSs7os`AA+h=HU>n= z7~@-OZ*N+=@*`|v5@|~Wz{f@SzGpn|3~Ox>h;705R1_u*M{Vj9ri`F~3nAdn-S(?mM!My}R&$JZB%9WtUk2?HQpIxb2`n1Odc+rx9Lw-Q#;V zrMc~qIEs7Cj?HbMBx3wP?WbDSuKX>VDFmA%0HMV{eRnbDaaB!GT|#Cb_#Wg7(3un7 zvulZSj?XghT?Gmy$m9giH~|?9s?HmzNxCiIz9(Z`dPABgUh=6;Dv3Ch#@4o=fQm>~ zt$j~Z)2bKP49{S=lP7?gHf>tMs{fdX>^YX)JC>>eh*UOUp;MOFo))~gtDn`bX+h|3^sOs~{gxPn+iWLQhX%r53SbU%~ zW$O0dH^%>pjuE5Jh+ENZ86goojsr%s~`i}ZqW%*kkSKgfD zhKG{mi%_2)Q*NUR8C(0q=Cv!o!Z5YKa0DP!{WA{|qYtQ3_2iD=touwJas}Z7|54=p z6SC~TN0Dqn$mZR4Fc`Ef`X@5@)}T21AeDerT=~m$F)qG7#lz3VNX3;@VoYociqiyM zfIYNj&8npgLkNbNL;+;t#ECV2Ed8{I>=Y6=tCr9Aj9Znhox)DrTh2Hp!=eN8#C&Ma zNS9U^45e@~< zh9S0sp#;Dsd8W>|%ouZaHC2B!v8|m#O;Y*v{5+?AG|P6AEUg`a)uGjWmpZRe-fS{l zeq#y|IA>9o>60z3oq`?4wh>r&KMl3Y>UD-|ZcXv)r3pI6Ml>-HV?1l^WzB0>E@lWV zFqi-sK&Na!dk+apPtnca8+Fxh1hNI8Sb{_MEwFe|mbtr>=*$WE!q6)>GU)2lO0FRM zW?6#o-hKe#Q)+Kq;W8bt;P>z2n8wwtJY`RFX4JuF9U zN@?qKspI~(g}}P7azl->Vy)rYJ5${9NSwA#r=_Z74g@0NS=A?+*RFhT_*$PQ?@s`n z&p&0xhmB`$9}U%CzTfs|Kn2#V&e_u}r!UO%i4WyS#OSeCmq+k?5AOc&IG5d!;^|j? zYEy0tD0kHcBZT-Kl-zwLeSUUNfVH(Yy1lAqm^q%9LpWUm2=_Ueu8!mLKi@dxL*|EU;Hz3kIatHcHp zoQ&Wb<+u+PIP=&nJ56`v@bXHJD{f42)58g8bEK4@pNT96P7vnqT;fCf6uIGn1S^^h zPS`8WD9Ww*YS(Ihr{&^%!->P=|)&KLV&*e)}-2HeQWBOO+URm}p8CTLt z`lM_lb)U%z@7uk|xhFU`FCV&o(CsEJdpgEtOVT|051*RQP3&Vg824Sdg5wg#<2^|u zUF@TrU;{X6zXFRFW!Up=0UcQ<^dg~uGDaV}eu z=6_!Gs1I2>=R-v`Su*1}VQ$L#JQ}gm9<9!1?<(a=sUij^@1lQc^eED&; z7Ek&&=6b7p5h#}2bG~z@fOC$|aMXJX*uV)yc{*84c38s7diL%EPL%(q9ZF5i*6P7 zhlr(9pH|kl8J7Gx&X50?qNP>vy`hO2s*sGsC+Foj`LG-_r&!vvgZuQ+@9I*@8%-X+ zyf?vb|CAtC7}}i^aoS>XgYu;hXIXS$f$_EOnlNxwu{@giKd<;)wj{-a&&D=8eLV!M zAjYbFQz-7*)YQ~TIOow&gg@g4jr8Oj1DS#|fPQyw2fNNHv7t=}f`KO=K#UWDOkS8g z&hoCE0_tll*2>TstWYDwd}Z$)17YclDiAfEXTtT{4`atkKcg+oL!tS$6{QkUlcHbc&TaYfTI07(=T4T&i_2LIduXX)Z zh7%C!s?Rr4aC^H_C_1;w_XZ!7DA_WhURkr=@VW2RGJkPBFR%28$NEOrOfRO7suQl( zPT}Jh)$-vB>Us7xp9%GD3+XR)TMFr56Y7;`U-Mb;^?E*bQ5~B)`f8lW7U=zqabJ05 zmEn+c8udU#jXN|v4zbR{gkIXAxhqB*py2_59(11T`ro)ho7cOvwMs^i}PuZcr!GDGxpq zW5EUWEdFT?8`^~l^`Yw(hHn)&@#|U*XIxvug0DC5=VxO~sM9`^?}eJFBeElUT{9Jj zbW-`(0^T%$#X;lz4pY@YY?G)J6Y&)tv5X{hNd#G?oUSYu>TK2_Q;e9h~!@{Qv^~%uuh^U z)+=i_3a9GvUcNA~_J_TpUzP-fKC*oYb zB*jy&xNvhk)_t#~z&+E%dgX=JeLit<9Y?>vz&VRD%${l~mWC#-Q~(wcQ7cCR_ds{~ z5f3;}RfQ_BeIiQMsXwaWk>_Gen`p7xbFYqg{u?`l$qkk>j>+=*Bf5G1d(JL#{ny&L z{cp}~{Kp&4ZH)YC#eHAghh$9o+Y3Gmzg3T_Gc?E7YM*OHaf^)|!mcv|&Mu2vbY_Jk z-&5cNdlvcmy-9v_d*6hUhToS?y4QZYEWz3h!kyo3qgbj6qt2izDzZOeM9=^_Y5VQx z2<#FTUarcWMe4nwM!Rf*2woVI&*X&@4$QOk(l*XLAxqqMkvS8t&`e%9?gItxy||UH zeLRcrxq~6b^o=t#)VK>u=xX**_u>0DbqFyZ&i`1JrI)sH!hv}*d7(4wzOyy_?lX_g zvh>n6J~=P%@)g;h7JMWO<7)bbibolustD{ddGhqxL~fw5GFQYz+Mp@|5TUoVEJT5o z5=$;<=VxbjFnem?T*)%SFER)>whO5QeEky{?!BaqqxUP&o)I#+o_lrqb;{L!WLtD( zg`?kB;O>js_{NDDQgNpVOqt;qg`_vM2{R@KTzhHewyF+pXz+^| zUwrn3P~8jc6W(maWK(b}VRMom5f$w8W3t?PaVsBsXMxsEAzK*OmGnHf4{vA_c9~J) zH|MtVyYt%FbymRoDE`pTCg+9z`1)31w;h~6{@ZigdB==WA7ShLT)qdnqOhq$IAD(= z_gvJf>?t3W(PA1i+# z^jOIm;lukCxaXo)zWu2TsigK;$z7VGO{hyL-#ID6-T&FfQSS{k#~{L1j>t=B?R59} zp?4NGiwsfQlSH>q9_78jUPY0!S_?S*=kKA71jW%@bkNqEPX1@ zSC7u}srh+ol4XgRK|b3%(zm%N->c_L3;4xZ9UOmPp6~oVP0WMyKc3-3dl$(Ug$->o zEY9Iz7!ISjoVu3D2|v6&$@gzfv8u&TSEH5O1|+mX8&j#&Y~Qo8BVzo~@c$>&yW`hq z{Z|dQ{x!jQCuBHy?;`o4TQQYHv{z?C2GP8Iip<@)&GGwdluh9o!l5YUBY_}*WIRei zJL=lwFZ!gD%7icuQ9%ffB;p5w_jX^^dt0RqzzALO_B!RMmwk@Cu%2TM$aB`QS$5tb z=%>fm$Ri?ZL@pjUS8;345Do{5(+=r+<;7QhzIRiKTOM&Fl=1aW<&V-4vuK#-_`vK@ zxny)@g+N^xRuz7Ke}em;j&a&CxgoQ4BZ+8Ri2gkqFam|5aMkr`uDUtNx;E2QfTB8; zNMyDTI%~AN(`eA6L=3o4X?s@q+Aq@7rj%s7V#ZG&jHXX+Eu<34Ki~9t^5rzCgfhN1 zwD^0SPZ+)Pg*wA1IywAbMaLr|fEG(Vc>vM25Jl$tgB{wK9&;E>i2EbFdY)qwwRR58 zcNhT(fTB~32;<9N9BCMVY+l%HR=_2n>!dENY-sBlQH#Q}1ED72tl}|LkYPYXVc*)6 z4(Pe`2|Gt|h_rI?$r*N=9gx|~Akt<+07MvXRHc5XcB)%@DaEmKzPvE!V&;eB$%HZU zp~|)>@aT&%$Dd1&-STZw;-@y`E&lgQeiyB+KZv+h-?%eet+YZGQnwp@E!2RB{dV&)s$-L}x5`(+i#Ztio-eU81bj<5ZqrVoKNf*-2;4Q;|cJC|7Ujdp%=S_dBzbR9|Pq**0%{Wr&zvwQie|)k|!N^aR_h((b0lH zvWpQkTIhk!0TD27dgmQ6$D)rAMD!=F6 z&(fZ8mhotWorgeR6mr$R3jq?o67%{eOh!kz%H772bk21oO{r;F9Z86iaS( z+I~(7Z3()V%3Vj^-UQl^>6D$`1Sd~$|{8f8PfbWygUjDed_#?>e{K9u15wlR9^o!i_Yy|&8fuk`PwwQ7@3wKky9#9UBlr9jfC8wp(FoF9{^D4K5h!#D3Y@mk zF?3IwpC?}w+WTSPT7}vg=b~-ZQ)yT|yheK@upq2AkQMSpIO$NwCOU1Qb7c#i6%FH# z1VZ|kwD=$^t9>`affv@>+0f<+IQ{6W9V|Q`&qaSo@zg7>G)ws|Hc}zu{_+$ej)uPP zE=9ifu`D0l%ay9x&?X?&b?Y_{vcf>{dbMw3xQJLi`Jy9;9Lq>TsICAEKt<7{u!a%<}L*+swW9IHwnfJ>OOuwWC&15r{qC zRw5Q3K2v#&A<726W~^sk3A=rThp)CBcm~wE2-|4-)e@$-wTgL&t$+eX)s_NN`j;tX z+g=Bn!Vw&k0x(#smMv)pF%lT8Ol@z2ag0Gl1dyguHu<{QxN&2v!mGmA6@aK-(6&Gb ziK>Q1wS&hX6a2<&}B7R2CR>e%9x*Py6wY02y9S|SK1t^K?BN($ARVWc7K(QoT{`pQOH7K|L z)$O0?wrmLpUCY-&G?>MDIfN3sk8@OtA!WwhQ>x+3g(n0avp1iI@7; z-ihi9PN-LwukkqXyLHT%VrfWM{7fC-_WSy@@`Kw_tZXq9OTxr@?P?eiA&OXbh9&3E zIWEhg`?`|zxx(niEy`e2RYYZJ*L@OJj?QNNM-xfAPJ~IgN@1g`1;hwHRCae$FxsfA!}XEV%kK@*FT=+ zGl%7<*@`BXBLoGEwYH^L6aQ=YS`bD5yw=tgn?zV9#wa6PC=$Bs-wj$PudK)dz^Nb2 zvFy?|K66-(LXoa`e^-s)P#EF^FlnQDzFT66N88RoD>WYLxiv+p>9(+!z-JH7@u$n$ zICWvxm8kC=I%FIjo2!s^2*emQ$o(6aFK@+d{n}%dt6>Qhs1znZq2!K4rxQbyH$CGd zFj_@F{7NUce!HFhb}#ivymZ}nKi}o-3NXpduSybC6EkU7-LyY+^&7(7OQGma9KUb( zBDZ|2ogaL;lW7wj@lzSx11RS*B;&3pVFhHsRS1LY%U_hTpJB1+*o#KYOl9Pa!TI|X zIroGN@0b;mH+!8E><`hZs7ouwl5qWl39h^;$!lv|Q;C6^H7c%Y)Nvnl4WMRD8TuSS zc|X84>s>#)0&EACxEVGwjxLK>)FsJ5luF8=h-D_k?2~ zji6y`MZ{QZR|&;k%8Nyp-<~TMKW+MzM!eH2RW5!~gXMEaT2ER*WBPr3MkP(C?t zwHSW*#}vQ1FF{AvovG_j3#ht@*rCz#)sJR5@sK>}MBlx*yd!9_BwY7kf~#&$@vqf} zy0rE?i4wAVYg5Wehvxb6hqG)ydH78%qhn*^YLsI+VS1vxVS2Q)P zJez*X#Y6uMBYMAQtKb=@mfJGIo^t}uJTAjW-d{j)gwNrWf++>A417B2icDN|U5bbQ z9w$CPf#vdEL+{_c#97B>Ii#$mJh)@q$vFJ^?=ddBA?gY2Uhi+~5OFI11A7)Z?_=Ff zEDMF9HCjY4iG=p{zs0%Y#x&2r?opRgVlgUFD?k}W!wBdWf_ucsVU=hY)w}fSp>vBY zK0d?TT}oY@IEK^1H|h|UNWcZZOmpQ;sct{KziW!4aEZV%A8=JkcA4o$`nA=DD{o43 z{X>rDA5Bhw#-kS&ojUW_EEj$@Lq6BDlh|M=1(1ll`+o8zpG$5?v-HUrF~4VN+Yv?} zVvM!+zUF>f#`IS40$>eSdvF*Putg$+Cly!H3Apdc7=L}Co=?upaq35MPK^%H!?&D* zJvpK5xSgdmh{di7C3P7(t8m=|36?z>=k#N;#C_$;o71dW?}(kL_~2#QMBJH#w{7R@ z&$`z2gFkcm8N#<(3>W@3&99dw=*)Ka8m?drLqNqdT;2WuZuAy_05C0UR{m+q)EQ40 zG5c1kZ(w%OU%{W>ljQ1KlDxLs8L-i_R}ijwq_s~qH?4Yr zUaKGaxAI+VK)9%)w-()Dc_r@+hOhpxhK1j(=P%F27+0$#!$8YmnsK0&@B8%YZ3Nb7 zkZ2NmA2*MVZ?}gBQ8wqA(0zt58J;10`0p`3^38g_T6Ts|7%hH-fXa6X7dO3zvOfVR z0j7D)$~&#vCq!h>_TwXgXu#qzrzRhLF~-7g*Ym||YFX9dxvm>B`~i!In+x7s;EFGG zQj>HwgnOSOh{Ct!)jCAn@$H%!hil4caGrW2j|HZ+&O~YrC+0J9UURh|C5L0x$lxzPCh2*idGHd-mNX` zc4Fbmn^MeQ+`w;^CP;?I%Yq>SV3mLs?*ayC0y2;Q1c2AFX5}(#^#yRq9^?dD@Y1%T~?P*4tx8PdFTD^DO z+7Ye;^Q;yIVYgCLx%L3Jr8mj zD3rpgB)hipo3Jn7$`&X8vl=a@el*L8A98&KH-*8Rn&jZ$9fbGSP^&!mn$M+6Qr!7y z*zF|D5LTg-jRK--i>NM!!Rv1hCIA-jnwytDKV|CnR~zG>t+w)=#CxNBg#q0D*EoNE zHpXWU%W=w4IT{*=URu2?d4KWf9EZQV$Yo1Xct%;gD9iLPRNNNr_rqARUY*jp!Eoix zDSm!Wl1-h`RpzFOHH-prQNJsjn^!&0AgdpS4)t2VXi&J&BF7jpJ5-~m5OinV#??Bn z;PM+&-1fIP-#s}qY?ahim84aeI^OdAFL#8ADtD~Q_l6GPMoUS6+wV{CjbEgBb(Keb zjXRWDW#+OK5nru+H7I2+q#w7hH--`b1x!mzOULAC)4u@R7k**Yc!Lq`dSbn@ve|Ib z#dT~yDWJY)_=FJG-~kBR$8S!N=pb-)iLSmi$?A0;R?C`ORd@2k$O@ox%KG)|+i|OZ z(7PJWN)8ReRZFev4~-dJgRnnzr%xdfSJrGW{RWE$Gq}qeMhxZC_xIVg8w`nIrng54 zff(ai4Svwn^yY(OHGSHR~ z)c_nLwC^BP{m+S(&SQvuzZ}CA00m^liWNCjKL&J`yUeE+7)>;Tr&`M^f&FW>Bb?s#Se&}b_wm^p1R}-+s$XnsTJ-|MRQ(aQ#E|oW(&WY& zSNNVe(^^{uMzOx-=Ak_d#(ZHxmQ#)l8%_2ip+w}2h8kDM`X_fK`N^Fr*0;HepJNzB zV@%8j!Ie!-tInj1=rLSui2y{L!Ju*KjN6PcM^}P9G*a-&5<7d&DRK63IX?WpysJ7E z@&lrSoVWco!DUNQ{Ns&^k~2mMj^$&6JDS$6I+|{mZ?hzJOIWD&W26vi;?S&D)1qdz9e=7stig|TDV4}_A4_*VIc zsDDsX)ADA95%3uZTN}*rfS|FlaW=#s5+k!JK_eS!L>+?-)bu)=;qvu|k%;DbKrm_2_B(ko^CuBAOUJNH5TTrDRON=w!$nDq@m1}LplAk%{RCfVXblTd!&$2dUNP#hA^uMn@a{5kkf=oWZC1f(CNXNKHPBTv8_h zyyoUNmkaTOZJ0>XmioOh-U91V z$fg3<`gex{))?biYi}-NZ41QkZP(P;0;1)U@hXl#S;|U#ya9SqQ6- zOxkYN-k!C;Fvjd{ZC7rt`W17=7A$}<##n2g4UGBBy45S5p*yx;5mU92lb|>w&|kND z#WOKq-)F5}BO*pbB8u|Zx4$b7#jScHA||l*2QgpwE1Ud^j?-uvW?g&N!K|C?=t?!8|1Wi&Xmsp+k|!{3bx@n*EtaKuaZTGp&wR?H{ftJYoywk$l7^~=Yt|*%legP$FVFfHA{+&R>c72x;ErUwEfADD zj46F<_3G8ngufqkx?Qz=^RARKz?AJ~ED+0iBIZ4ygv?{*-y?ny)m$dT~`^`?}js&VbxY0_t08^*VT&U=oBJ$pFpddV}$hM~yqHWE03tmyxM+LcZ?b`Ky6y3qXV(D`4u>S%-uDqQZP*jIX-QXoYCCOK8<&tt~0sXE4{UUAy9*@O?cr zU^Ow;2C~ND42m1BT|L}Z$T!Vva5i~=R)CGJN0*`ocq z{9ueHB9z_BT7>%*y(K7Q9|&Xj&@HHAX5u4^RRM_5XW*t!pFW{jH2aC@JcSPeyNVbu zDnuFXwb0Y3k^z49hL-&-H^>BM!~xP(^fIKuy@>J%$UU)`eQedLRU67a*F%uUBF4G^ zL?~a`<*P_0PoDlZ5%v|2eN^Q?MA=z|$wnmJ-@(|SI;2XULjdkORJDN8qQa{p`iurV zsmhZrEvsJZb&)8jRTZm#bFr-mKsh2|5c=U8j2}Oz!B6LR@B(iqRb~S_g3eTQvIyf< zrCx+2XbL2pEDcm84|IxXJIY3oW?WCj<)E)y-@aVv@K?09uGrMiJw<&MwuwnE$NvYB Wqneb9XU)3+0000 Promise.resolve([]), +}; + +const op = new EvmNetwork(opBnbOptions); + +export default op; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..69e613546 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + OpBNB = "OpBNB", } export enum CoingeckoPlatform { @@ -123,4 +124,5 @@ export enum CoingeckoPlatform { Blast = "blast", Sanko = "sanko", Degen = "degen", + OpBNB = "opbnb", } From 7477fbd5a69ba1cde3924287edea80b234f47750 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 12 Aug 2024 19:33:42 -0500 Subject: [PATCH 246/375] devop: add palm network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../ethereum/networks/icons/palm.svg | 11 ++++++++ .../src/providers/ethereum/networks/index.ts | 2 ++ .../src/providers/ethereum/networks/palm.ts | 26 +++++++++++++++++++ packages/types/src/networks.ts | 1 + 5 files changed, 41 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/palm.svg create mode 100644 packages/extension/src/providers/ethereum/networks/palm.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..6e7feaf29 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Palm]: "palm", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/networks/icons/palm.svg b/packages/extension/src/providers/ethereum/networks/icons/palm.svg new file mode 100644 index 000000000..89b8ed677 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/icons/palm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..052fb16f3 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import palmNode from "./palm"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + palm: palmNode, }; diff --git a/packages/extension/src/providers/ethereum/networks/palm.ts b/packages/extension/src/providers/ethereum/networks/palm.ts new file mode 100644 index 000000000..ce5e2ce05 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/palm.ts @@ -0,0 +1,26 @@ +import { NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +// Palm network has an API but it seems broken (DNS won't resolve) +// @see https://palm.chainlens.com/api/swagger-ui/index.html +// https://palm.epirus.io/api +const palmNetworkOptions: EvmNetworkOptions = { + name: NetworkNames.Palm, + name_long: "Palm Network", + homePage: "https://palm.network/", + blockExplorerTX: "https://palm.chainlens.com/transactions/tx/[[txHash]]", + blockExplorerAddr: "https://palm.chainlens.com/accounts/address/[[address]]", + chainID: "0x2a15c308d", + isTestNetwork: false, + currencyName: "PALM", + currencyNameLong: "PALM", + node: "https://palm-mainnet.public.blastapi.io", + icon: require("./icons/palm.svg"), + NFTHandler: shNFTHandler, + activityHandler: () => Promise.resolve([]), +}; + +const palmNetwork = new EvmNetwork(palmNetworkOptions); + +export default palmNetwork; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..0d522464e 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + Palm = "palm", } export enum CoingeckoPlatform { From 1154cc8fb035028962d60d0dfc6fbd5db051bd24 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 13 Aug 2024 12:24:48 -0500 Subject: [PATCH 247/375] devop: add proof of play apex network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../ethereum/networks/icons/apex.png | Bin 0 -> 16062 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ .../providers/ethereum/networks/pop-apex.ts | 26 ++++++++++++++++++ packages/extension/src/types/nft.ts | 4 +-- .../components/network-nfts-category.vue | 4 +-- packages/types/src/networks.ts | 1 + 8 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/apex.png create mode 100644 packages/extension/src/providers/ethereum/networks/pop-apex.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..ce7cc7289 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.ProofOfPlayApex]: "proof-of-play", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..e8246ac08 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.ProofOfPlayApex]: "https://explorer.apex.proofofplay.com/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/networks/icons/apex.png b/packages/extension/src/providers/ethereum/networks/icons/apex.png new file mode 100644 index 0000000000000000000000000000000000000000..63a38a07deec9eaefb150ba2b05030e815998587 GIT binary patch literal 16062 zcmV;vK0(2WP)(=40bf=M&B0m+oG*p?+*(u~^N^ZjwpIrqL}Ni!pxlJ6$Q)@bH^ z@4crz=Q-!TL-_x2Tz1*pts|H;kB6z%IX@eoS^(Ed9<#w9Vzh!8U;>z!n2A7uN2ddN zyhjfK-41ROyx#=ITJq@m*PEuUeZSYXy9d4B6WG=9XP3R*3Rl%u1v-d5+6b-{%q{Q; z!UYJ-pp38qFaRbH7yTOmdAT?P#E{Pd0D8b!>pZOm{A$OO*Is#ZUFUnd;@vxb?-by& zrQIz910(a;^H~J97zN)70K|@onb;E(0AdhW7U%)Mgw4bdiw|Bv6(Ugv4xbkV^67Qb z_W{JTmOyKX=!PqAp3?qa?#1pHzc&hS>DS(FtMXMB`2rRb&`bak16&|>B*JDwaP8sW z%wPu)m;et}!3D1XAhGWFJF#{T4)-8a8mI#4=Yz5lh4%wM4}n&Ak30Y6wx$*D(^ge9 zKF|vArKOwa@d%#08Vg}1+^z*RzPfXxMupESs zM6o=X@J(SPe1O3YL|}kD*a4kj*UrA`iYr%qaKpq0QUNYq`gR*LErCaySs)UDWnKfw z69dWXOiA2FbnEdw!NLiIf(ezuFnkcM8D1wgPhg=S{2lJAo+KzE32q3AAoFgoVl4Z{ ziVt3h_&_PZrC*PNkAef>#m#$U+%$Q$Zh6fInTdc+NR$W?$$QP+i`QTeI8!vhvV&rG zpL`}&8dWsMAQlBQMG5!a1o&m&T+y`rz1`Wd#|J_IF8=!4Z3J2Z<~G?@Qp66kCSr%+ zrHf;=15pq@lDMv)FBXEj`EZQ@7zylI-)FA{uaI~R$TdwF6mw7(7^3KB1C}i7qE2R9 z@y)v%m%pbQJ<51r72x9k`*tfcUr(OeY@+}};YD%QtSyPVDQZuE98w`O0mPmYH=U$* zOe|@ig^i4xFBWc*@&#TYC>M&nQR1nRduBlDikhnG%a^{77~y?UfQy%QwD`KoUqykJ zh7D&EsBTgUz=#3PSfdCW(He`=xI}3QTNb+vj`z9bEl*CV%pMDfB)3Qok@?~LYyqxbT8C|{6C1EU85;IfziZ1<(&v@@Mg*bD=S z0I}-;{1?A*&wC3L-!lcc_^OVUg0Ee|9$!s1on*^dTxE3o2|yb)j*emV(Xu&-#R?D| z6MMl0;-=ZLq>tISp2Ts@2#Nrp{yRe&QNRRQFOp^#@;S*6^feOizyw_L^?MsHf3M{7 zo+!Y@SH0aj?0FS2x5oI*AwGME`wX$sfkI|w=@$fmAw$b1z>YM8P=@i#f-}Px-rRa> zeFivFZlE~VCjjhI9H95m^fbK}X(}jd(%+>aBvs%fm1J~Q`KpCWA9(k%fqS=aaN)P# zyl9vUFA}&FFfgsQLf(NnXanLtN#aciuRCHA!x4yXA(#>s7LyW~1qsH<9{}X!UqmoS zNlc#X+7#x-U<7-Pf3savQD4jlgWm`dDb9(UL>B#=AV#*8rdQ&i`-IklE4=u%Q*&S4 zZGsqMysHZEM_0dj6%m#LXkh}g3!AK-Q|K2GVX$p1F*y7jM9oI{!8Tfc^57s9@w0*v z0hesAWpP2UDrkWj;@`!niCC3Dd~+~b5h~jpBiv&MsbqwJtR;een|qi`_-s%V$|$MK z1q`$h`0B4M>Rtwd<3r=N7H)u|_@4z-mK7wQPe7qp zmtcC3pzRciQ^wUhb;TicXqFL?zW_ia*dTT9RvePhqxA;T|9h}z2r+!IX{m%N1)8Qm zG2{^7nE|@9s&?p-cOy&K?Fw+gwH>WosJ_E_%!3LX#88$k!{)IOFG=iV_>j6AC{zL_ z1&b;i6L?JdA|MRcg(pOi2aCB27u4aDMfD&6zx?G89=Jb`ZCiZ?YzABs6(xex?0YCB zjG_|7Ou}jj9E($?Sn1r=AQFWSxMh=r+wHhuw<^E|*LJkRPg(`$)}1Xr2-d+YTQxjM zjlz2pi%8Hk67PUS2>XpWN7oS2h&b7()ge z6TF9c42d36U?M^E#_}O8O2v5;D@@E15EPSX@Rja_% znp(2jcWTXQ#Vodxb@RmJg~AQ#n5J1sLP5Gon)fHDU4+eXL)GezKXx*m`soJL*NwgO zXP+6u{rBY1-Q`C??=mk@MlJY|G@t-T(m&xFe3FtHamC5MW1WHZb1__SCPUcGo?y2q zzy;TKv@)tz0o1CXHVPaWcV=mvTCt)qFRt7a0I4u7JgBmyY+r`+x6h@i9eB?@CeeAP zH(3blfExWcd2;3;`LI@vQz3B_oLI% z?oonWR)7nx?P&F`Y84o*#FCLGfXw2*2q`Wi;mQqKLs>WjjdqccMJ1+(eb;g1iPdFi?8o!nKbNPq+t2BNY1!?fW!m92d_y!x_xu5I{~R= z1Jz3;6syKiw#|>gN^KZsX;t&&j7l+e3AhqwSeMzt7pno zAt{nu0H9vVC&~`Q7Bul5p%R*S06;Rs8CNrkHGnS|2^)Q1P*s%nW# zASRKzBUrUu-oKcg=B_=pwRWQ{3p;L2*}v$9+2$;hZGRxIKUyCcXUDt#+=)CLSSi+u{#2R-Nt*3EKEtDDTRG4fakrm*%Vpku5V*qtNar4a3 zi~<}%*opJ&>5PT-sGt1qaa?b`QNVv+*N^Tkg>;>naFApv8VVEaAiPD`n}kBvbZ}>H zmNulYwx3z{;jUixVEyG2S<8eJ;M^PD_$mtiDo8v^V-}EXgv30@Oo2mJ#}I@Y0Z&q% zEe3_fAWz<-T{lW5&1kBkOU`P-{&Q+3vZM)(m3I$d<=uG$oe1tcBKwFJvSd%-FC+{W z5m3eWDAS@&>3--nKp=8V7cY6R?uJU&P_Y6mzP_W?fnFp~OPXT`ALWvTaq>Gs%tG!& zfXA7bp62aIDVT{V=K5+eKE}f{7c}6+BPV9{8($qpF3=ZMm4d>G72xa}Iy;Eb znlw)!t>~r5-2jVPw$CzkmIf;F53nfk1AdfERErSLa=>1b=uggQ#`KoTLEf9c8^O=- z>chrYMuJiSIQ67@oO<%avW4fK9Ky=G2GG65GZ^FmsT@XdS4?18CLwSj0}#{3k)+o# z8kJrv6FNGne(2yzKw(7+aL$i5UB%3o!SZo)K{3BgTzS+^6|g9Q{+mHOPCdXD?4eE- z@Suho!dVNZ;H1MRCagyv&*SHJ_Zg1>5e_l1??)%$^A}9P^l20D23tK=-Zg;dpBRc9 z1(*UAowS=pA+m;1_7NWy6I!sgvzRhQ!6)wzyHpV#C|dy*-`LRx(4!;`m??Nm*}POc zgUgHIAt7cgrxu)>aQy^f0uv@p^xuOH*>^H7J-r$AwUrBKL&p&Ac{qoSuMH>G1G7lA z&iXpgX(u;u+k(jx!bsb;dR+T2edw0Dg0`}e)O&+c*!~3b_JE^cJQ=X;Qw&5F1`R~o z{8^NTK;AE0`fz!jMP)5;@f{s4$l*o!knfw-?Mg{emwb$0gwUC5NV2g^bBY+FnwAz|J7eM(L}rf06g~4 zARb&X$OAbpYCr*?pimC0Siwo~RHjHI@23Pekdj}v$BGvij$H>D1`jDG6qLsU47jf{ zd@DI|Ob#EX60yaXYMR;3~f{SQa>g3WX6vn3yX~5Y>H%`dvA9*T= zyH@3RAg^UdNgYWxmIP4gjKAy1L5lf9y%M_}Iad=%Ez@ zc>eLB5bosK#Ib=yc@%`{X-66YwGaR?NlyehQoOXY@iHJCGOa#Wa~Xi8rRG@D11$b& zM=JvzX+EEEpP)?Jv-Q`*F?pdiH2+NxS6a#!yaNjWRA31v%>D2rI(z;U%-ypVm5%kD zL%8LEK7Qlvkuf>^V3maEp%_qWv{OGpV$-KOoU*7MM;=-ETmazt$A|FX9RujzDh&b| zj}Ws0vix4Xk{D1XY{pbD@(ckWb5d9$=jN2k3QBqaCS1kLAm^;tia1z5#DgJ3Z}USz zW4(ggpyZL&gEav`7%q8*g&J#|>}c_kQ?TgZhKe^jH|X)Rm3{o=+B^m7Sx6Uz_A!?3 zvoNoaWrEc>0a>0>m+Hy5Yn!K^+|-AS8;5bqDfO5>y)tib*fBNu*ddef*vdhAXvJXg zeiCvRNIHrDtC`2Wh3uTjT4_b)-NpDwfnZo43Vc0)h2za@Tn})@Ew5Y*@2)4+(j+El zfSze^QueeMPB6yL7sWF+g|OIv;72C&mriVTc4D!nd&AJPCd1Ok87))5J>Fa>T%sS`_a8cd)=}a30VtI(#7=rqwYWL z)c=q&v*g^ur4Q7#k2RNZ7jWh+uXQlfYyn1@?i^+jnpl|S?Fw$78)sQUvOq!p)&N16 z(O88q9NU6J_nutwhOXZxLF})Slx317Q-G)pH|JE`+NiKv+u-8D$hSQgop1K#J0_z2}Id^KLyWZVZ$;C zK(ZrKZgCG9>U5u7`?8hwV|sxx72u3pUbz_Lt}oW8G@j~)8gfQ4Mv#dr$ua7CfKxu% zh;t5aLPLchZ|n8~e)>o+|6=`s5-1FhwCgAy+_aXlFy}r0a1wv!lt$WbPV5ip>Mr1( zhjMu4xq+fA$EC*C7@ZT9pU{=%o4 z>A*cI2UaVd=*5H22Y0U^QW!}CmL@1Kb0nhr8p0V18*sw>u}P$-pC7=z59QIdtpFOw zd&r6a53Z|oXj@oIi%zSncrAcq|9oQ`LX!t;QAS;=h5~c(nQm4^sZy!)aRG>~3Jo=mPyP55I`7b?iZ^QA8$29j8xC3Ad4)Cc}SE&gJ`G|Ze*S=`*RV+8-XvIj4}K7@={vG}a_ zO2`)ZGo!f*7o6OLgAb@&D61YDz@uw&=-$Su^}`swWRFr-?uesmaq{VP6AKGlJbv`; zJl^gsL@W^YPif(_QDSp$V0#yk?xzHDXVPF`Rq1z2=PM{5=P4n`=sW-hLrPUfLW z#gkA3n<@;Up@#4m$4tlJvnz9v{evDWU+l-qU-Th2$cZw-6wLV~3oQyaCmqp%GZ!@M zQhz{Kx5s@eb9nmM!Hm@xp>?E2A+eiIKCKRm&X`zOcwzN09=UapySH-SQZjV_q+wP< z1GM`pIjL-+kX;oYvh=>jwdp-}GQ%qJO8`rT#nb^!;)w}xVD=z#;MmCm5Q$aj3odNL zsRuUV{DYg(P*a%@*1a`||9G$)T|2x4L~-*Z^AVKqN$Z0wc|X&P<|_J=)0?sX>|O5< zm_F6vk1uG%NA{?q`&Q_o!&$TY5+EgGYMs+cyRgLkKcp2#QA%%U93z z>BAau*0B?#j!TWMZ3TSi-**Ins3}_dD4F7uNI-ac2|GSw{v5`^~^skYoYyv9uNGo54Sznn=BNdw9!OjpVLyZHJ=dnnl%ZZJHBZ`1*1yG zeGlYt{{y)wWD9=+MD;a!zL5fAX7Hjj>geP%E8{zE{8k>neQwyYfb^8J`Wq#+GF4Yq zOnJYYDQMU0W>k@ZvzWjvv=h4!MS{r_f^_Amrp5&V;J_ZLdod({P*Ln{sCAgpRE-%; zRg!vWGzq3Axm?fyK;VbWg@D`;^Xr?3E85tJjNAZY<7>kbca+RTBtBwDmY(&n3b|Ku6)}z$e z!@3pcNof#p@+p^0sDg3a{`I)>{8>2X@Fr2B2q`q~f#jsIEiNo{%k~l6^k^^t?RA^6 zb$g-mo0lT4a&J-i7E4rsvb&+gzg>vCapg-LV(v1f4TrX!9(2O!4Q?FIbZ zwVQF)F;lSkn8wN{Fv{ra_PFtuUf%G^P*ULz{|bsJ-p^zs?{Q2Y|6~o$K5t@7p$$s^ zX1yngg4tc;U@K|`bfA;w77SF+1JDknS%9O9V0HR%QC4sd0pW6E@%$9wrp=9Xa!_bI z@g-yClq!7rgsF7E9<{jR*&W!jBeY?A#EiqxuhjHxrwCZ_L?1u#%N#8}W(tn}zA zdr^v*nJ}9yRZ`5L5yD~=D*%J%snB4K9RP?qNv|lnWCH@wjVEFvXhDXUh-WrdPrwIc z$8mG(aopT`-2Uti-1bbbbkB&QIk{D0hHwTLY3mM;AKts2f3abJE%?YPM}<&=plUGWg^DUqZ`M<%OMFp~$^Nn#vq zMBubl-~l3cCV!uBmbb_$<(L>-k%5g&Onk9!{JM}B|- zt%ZmrD5hR)Odx{dfAZrsIQN_eOq*aE*;wP}Kgi?x)kBEYR=qz{e9)Ba&VDe0V2a!A^&c*UAtdi&q!4@4Z=+x<9`qXOv`~?lzcb|#5`|d7}spDV-7Iy>bo#9aVqaZII zJ+u1d*y_eCtG6y500k% z9S=R5!&lC4vEtCfPv>y=s($42Hgol_VqOY5gMJ4L06y*HdTKkij>dcDz*u8jm&cty z%VBbz!-bcO*XAzt0x8zAbOTz5B^8puk{~X@Ne)I-1whU70Kotbe2`{|Bxu_?n8h;# z6zE@#E3sQjS+HOV#9ng{lx6&z`$q8n$G73RO?g~=WJ|?GqH~UF!h!=EaL3cVcT-fhG30r<<-Z?D6u_OWNBGpeH2Z#cA zhk43gX?o{1j*~J=u|=O5gJ zGTsO zb`CM0W88mV9%~*Q0Dy?MEL9t4m=uyeQ4MNox)(6IdOE=?2JI6-gQ-gwqz6PTRPieUmegd}o`MrD76JtRk}Ib$v?{(?<`7y%pn`B2~kX2cwZ~r-y=#1kVkhYLj zGJg5XA>4kOJatLi}K3*HXrZMWLOAYg-h-G$Pbeyc#Z)9U7VB=T$Sgg9wFC z-;GxwtpOslL|XjJ5_k;ZqYkhuF2v?*J^vur4|b;Dq!eBvXrLz}fYg}7mg!$Y09f=TW_U7hqkt9wv722@hLfz|8#ao(X#IBx&S!ops&CgI=y zbQT`_RSqkj>_gXfuT;JMN293ayK*9tPCTj}XS7YMnIxBIw6Dpdy?v1Lc^_jvg`gU# zYo!y$M@vdOKvVUE-Zg`lCXa}R zVPg|HvAJ{=0{LXGr9c+48feWR7-@_p&DBKQ0w9t&Uf#w8cELT0%mYl*Trpci zo3^1#DuztqdkX3%6E9xSNGBdKL3iKn@uQ#h;+0p216!9^IW)rpLd0i);N(F9Tq**D zc{21!mO+0gmJ9`wXsR*XX){%*QFz6i0D#tN23i2IaSKqYBq>S}VPxEVM5Gaah(hQf zq`w|(Y2l)dKpy7I^nT%&O7{nCzxDYYShGIQ=N>kN793ESz-Ba8;fgO#$BM`M@X)jU zAQ0_0y9S>-sfqUdQ01lC+yLXz$8uPd65kj%#V;VfIY!TMysHCBAwA{Guc92mSN@?6+>E~l&ixg4wNKQec znkgLpVj}z6G_`gJz=IwHg`q-a9mL?JHlJ82XK=;%Lr@DDvNf4gY&umxrW-3$0YJ}p zlOh$s!y3AX`w_&L>34ds|BglUr0A3#O!H%vhcHGM7P?DYes zoWIgpi5lxg3@zK66G}IxC#=7_?YSLzY+VlL9MOaYb0-$Z%NdV6mBZbSO3gqF+Ty*3 z5#`1;$e!0vCgk%_4xcn1kEO=(M@&$lLXxx(5E#pbyV$T3g~N_fw&7agQcmq%camK= zSfv^l(@A-cQ|k{<(VOi`)X>&3Qm0p9NZ+B}&nx8_c9jp`YqFw~um(~lgVoQ3`$~)0 z=H3zf;E`^8p{Gq71L65uIb9nfve$h*k1{_ZaP4N_CG86<*-DJn- zomo%w4+}Mer=J~6GO*az<-Kj!*u#iePEyLqT7Y5CIIxm%aP?#vfkF1DMb$83Nj9J4 zy_}#8W+HM@gN}4DNcbB~6~hfkKTf8jV-ME<#`C=vRn#tKHdf;=j-7_{=QYvy9}8SS zSOqH%Nx&*a#bd_(FZSa3SMz-C5mV^c11k>;4?mmZyH@v6E^oW4VG9bv(tT0@blOSv zSa{52DkhO)2qwE0IjygZKg71;8-*K)<^C9j^}X6hDTb`DQ|mTV4S?Wc`7|*ih$ItQ zSa()Du%iG#^z#ZBeYkj8$*obxvITOQC z?@4sgc~daz1F8vfc3lLo&W@O-O)Ifi5+-9kKiN8QgMrLcBLvthh|}5^M+=qtR0G@z zpfv;DRAGo11$DXU2IwaHu*r%pG<}n!V_8%<*1|Xeo(wtip_d%>0>|y!faCUUz^yOr zpw%1tv1P{yDCzpKjt$)(iJe<^6!5j5Y{5UBJAK^e4y}KE2>*OjH|z6x7*J*tWHk#7 zlHsOPn+cbk+f3sXi_~*4GhAGp@L%J*fbd!6@EPPNJW?*^^`auo@h`H>(P;@Fu}Wri zROfZXJ zg3z9l*6598j-?hR0Xt!;Nee_Vn2j@LPN~M9w@t%&hc@AgySMVz9V40$#io4_w9SoU zTip2b5}!&SB8M!sD_gOD>!h-uHxSp$h=rSAwMyBJJ4hWk5JPej*9}IIZCorr>aD`N zeP|;Elk2Gl@umbdLKGWX1kym0$keiMy`3&aKoC6S@g(I8nQNG^qO4eDEb}UuIi(uk z{oEhW>h(F?_WTZP-BEzCnjYFkNyP=H(MME1mep#XJwQC8+0hrzYMxlJNFbw@W>NME z!@L6FmRt!zAY`3P=4Uj&lOlln=Ey}d`|S=yJ$jrA@sHesHExCJ>cz#y$GkH*NqduE z5iRGG+z`=jb!4*C^7kbf$L(K_E6-U5Pmn7bzx($cY(Kt0wex za=?UVM3-6_GdSr)9({<60ytN2%4Td)p@U3k^Cp<8jJ+shkmSC?l9?h^u)m{>^rVDrl2NB)4+V2U$u*0x zj9?e$Bs-%-EyWq;N-2P@2f9ay3M$GO-~lT;1XKDT)`T|=ue*X@>oCc$4adL%y`0y2 zjDvv#CcuPjuEZoRe{-N@Ny|Yc79|nTJOJs$6%Y6lqAD>|cl90wDo3eu1Kwz75^`6p zCSC1><^y5x08^%L+@P$`1QVcbeSD2=$1QXlu8Q4YP%i>1ho(Wemx3mnL1h&6PXucv z*Qwl-t|bYVkTgFHxCw<7_cXMkuu`@_xR5_d1 zKkSpAB5;W@j!UM;r3TBDLkJ66+EC6Teuc}nSS?48OVu{U8~FjR-cv!cUBA>iIRUV860GCV&br0jdDRYo(kT7i@hWb{lh^;gTtEi~_ep30Wi>bMz0# zZ-~ygK{7>}@NQe&*79~T=Te`opX?O*3qVB#k-MOgNv=cDYLhTE-Y_qzU=K$A?(`>^ zBf-g99g<8TXb#Eq0UQ8S0qq2YqK>UkSTjo8umYjXhDaqY{2Y})6{d{XmX?i}!1ic) zfcl2~c%LqP?eyP{!XxfVe5}4!4_dILfEt4*%1_uF6or#z0Z?l$HRLlCjWKcfiA*#r zkl&={8`3~9IS!ADa{$mje{LthouZqG>t>7b(z6ytn>1ELjslCyR-9H-!X*suMI{$C#3-cah4w_q3DVMfKXAi zP$`O}oGelJeS+yg3OePp4liDL^VCitc}Nt4@07GZgY-=>iMyxFX6SucJpq%WxcMbF z%nBjO-AlDC#N1zP9>ACHc@rJoL!~Y>+NOnNxWrYKHK#P5YG}0oRy4YL3Rr%}4t(ps zyA#EV0@Ky!^5v{1g1ZFX!8n=JO9=yPo*>MhIK-fr^rF@#@$nPxSV*WIHQtS!`;s^<8g zG$ohyz)s_om$4%^;PLR&c|7t|4*7xD+$f4gNE{S7ruq_Ja~#7dr!OLdQvxgu)f;IE zrg*>bW(OkgZ_rD`ova>M%R{w2M6Ma(%Zv>%m_Ep57$AkE@?7u`X;{Ac%qCV|#8kG; znjON$v;rfdAUyI~FFo>FA0I!bkv{v0W|UHd@P&O8H=yhhRwQW=JDppZ>hth3Io!Fr zpYyqJ-ckzjCM(?^rxXgL?>cClvNrfk7^(|CP$B#>ki{z#bT>SUdgvXoCTJ@T0{v$WJ6rGe`=4dEZYy9GBt*o*u?fdqXk z(G#7TfI)czGNw;;);BozUTF|Y^Eyq{DfEV<`^5>q3L7GSyA|nmGbZFcmQxkJ5Z$Gg zlhtEc07{rb%J#EJLC1|J`RvlNo!?-DK4!!gGv;st+D>wX0JG|~K0NzI4yPT^gyZ*a zz|6+DoW8-4q)|nh93aU>Igu%RL@TG-@S?yrbA^{f`xw@58cscyw7RSL$B&W37y{FN zd)MHibElNIRd%K;tA*@Yyh-%Fnnme7H8c?Xo#|&Y3h?;+x$O&{eR(?*H^-F+pkgad zo*4v!^Z=0M9YO&_5H;?CptrCeb>q$9nz9+K9nZW0+&99w)cF4a5+$2|}K;*6r0Nc3+xIkdTN1pocqHr%_e7oRz(S+AaiAs5hb zSq&kG$_+rVh${Kk?FHQNWG|llbsnsHVRjOWH7xCE+K9pc_McOOGuj#|{+j#xx}fk0 zWg@MQvgu+RhIuI|IfnWV5eM=o9Xlz&2>BINa7)rQB|BU$ln9HmLtauTMT|^ZO)RYe zqF^4OQBuA*E9odQh!K|<&ka&Ip$sFWHunwVdrx%P!=6+c3YN+aO=OePs0|RXrPuS{ z{BUzvv8`PMtU0u_kcIn&J(%87h0mTmWkTOt0)&&tNFY}b4^tA@ko3Z;%v3djFr{V1 z*WIZq^5hX8TMMH0817+d22)s(xkgf4EawIEJxU;f@#L01yptdMgbsm1nHfp!61Hpa zmKuEZuo;-uPz`+=xsu?7z;1y2q1l^rrtxH z$NqcO;EQK8W5xtKh;jprRgdM-zGlF@t(}jR1#1czH-JTBL%?(n;d#civ-JaGD8S?M z=e8gF?7DUk+Qb1`8Nvt=+YVUV58D=g$DU1j-WeFdjjwK{hu+$be>vNFa6k~DG<-!A7aKh|H-2B@fJlff3F*iwkZC}(0DPOL0mVKhQTjLMCuH;vV@3k9+ zpA)VE08ekOqCYvU83*jb*VSx%Z8#h|-&O#WMoRJzO~s_!IsELRi&Ot6^hM{@{~2@t zbd1TQFku-n+Tz{AWm7GT03A^dDgkvFHd)|*21fXz$2w{8UM)C#c8i9UOdPUJhn_%) zV^%{o{_5}%INAY;D%d!vEkKWNv|nxui&M)$t;VOIdj&PN;#OA3s;PFzcCfy z@x#Rn0Bs?*DF)LzrbHi0kDxCCMX6yJGJ7Jdc)bTtZ|=w5Q)-~#Ie2V}$}~>RZdOAz z{_2Ps`1s7pxcN8Rd2`{f9BPgl~JbBhYDG$&;7@n+5%1vvhMA&=fSk)^MfpGN4 zCgbd*r&RPb@^s_|7>_=g=er;23w>2a9Sf6S6faUC2YL_!f|CS6-cMla{O*5FUq04- z$K_I)u*`wl^vA^HllrZ;7zr$h4{9zt8z3Mopl5n#U^sxoNH;*2qS<9BJ3W3*BaWZb zNRM{(;b*_@!Ir*}#7D!h0TIAHG%&}saO@E{1VlG)sLzOMQ?1#vYVf(XCd}P);_m** z7YA_5eSOH~eNbOHgP`6^8DA2DMOj@)!J2H6;t^sHBsjNpynBzU02wck_hhtDa_GgFPbY^*uPrCrl;{G3L7eAZ{mTl)zOc5a!WcdBqh|8l}o5V zME)e-ePB3O2BE%&aL!RpIQfvuzv5oU`pzNTy{bPvqd4aD0qi;00Z{ddx{X8>j^^2h z#nQ5@KtuG3?_N9ghVkZ5vaD8Bz$Ly49Vyr%#l}gLW;F|m4^GuEsicv05m5wiiIu{X z8?h0;%rUE>8echT20r_V7F@Y{Gdg>Q*@B>)y%S3*Ck23op(p_je^~Ibdi>FX%D?Pd zM{dC5XAk!A6EEhiV}exmqv-^}%EO@5^)nEk!bTc#RY4MJhM20nyS&s~O0J-N{@hMT z3Ze1{g%T$1t_e3J%Zm|+P|K4vI(t25kWhpnZ;z}dv{90PT%q!Apji#o`1YxL;44Q> zr;!)NrT=l@!1a!v!xaio4px+c01E;#O zFu6ELTq|timdyoaVuZscVf;^igvTS1#v2RwZp3wGeHfqlM3bV|;B(458H89plmAni z|5ZMIv0(s9e%Qr#J=Pb_9RRUkF>SnswxH=;6HJ4E2fTrR2u}dvR2+ziI;*RzuP$d^ zWhp@W!3Xzv!X?a67uEf%b+e#0Cbcw}^~Gi^DUvviXyymVyn-ni&^O}omDO+HruE(B zOmo!n*-y6M+H*dPg&%F$Ss}+90=zTx59^*$;iG1@ZZF`Uf6|5T-qww-?S*i6Jx-@K z93HsI=2pFS+{asXgV)uWUc|_~CQg$?-KZvG6dd zMEgRV5{R!$Q{?1`(}z!a1^ue^6!loi8-2Zhgz=LN-T30euj5x;1LaOPGiEhZ<9~f> zI{xkSKg7(&s?sV@{EncQWu7YxBRA-A#}mEy+yB_YFTXi#UQbitDUU-2`wbb0n_&wO_vZ25X3i6%py1SNf$(}5``s&iCzj#b2 zk$volxyuQH2Q+Qbk|~L25TT}}R5ry3%eC??d(wrZ535k(R<+%fL@ei>{4lP5VGAx@ z`6f@)8;mtr*AZGNqS%WZzyoXh@Yl=V!2>V$XWr-aIg!HEMXVFZT{R3(5;mpA7RhS! z4e_(&(`-TCM<9R2wcnn3^+eV=;cquwbHss{f%#6$3N$St!_e{3R7Hm%S&4g72ucC?P~k7!NN3A|h=Cj4&amK8d(C?y)}q`x_L8hd~7@V zhvIQ^6%a*urdFD``(OlmO2@hmvLH~ce5aC1^hm@YT5;XKeQ4=K*E;dXX9B3I8N9>~ z*S3OaUhvUu2qqvMeU1=YE!L6X0eN;0NLrYzn+;YLCQWmK|5t`2n?Py>jKB|f?x3gN z>c<)TG~vPnr|!zq!gAzscf{6Wh0VPM`ud$)u zE6wZzo{P(63l;IYk`2c9`b~B9xl49sons@KGDq7}>soyktzza@qcy$xcnfI|?Ardxc_A_n}|Y%iKxu3$MHK z4?8PfU@~_33vS!z&+T*tUI=~G5MU2(*0m|e?F|*Nl~iMF6u9p!^2xrCI!Ne|GXUxW zp`ALxbi8&U(3ac?u6b??E`R8Eym=yFLBf)F8}n;K2@RXz1EF&DqmjUgh~1!}^;c-@ zw?nxk)VS$~N(bb~)JvzESc)C_Fy8^Nkq`_cYtA2joHgN%3SsZh?1#)!>2#m0E&Ojq0l7<-FP+n~yJhvRD1eRy&#YfU z%u6Hk6+sAE*NwEzlrR@In-fKdf=D)Ov`v&!I3zPL6q?!i7;Z&TLxJ;7_sF?Y=hY~ILvh7>tEPCl2+*MY#^UvvG^JuZ8=^S?Tm|Pol;txDZQo@mF2Za6Nmd{2q&T*cJAVLQ}{N`cYCxwwXPMQRm_-88TYDt zkXVLVsklPQS~rX)@!I4~9IVG;y_C!mJp&_JpGiC5Dgfa-01|JZcp{SU;WI81w>cZL zGgybD`op2ETfPgC5VSdlBHjs~2$twX6)jx;kGnVCk2c;D1<=v<Ct<_Z zBJUFg9}Nd_AepYg@Zi#SBi@fT-ctntfVRihwXvh?i6u(_MC&7qCYwcIgl{}Uq9hq> zi56~t!WUar%o3P03KggWBuXX9K!L6m1(g3mS6tv$NI6x`>Fss+SaVQn4DWe zK7@q~coR3Nn@1u2O42<8__C=?NO1z>b;TAcREy`?bkT5xfj_2fD6v>>#hsnqx#E-2 zl#Br8b{gSjKmNP--r|eL2SNdKw5?fpF)=N1pjIiHh6g&R)f%89Ff%);1ZJ`dPK1Fd zY(pDG@i@kJ5ngJwLDA$MSz%_uBtn_; zoc2*fs}}P`S&|Gu*vxJ)f5(AV-1L_pS^IwNVX5(fR)BPz@bLP@AUcaci^+3~HW^vL z1Y;Cc(ztFhKmA$q|9C9`qGG|tN0KO$jtbr|fXD!-2OcY`m~OcF&p&w9KHB)bQGj%u z_|V2SBDx5k=MiHbGL|cuBu6F@$Rc)12p;7FqU#UuhALC+^g#rH@qLbYlV^V?F;((n93s0hkR&E0|lzQwta^ zV6-ZS;25!{@6j39B-cqyohESaH(>;8SNxs}d$jTY0ESa0N~?7(C;$Ke07*qoM6N<$ Eg10hUK>z>% literal 0 HcmV?d00001 diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..67d25282c 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import proofOfPlayApexNode from "./pop-apex"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + popApex: proofOfPlayApexNode, }; diff --git a/packages/extension/src/providers/ethereum/networks/pop-apex.ts b/packages/extension/src/providers/ethereum/networks/pop-apex.ts new file mode 100644 index 000000000..ab711e9a8 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/pop-apex.ts @@ -0,0 +1,26 @@ +import { NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import { EtherscanActivity } from "../libs/activity-handlers"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +const apexOptions: EvmNetworkOptions = { + name: NetworkNames.ProofOfPlayApex, + name_long: "Proof of Play Apex", + homePage: "https://www.proofofplay.com/", + blockExplorerTX: "https://explorer.apex.proofofplay.com/tx/[[txHash]]", + blockExplorerAddr: + "https://explorer.apex.proofofplay.com/address/[[address]]", + chainID: "0x1142c", + isTestNetwork: false, + currencyName: "ETH", + currencyNameLong: "Ethereum", + node: "https://rpc.apex.proofofplay.com", + icon: require("./icons/apex.png"), + NFTHandler: shNFTHandler, + activityHandler: wrapActivityHandler(EtherscanActivity), +}; + +const apex = new EvmNetwork(apexOptions); + +export default apex; diff --git a/packages/extension/src/types/nft.ts b/packages/extension/src/types/nft.ts index a7600f8ca..a1849f10e 100644 --- a/packages/extension/src/types/nft.ts +++ b/packages/extension/src/types/nft.ts @@ -13,9 +13,9 @@ export interface NFTItem { type: NFTType; } export interface NFTCollection { - name: string; + name: null | string; image: string; - description: string; + description: null | string; items: NFTItem[]; contract: string; } diff --git a/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue b/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue index 751b70c7f..f2f492625 100644 --- a/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue +++ b/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue @@ -3,9 +3,9 @@

{{ - collection.name.length > 25 + collection.name?.length > 25 ? $filters.replaceWithEllipsis(collection.name, 25, 4) - : collection.name + : collection.name || "UNKNOWN" }}

Date: Tue, 13 Aug 2024 13:07:55 -0500 Subject: [PATCH 248/375] devop: add rari network --- .../src/libs/keyring/public-keyring.ts | 10 +++++++ .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../ethereum/networks/icons/rari.png | Bin 0 -> 8641 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ .../src/providers/ethereum/networks/rari.ts | 27 ++++++++++++++++++ packages/types/src/networks.ts | 1 + 7 files changed, 42 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/rari.png create mode 100644 packages/extension/src/providers/ethereum/networks/rari.ts diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index c9a2048e8..f67b69db3 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -77,6 +77,16 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; + allKeys["0x284Dd2384dd258D9C40808D87B1a79f859918566"] = { + address: "0x284Dd2384dd258D9C40808D87B1a79f859918566", + basePath: "m/44'/60'/1'/0", + name: "xyz", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.secp256k1, + walletType: WalletType.mnemonic, + isHardware: false, + }; } return allKeys; } diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..99abb1b0e 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Rari]: "rari", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..f42afb321 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.Rari]: "https://mainnet.explorer.rarichain.org/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/networks/icons/rari.png b/packages/extension/src/providers/ethereum/networks/icons/rari.png new file mode 100644 index 0000000000000000000000000000000000000000..af10f2f788ed463d9b073079d916172d0f83052c GIT binary patch literal 8641 zcmV;yAwJ%TP) zdz@TVmG8f6?^9L%PC_1v2;>2X!9ak3JOW8TzyVZ5J3Pb(>b+OIGtOKYFCz*`%b2+^ zpd#M!&fJR;MTIUv4GKaGoj@R5gP$ZkVgN%-2(KiPM|W3u*ExHy`Qx1G?u0zLx~rf+>or3NHwu9LUev@GTEcgu`c~PnUOO_cs_k89oT7n78)+~4s zEobjb4H@hP^bIPFWDP);xo-FOS4@HEB!isf@y82tq#)xB>9oP3#PU!)ic5a>-R~D5 z7(kLgHu*Vz#}nZR^NQaJ=6QiN9`}^NJaso`yx3dljWpZ1osGjn8HTh1%tOsukSx+I z^hTaI$fBnzdcLA(fS;PC-hx4iaD*rk9`!*^|d)hHe7BRCG z3W}VS-L2Qqz>rdaMw)Gwxyb;-rK~ts@t;%t#Q{}^3l>Kwj?fF@6*U5~?-^ZosG?eE zizQ_&RVa>#&W#4ig8k`Toci=0eH=21FeDTp9+aLnb1uuz2d)zMaEjU>q7z5HVA9PX z3j6?21-yb-(k7sakX)qrhb;1MzhLGA$>*eztQiW5FsK7L4>d5KCYn6JWvuvwqF)v4 zX@-E1c7RC12nj12CQ$GK9tcv@qBtDU3WMD83r@Wk3jK${u#gToIhr~t78CyTgG@j!!P^tB-WU`c24 zw7snbzb6WckfzQ!@?DC*btgN&{X5RzRcUKbkpYjLBcfTvUCOcx9HUnTRA1u>Ga+qG z5c5tEKE#SHhzV(Po+y)|_J59M^omPZc5dwR5H0Y7^0%eTm_%+%V`~ju`B1(%Q^TmixwLTzh$~1voJ-?^e%S! z#LM=MnelyrqFxZvG?LZ=%cN1FPN=h^8J|NJ|AtuGD*7jv3XHc#8H zJK6f_MO@Tc>aAkQgc5IG#C@EHCZwtTO^Vu+y4V%T$gCd_6pb=81R?D!J^q3$XKpQw zbt%5TBqpWMpo>{NIYYyefa($9mk5FcUF?bis!y_{mR!u@$yvlTqV~YQeP9e&0b-LR z?qVK3GEMCgOX>r8+D3$5LI@J%X^SkWX=!SgT+G8q#!ApUU?mvP5>Qx=8hL1vp}xhE zIy|J^38p04IfC7xc$cEqI>L>f);U?u+b~d0&~FPc4>eilx{veF1Vi2Zmh|BfxoAZA z<%3{sL@u(V4>#2P=Hom*A@6y!U zkla&gaEsTu`3)Qe3eJCI|!>7eNiLJZq6cZ7E6nsghgpg;c#Lu zOFxsM{*I7b1Ue%8L4`yqYJx6WKYI_ee^TrLQlAx|z&7Xd_y-K;NyS%tB9Rdf-ylO( z2vjf~9)C(Rr$1ZF&Y+J=K)km6SDvZ?|1*QFRU#b`{!oC3C&XZD!Tf;|0_-Xu^}B%ue7RuwtIlD;fgZ!M=&O&GfGoGEr%pJ!TTYcfz`);8zUGK_eJ{`BdmZAsJ0Qg z4>vRGp}s5y2N0slJdjm9UR#C#qa|}>M5iw{n8O&sdnHF4*HBGB5J>TwU&#IOkavzQ zJShxS#-gf8V%N}tF@p0-2eAyQvAg#>>5q3xr;jrbGg#8r;9c>ZQPc-y#1U>#qT{AA zJJ%Fvw(axF_A7$IAx|SqZ^|(GYk77S9nfK{kaH2$)^fsyWBK4kV>$e|TIvo;_1pBh z(6en*7tcSjixth=SoicUsxSm%@IyoktQFc_L`~Xq;)P>5`J!W_-I z39;z2*o+n0T*$Oj$MA*kPhrZ8`XW1XV0foIvhWS=_{a6M?~KTZ9aJR{0WrcZ7jojP zgZTV+r!evOx<3DY>$Z^l7QD=_zWXw1W8yT`;<}@8K#p~u{E1m+KNHJx@5v|oH05i_ z3W$d2jR94uIOC}Z;hT8ofAHLKG%Y!nDKqNvPVteV$vQWXSK+(F2p{_5yJ`CUaWov1 zA{0MpdlQj(inO|rk9_eE<}E&!iO1Jrkz#}LNG8gA zg0$hu>^A;o?z7aGpyI^PSRr&Chw{0brtq<^y*JJe^NO*3?{`5NY)bgQ|LxB#`j3~X zv#I`Y0vAwi9l7)FX4b>|B7}Rj09l^Xd8kp`4aGhcViVYy|M7a@(CXxNXMk< zl*VyP``{RI-gPtYO2As7(>XHrmapIY0Y3J%_jWV>VuTOzRZGfY0dp1k%;p>0Hm3#dDJ9glwm zntUwV-LdB|$!wPTMw+chzu6xSDiRl9$y6B{CZu9gRKZ1g^t;m-iY87)Lj+79?2JN= zpLGxm9-Gd@-fFygNT~WvdpFf1_A3B!N2dCq;yOc}az`x3ddC6|r%38z~Gr0KbNUiRc9Q#1*WrjRQvF<6;9)I6BNzb5@F)_a+6I-th_` z0vKqGLN2)S5UzXZSVq663}kN)xJVHL%NB0o)h!*Qtr^g+M!-1oKA`5XE_R#^Ju**( zoGpCzGDDEm=Xq!2EoARUM-ilA2TeK2o{N+qEo}H>8$Z2n1Jx!N(CjZj5O1&wW^VjW zEb~B75yUm})F^2CP(+6i7j78vLx(GDAaq2IntIFCw;#9#Cu9@@@# zKm8{eeAe0fw1`hyv7X|K11u)h_tc&4G!5Gj3e{`wc|V3c^br# zUcL4Cyy0yA3$ih({z<8~XYYhrV_5L$bS9rvI?vv|;C;N_i-Di~<4fFj)jEt5(#Dkh zKr3Db0tLCS@LsTtIZ2YC%yHx;F26bq4M5W5iPP)IV2d)FA_AhcMj;n|{t*7lza2r4 zF=Z!v-o=(Bx6|>1&#YtFqAfJo6za7sr(tr#PG;fF^s zsxD1i7!jldV|G_-Ndh%(5QlB0>I~O3@9EhqTO;wwvhvL09em@=)x5a6m4+aNi^@Ju z0_tK}%gK;z0|l9pT#zvE7HB-Ha_acwuiuQLWGciejEQ~nhfS;H`rl3C(D&7{J3E_7)LogW3 zNkF&Mr)%u_ElJnCQ>w*s|E-&OiN>&8x6 zx5X)Q4dYXBd-n0!Qo|>1g#X&}9o&4$TAp9C zt5WOzzK|@28Y%81Y2?vQ2Bfo5nf(982>B%G;mG3}IN`%%m~=uNbqA%efxPANrhP-G z8yoPRqpC?|;${}MQGJ1Wx}PPLs8gDF_Dmo=vt$R~x%^MOxuuKRprY&jKANUJAY&pr zFA2a;5dwsKSz6`2k`f^;0e@c8%DOc>5x^$*a}|TMHH@E_;iQYka{hmRFXJa=`fR?% zQ1tWq3svGHxWu#fAAk2EK7!iHlD&OG5ETLpcCrC8sZ3>PyP-*Vbd|9*1S#rlifR*( zF{Y>&4qjc~LGvw}_#Y=c#qytRiPO$1OQQCR9xfgp!h z?2%q^1KAP^q$SP;?A+nF>58>f)mdhIY-~}>LAg*^?>l!nesJaUJaXR~j4GpNZ{Uza z4fyf#rHaGA|Euv@?jj{+4S@)^|LuA@cEw@SgP9gs2oQN=eJ9t=Uc=J+-e7c@J$wB{ zoGt1BonU}5ibMKQU}!MmUA&}h-rUaW2j5J5T!S#uO80@$b1ggh`su59Vb!2B{ry5v zN&G%zj3N!OHViBI$4GMVHa*i0l$*)C6`GuP*g$yX_Sczz?izNyksmT-Z{HANnNuGK zR3+P^VWx-UwmT&zgV!5DzRjS9NF6|k|GhfQ{uGq zN`nC!h3@ub(PpfZ_zrH2iKwkYE0V;h)ucASG)k%UkM zR0;FSzh1PK#}{v9Oe$TmvyRe2?68ddEyV0K)Tg*=;ZX!>Nv37_pIvYt|K>Zduzc}W z4oYW+sqkZ%BnDvEpfK|%99G5rhmU2_33aH~@?_@hiNw2?@9_No-(RD~SX?wLBj^&S z3qU$SYAes7i-%2O_NJdchOhqo{fs>!vPJYKFn6?Hz)k&=G*< z1XEk;lfY6UX4|pw&%OL$zI^*pq^iuIdH=j0c$vFFhJuKqod#%)qk)EIm*NBs=RhdD_#x2x27=L&b^mmv`7|xcVnk zx#U}i$Fr|o*|-OQBsKkNM+eNjd;;x0!VW_ot#K7Gfb9lkiwrdXv<$F;(B>k>y*ESC z!^d&vrzgbz_A&=>90($D^zkRIKa3-$)Uz|pW0Szsp}By*6_UgSg4t?7UmolR?TG@} zJLZ&8ELeU#@0;0B_5_W-qG0mt$ENt^L(`ac%4l|mAss&Ib`TX3J^J<%j1^1}|6S4h z+|iAJU^WaD)s3@pW8r^j?z{Q&kKRY7w)_bi#X?McD*3J{Rs8d#(|Kg!>$Lp%bvCVO zCzo?Yo&G6tO(la zjC;T6M={9#;V-M(`1!SeVa0>nsI|5nZaNi2JQ@)Pg)SZ?WS%pmN*Wg4R}?&Z?>eN4 ztAGA}jy`i#yxx~_JuJlR6=rYSn-Oomk|*EksA&ioduWDCO+N!q`y2hCfay`jgI9+R|4&O~S(SuPFIr1fY>eThi3b4#^c=6mlRakiBU$M)TFX-_L}}Ro!7# zz3Ra?`P~m+W&O%FcD)`F;Yl0A*h8zBdR7DH|Lq}_bv3iQ<+<@A&++(gww8K1a4BkS zp0<`Ov(75a_SHfF71|1l#AlE@qmZ-bzMH0&V`Jg(Cx*Wi@JZ>Fe23?MU->-q&wrW~ z_itmz>v@DY-cUWfzA?vx3t#1$Q&zF)#?44_-$5l{taMwbD{h)Zb=u+vP%3sWP{AUw z8oJHBUztRRlwHk@5xhdqIj*>N5?{Uh{bcHF+1r}^!VU!}$d)Y^a` zAsPh+lrn~fAcaKm!+&~#MK``&(dc7i1qBXye+@?*mz0Vv9T}2%&!JC2PnEDggtQgz z0V-QB3!Xj6z|{-i&t>19h%Z#fD5LNT*|;w}v5RkcieW8y_Qt*^L({{@ zGV62iif6qkAJf-f**TB>Yzx<)vxcoNcT(5Km_1dnBILYd>B2YS_lEK5ucDgBc%5a- zOMsYJwAd_jouH3d(q$UD z6|+}Rf{jn-fC@z&l?j4)OIkr&vdnd}Xz6{Dp}+BjqP@z94*Y>Jo81|OoHh5|G_@SZ z_(@gWCb?WFMD65ro?EY2#~n>CQEe?&`e(u=u_W;iC2nj5p{Vgh0z6cBFIdKG2T;wZ zCvxoCW=W0nM5XZuSm zbGd|HxL8XpG&gPJmQSz6bretb-p)|)mb3}UZBCPW1bSp%s1l~LXbJ9QdOL7$Ko!zo z1(3K5OkFBq%1Lp;M!A@CVH=t6@Z9>Tb=)!kC8})DZ?gAxg@BJ`DtFz_j8X?IF2{_)MVaQH+m4l^`Wl)!CjmON_!c@~@k^n1A*f9{%}jGz2Mh2xj9B z0oagSWC(u@J+g*g3Q)L7;x5j3&J!(8QCqV32>#GS|hj-N&tA z1;qEs%ri%G`u!1Ye+a0y6ln!aa&`K%i+98o=>}j!3S{ri&G9kr?|%9kqk>d?wR#06 zzG@sNuz7usm!E0xK42>AGm|;GZBrNPSGC4Bq8G2|E}+_mwEgjD&b%MynOL^FW3LXM zMvjpt#0zp=u}_6~)}+O7|My-YwQ$*x2`D+)~54_%7r}?|Xw^ zE_fLm#PQQEO5zEMxc2^l{Wf4z!h^TH%J2T)tJInP+#IehMXe2Kd+=_~cyM1ghr@mj ze5TT<04emEh^`P!pCg?iX6v;!;17$pG5_qRS--NiI{~6__s-s4#>Qpbb2}pLyk-M8 zU9y&ZTSE2*(X*#Xox>l0V?96o!VCO$a~C#A<|r-^WdHqc{cFe_SHHx+f8_8`Dg{~Y4f~}uji}8cu92lTWf=XnJUbkiqJl<^6>=`3%34mm@E|_;@o^k} zTrG76rQY({uAJkI7dv@&=?#&Gaa z)jdwHejwlBc>Tpr)-2x6llN`qmCYU0nIPslMSq({X+{N|ym|9Iob|PW4ENce1ALjx z16j*+HNy6%EvbnSU0Q4ciAjPgbHp5^nqc?aJd*8>kCaZ0>k4Nuq;17ZsrL!S3Ze6K z;;;zSV&fz3es0^mQ#yU2-OcL1>9F(_WzZlYspHM z543^5N-&aKC|y+Rd=k}KXX7%l0z{$qyrTGTuXLA_O_}};LM7mx5{S?cq^Pk0s_fQ} zVqf0(?sva~PgO7)JL2_Aink*l}By*zZ1yq@ct}iz;=h<1b1pC_a?+rzn z@MX-2VkMaUlRRy=WM~K!4U2E~2ucA(!wd~U$gc0)!|b2*b=~ic{?Hd`L`_Tzm;EwB z!$mPEl!1}L5fp`(^fd%|S{F5Q#zl=}O_sTyBI#s*NSwy;Wb;gh&MWe?J(Z>|Q2fYp zP$4MZrKtum^H=Z`Ud-aj zY3hDuNl(kuHbM+bghcp(BmZokwvXM%IWHaPkf*OGS%6cIyZC|ehKAp!s6A<9cQ9}i z*nUX+$~^5C{*v>yluGze!h%q-@SAOx^S5@e?d&|Qi!zK3fRRZ3enAy*8Ab^1Y&SdGty{`uhf37m^!U5)KHB0%`(}YxCs4(#)9)6-|PXOJC5tOs9FGAjEFt zGZ%(*p6LizWf&CzNkrfXdLxdM#HSe*IP$AQTF-3e%!RXP3F14C%Tvw0oX5FZI6JtP z*{eL99?^EIA!P!pj6yVWng~hOL==!Q0T~n0ew*i&)9&S*RlR)sWgDl8q&f6nyDnkb zxkBo@0X0+ev;zJe%nj6m*fjM-bi4rJSMOrhZ=uJ@R_+#5vN*Xkg2^K8Q#{ZRG3pzF z`Fl$`lcy~yQaC*C-zXM^B`{5$apb!|zh~L8;Afn_E8gPKr(lj!pyJ7&y*0a$mg$D{ zw+yL|2tr8iZLJ6e!N)n5iV`i#lb?StvsXdoW_@oAQuc3;H2}DjB4C~>%% zB;}KbR)%svpmA1#nmFZNh{!)-&;@sKdM|U|w-ByUV^9ZoUQ&ywzz;5C#U~WK+7O&7 zSVGzXB8{_BhLu%N@JW@GAj!{1aZd>HonLV3y#Vu=XJ9_1-rE<0Au+r5oB@}y{CtOg zSup3Ns0kuEapZjxd0)obq6390;1$G@HUU+Hv_}fR1Af@d%m_j{BB@jWAjwpdceQibA(=-eon`vmjjyEygf zNeEttm7v%J0of3}kPq~g!Aqz^U(IPy61BwNWOFGo$%ty1?* zlhmIi@&Fz`gD0l10pHg?Oop6KsZ#;0qX%3Q#~ia7gdNk4Bz2 z$e^czKUZNk_^B!Ctzb|bjyy_)M+-{^iVE>%sRbAHKKiZ6=S6!bWXJU_#RvhG6!F~( zo;}q+I~8;=*Z2crNGm`OV$%t65X$cFub2Y)lMQx;qQ`;0 zPcY*Rsk9-WP)Q)Jk?)e972Tr>UhHl)2ts_Jg6V$W2-00000NkvXXu0mjfeRuSn literal 0 HcmV?d00001 diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..29f781d5d 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import rariNode from "./rari"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + rari: rariNode, }; diff --git a/packages/extension/src/providers/ethereum/networks/rari.ts b/packages/extension/src/providers/ethereum/networks/rari.ts new file mode 100644 index 000000000..dd271600b --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/rari.ts @@ -0,0 +1,27 @@ +import { NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import { EtherscanActivity } from "../libs/activity-handlers"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +const rariOptions: EvmNetworkOptions = { + name: NetworkNames.Rari, + name_long: "Rari", + homePage: "https://rarichain.org/", + blockExplorerTX: "https://mainnet.explorer.rarichain.org/tx/[[txHash]]", + blockExplorerAddr: + "https://mainnet.explorer.rarichain.org/address/[[address]]", + chainID: "0x52415249", + isTestNetwork: false, + currencyName: "ETH", + currencyNameLong: "Rari ETH", + node: "https://mainnet.rpc.rarichain.org/http", + icon: require("./icons/rari.png"), + NFTHandler: shNFTHandler, + activityHandler: wrapActivityHandler(EtherscanActivity), +}; + +const rari = new EvmNetwork(rariOptions); + +export default rari; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..98f014354 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + Rari = "rari", } export enum CoingeckoPlatform { From 58e7766c4574e32ea6725c41f24ff84a750bfe24 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 13 Aug 2024 13:09:27 -0500 Subject: [PATCH 249/375] chore: cleanup public dev keyring --- packages/extension/src/libs/keyring/public-keyring.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index f67b69db3..c9a2048e8 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -77,16 +77,6 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; - allKeys["0x284Dd2384dd258D9C40808D87B1a79f859918566"] = { - address: "0x284Dd2384dd258D9C40808D87B1a79f859918566", - basePath: "m/44'/60'/1'/0", - name: "xyz", - pathIndex: 0, - publicKey: "0x0", - signerType: SignerType.secp256k1, - walletType: WalletType.mnemonic, - isHardware: false, - }; } return allKeys; } From c54337c0da5e9f0f039eda10d06a00e77019294a Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 13 Aug 2024 13:46:31 -0500 Subject: [PATCH 250/375] fix: simplehash nft types --- packages/extension/src/libs/nft-handlers/types/simplehash.ts | 4 ++-- packages/extension/src/types/nft.ts | 4 ++-- .../views/network-nfts/components/network-nfts-category.vue | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/extension/src/libs/nft-handlers/types/simplehash.ts b/packages/extension/src/libs/nft-handlers/types/simplehash.ts index 08efa9ebf..1aa2111a5 100644 --- a/packages/extension/src/libs/nft-handlers/types/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/types/simplehash.ts @@ -17,8 +17,8 @@ export interface SHNFTType { }; external_url: string; collection: { - name: string; - description: string; + name: null | string; + description: null | string; image_url: string; external_url: string; collection_id: string; diff --git a/packages/extension/src/types/nft.ts b/packages/extension/src/types/nft.ts index a7600f8ca..a1849f10e 100644 --- a/packages/extension/src/types/nft.ts +++ b/packages/extension/src/types/nft.ts @@ -13,9 +13,9 @@ export interface NFTItem { type: NFTType; } export interface NFTCollection { - name: string; + name: null | string; image: string; - description: string; + description: null | string; items: NFTItem[]; contract: string; } diff --git a/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue b/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue index 751b70c7f..f2f492625 100644 --- a/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue +++ b/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue @@ -3,9 +3,9 @@

{{ - collection.name.length > 25 + collection.name?.length > 25 ? $filters.replaceWithEllipsis(collection.name, 25, 4) - : collection.name + : collection.name || "UNKNOWN" }}

Date: Tue, 13 Aug 2024 14:04:58 -0500 Subject: [PATCH 251/375] chore: move simplehash types & ui fix into different pr --- packages/extension/src/types/nft.ts | 4 ++-- .../views/network-nfts/components/network-nfts-category.vue | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/extension/src/types/nft.ts b/packages/extension/src/types/nft.ts index a1849f10e..a7600f8ca 100644 --- a/packages/extension/src/types/nft.ts +++ b/packages/extension/src/types/nft.ts @@ -13,9 +13,9 @@ export interface NFTItem { type: NFTType; } export interface NFTCollection { - name: null | string; + name: string; image: string; - description: null | string; + description: string; items: NFTItem[]; contract: string; } diff --git a/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue b/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue index f2f492625..751b70c7f 100644 --- a/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue +++ b/packages/extension/src/ui/action/views/network-nfts/components/network-nfts-category.vue @@ -3,9 +3,9 @@

{{ - collection.name?.length > 25 + collection.name.length > 25 ? $filters.replaceWithEllipsis(collection.name, 25, 4) - : collection.name || "UNKNOWN" + : collection.name }}

Date: Tue, 13 Aug 2024 14:43:19 -0500 Subject: [PATCH 252/375] devop: add scroll network --- .../src/libs/nft-handlers/simplehash.ts | 1 + .../providers/etherscan/configs.ts | 1 + .../libs/assets-handlers/assetinfo-mew.ts | 4 +++ .../libs/assets-handlers/token-lists.ts | 1 + .../assets-handlers/types/tokenbalance-mew.ts | 3 +- .../ethereum/networks/icons/scroll.png | Bin 0 -> 10488 bytes .../src/providers/ethereum/networks/index.ts | 2 ++ .../src/providers/ethereum/networks/scroll.ts | 28 ++++++++++++++++++ packages/types/src/networks.ts | 2 ++ 9 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 packages/extension/src/providers/ethereum/networks/icons/scroll.png create mode 100644 packages/extension/src/providers/ethereum/networks/scroll.ts diff --git a/packages/extension/src/libs/nft-handlers/simplehash.ts b/packages/extension/src/libs/nft-handlers/simplehash.ts index b644ee64d..d5f93ed7b 100644 --- a/packages/extension/src/libs/nft-handlers/simplehash.ts +++ b/packages/extension/src/libs/nft-handlers/simplehash.ts @@ -25,6 +25,7 @@ export default async ( [NetworkNames.ZkSync]: "zksync-era", [NetworkNames.ZkSyncGoerli]: "zksync-era-testnet", [NetworkNames.Base]: "base", + [NetworkNames.Scroll]: "scroll", }; if (!Object.keys(supportedNetworks).includes(network.name)) throw new Error("Simplehash: network not supported"); diff --git a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts index 5ef2d8828..124c349e5 100644 --- a/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts +++ b/packages/extension/src/providers/ethereum/libs/activity-handlers/providers/etherscan/configs.ts @@ -58,6 +58,7 @@ const NetworkEndpoints: Record = { [NetworkNames.Sanko]: "https://explorer.sanko.xyz/", [NetworkNames.Degen]: "https://explorer.degen.tips/", [NetworkNames.Ham]: "https://explorer.ham.fun/", + [NetworkNames.Scroll]: "https://api.scrollscan.com/", }; export { NetworkEndpoints }; diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts index f84545f31..520d14fc5 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/assetinfo-mew.ts @@ -135,6 +135,10 @@ const supportedNetworks: Record = { tbName: "degen", cgPlatform: CoingeckoPlatform.Degen, }, + [NetworkNames.Scroll]: { + tbName: "scrl", + cgPlatform: CoingeckoPlatform.Scroll, + }, }; const getTokens = ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts index 48243f0e3..6c2386617 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/token-lists.ts @@ -30,6 +30,7 @@ const TokenList: Record = { [NetworkNames.Blast]: `https://tokens.coingecko.com/${CoingeckoPlatform.Blast}/all.json`, [NetworkNames.Sanko]: `https://tokens.coingecko.com/${CoingeckoPlatform.Sanko}/all.json`, [NetworkNames.Degen]: `https://tokens.coingecko.com/${CoingeckoPlatform.Degen}/all.json`, + [NetworkNames.Scroll]: `https://tokens.coingecko.com/${CoingeckoPlatform.Scroll}/all.json`, }; const getKnownNetworkTokens = async ( diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts index 89093b4b4..77462c163 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/types/tokenbalance-mew.ts @@ -52,4 +52,5 @@ export type SupportedNetworkNames = | NetworkNames.Rollux | NetworkNames.Sanko | NetworkNames.Degen - | NetworkNames.Blast; + | NetworkNames.Blast + | NetworkNames.Scroll; diff --git a/packages/extension/src/providers/ethereum/networks/icons/scroll.png b/packages/extension/src/providers/ethereum/networks/icons/scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..a5019f9c20898adc33ed40fca6692ac351232710 GIT binary patch literal 10488 zcmV zd9++rmH$8c+*@%TD7uLud437 zXYaH3IeUNiKEhrGRTaRnVui?}Md1#A?_br9`Ueo|;do{)&K(5I0cHRlC@lyXR1=7J z(U-7@mO&~&4(JDZfafvZQ>Z?R(e;qtAe{#f?r_cSZl8q<6>uV=6ZiDZhwSMa7zu`i z&T>SS*lpe)TzfE<;}JQYFgzCIPz=*aB;xo!Xk8xGf_2~=sEghoE-GU{B>LB@zmVv? zAcR`AhSMI5Jc02Z#)c1~`XJMfSwCFps>?h$5B3sen9>TMss<1d*(&sbM>`R75>DTQ zb+5s>BWZ8-Fs3f3TJ*0|2k6ifMoJX@Ph{uMtqpCdtA>c8fFKw#_&y}!;QNsx4dgAx zJch^$e7PNU_e%RweZzjv15`v@b4R9mn34)mpG89hr#{| zc@8nlA^d@K&R+vW>gm)QZqfEMri232XZ%*d53YR^PA|ss23oT|r7~1&^_hp+V*-CE zL<->mArX(1Azut}?$^Z3*QIUVE%lEHEH_iZBJ9zDtowL|Onv{lbHQCkEOs(6A94jy zLck!HJ$bKVfJ1QzJ}sGO0a~lA1oLmwam3GH$LHS@*dq$iSk*U7q4qs?7U(BQB~L~j zU)yOJj(gq_?sosa`zewj%H^PptZ!$6IgR8pCYnVRWy!u#@$*b|a zHzNZ1Vl)$s>}|7sWQcYq(2_Bzg0;WG+NIJlZxw7iHj{-(Q-I;KUZ1?Ll^JcHM7Weh zB0(b>`-w14eah$nBtGl$VX7~-4`g=7C3A>!dw=^F^~%#kGhUu*wkU()CAO^Jxp?rwj= zZ(*W-SQTMKwX)YDjylPoeYxmFiit&ntTxW8I9OZ;AyN68>}dA4EEN zC+XDj^t~+nra;7JAQzHO9Zx2Gr#^T8K_X)7@q+RH{CIz0Ncb;;<} zvKY(HjmZMk_ob>ES7(U(HXsm#Jd(J7vu<3S;p(f0VlSh`sK3-8 zGr)O{-ba2xTkD%AdbJ-h^`<<(aztnvm&IvFXPeJp{uk19^jpW8L>j%&R;=)3(UMSm z9{x8vJKjv+K!8YW)W5SEs747hRYgSbJP(W)F?9D@MG#QM1p%rWJ=1t##AhHE(Aj>D zZhH7y5&2j>cd!Fh{w3~efPL7O)7RTXC)Ud)Gd3VaVji^~@% zmdb>ott-J^2vuUS7}>548f+(ZikR^}kA$>ldrFY&XLU+%9Tf$mOTLutP#~CyyR3FnF2IS|DRWVg|5y^=o@It zqR(23mr3J-kn6woBd+_}_t^0KizHJC(#a&on4!tOm&+b#kcI_ggr1&WUUSl`xaDWx zAf1RK){alXorX+n_v!2Zn#@>m$w-4lFL^~>w#<_yORR2OeHxkMozw!0bK|CF+tA{* zxAN5EPw~OauHlaEd&y=qB$IKRi^Oh32(6_S1O!2db5pj!W<*HD<0O*_oO8ruF*f(~ z@afC`fonc@C3awNd<#QG5gh51N1^ftnR)cD8?xKo*LEvJZIn}Oc|3yze;|=Klyb$5 zm&_4{7Jphh|9ksy`P=tj$)9_A>1=N!tj_`g3Z*jDYL%93hJE*$#Xd8qlS(C{Ey7-A z4pbHKJf7R|0#81(flN9LKp2L!x3%)noj;~)#xyht#y7829m%9nt!|*p%!hd;Ucwc; zlo^jmoPS<@6wHg|PXe}7e<@YG8wX{y_ zU@EMLA$x$V>f45fHC zKm0~A={J%qjC;$cs+dHaEC27m@%Z`;bWQ6Z48yv@=J~?XkMXfjT?&N)VP8MK@8kP_ zStKGcf^%+I75YS7NIY@{OH2BVy5*5GrR(V1cNH7hg$1}e;-9HrLlXio)>=$!3wPey z%@3B}%(RX+!Z5`1JO&1HeD+fx;bT{Ql(2sQ4MKeXFE^(&X|aq({=~U!B6q%ar&8QO z0kpf@7x^d0mNkoMZFv=iqD2_jR5YH4Etk3Gx^E8o5a09Y?;qqn?>L7mKYbZtZ$F;M z_yQs?V=DxYLdnvSJ%KH27K{ATPU{S|8Epk&#R{jo%){xY8K2t+z&eLyGyHG&N>)C& zhHN&20_94TgXYfR+JF88TB%TP1v0K{y^QT4jaE3HR8?WciX9e$+iFC#TC{q}BWKc* zJdS+PVa6Hmt^2$G`T1=GK{%8;D3(fm^aB?#?Z7#NTY87gzH<(zQD>Ki%`)``;L8{# z1dl?|kxrdJ@1tkPKmF6~+eZkuHwn?0TYD+SDC69js489}&fuRm@xS-}fpj{FqLeFD zUUAq#{M|dxL38=7dtX&dHiL=Bwl;S{pjyS1$}gz|sv23G@!a$nFz(du#6t0Xu$4=J z+u3eKH>3btDPC*m5#tOBMaH}GcTVw=2_AanabEb-CNk+Hf>0`zS^WA%wCpnr+t(j$ zkyMd*oEvYrg-6#tNh+DdT1zIK;&rFKnj?=r3M~|O?I!Bq_tU9i$}_do83IjMidm$~YKK;2683SQt7!(E1WA&p?P_5Qz$)<5m ziN|7`@w$^yyLDI6P=N3MeHLvC!?|2JZ3#O_L2wLY64h+5*xQrEbSyNX4RTU8lb>r#` z>fTAI3{9vR5CEsFf9Cn2nHz>7ogM8Q`HDl3T5Vfls?w6p5KkoNXxo|_sMTtG_=?Xk z|Hwl*dEv=BD1oX%JkI)OHt_u)-+&*B0!$MP5#bx({SmoBk@tV_LhL|pYPtgvL#YI+ z=jz7QSIO)J#k$Og*gOWX_?$*2yB~$(xD!5&>tZb%H}znQAP7MaGV8!Drgd~g-L$qt zgB4_*!`3ZCA`vH_FYuEaZsp{^c`Z(LC;L|=8IO}lrf6@=PKp9Vag01a{pGKD|9k&- zDlb$G)taLvvpA;QDWnNc+<&Dq13*U?S^EAT(2v7?s7Pl_otaG$vGbB?9aBc^m zUaJL!VL+u)#q*-9vvZ2^Jo*O*A+Wn7AzA0B)oRpg;Up-4;`>UqQs#g;`#?N~t5oo& z>Q+|7;dz3}JAfM-GWYAIz-r&qZG?rtp;Q)By=JCdN3y>c5vW$U>SGu44;Q`z8(QA` zkx#LuHwp_kk|(=^=XoTP36hC8c7nMBB0?C3EPTz0eENzHL4&R~bzvgex-+$ZRlCTs z1F9-MD^_?wNLW0TY-W11%s-)D1AF9U-)W@ctaO`IDLu;nsT zYm`f+(IrisBa_XL>1eBWbZy2H>;{c%RBLFtvX_Lg#SxDQ#nRcpEi42d7Dn}DJ+g>u zE$X$~w9!)#!@+aspmhrni~02Q_Vf7qXP9x|99*S_=WV^7F$VDr-WUc{twlr2HetjG zh6sC!@B!3BGM3jgh$2Qrl%7Kl!pJMARB1ZjN|pIX9ER_Es8fs>s+B5t-F+W2yq$X! z5OD^i9y*?!*A(~r+d+g%6@*u?dF@;gska;v?|53XKF(RBdB)Qi1C=Vr9diUTr%$66 zhB#GHsU*L+`8Sj|Z^6W4P0Np~Dq&~|t&RSj>{tD|Q0fr)hava7` zZ@J#Q>xtm1HD(>SAFqDZ(fsn(Zra;gNT*Y*dF)Ak{Ii?5=;8~py?uD&3jRBC89FczpPl1%c*sz+G<%iBmM;<(Am2W*2V{d&e}r|{}iUR_s$Ddr*s zAqXRx1HL}}U>k54)oS$TCc`rZ%@*;zeUeN%MLLyY?c?iN`q?jW?N>fa zxTSy06fox;UNXU|N7ix87r%z_JlrHi0(XE2sN?fr{wB9B{}!(~?G$XGIHm>d1VX6Q z06A2jez46a>&*pb5{977w*ex84MGx~?OcBGyLso|e}a~5nlQ9&AoVI2!(@Tz)lo-`0)a)rqrXZ+YWX z39ZH2aL>HLkTA5U3+e1=V~Xa8BW7wU=_4FwKn^ArB?Tw+vh|tp@1Oew`^=g_xm-m= z@I4P}E$6=HAG!B8zs1XDq63-6bO|L4LW0l|1e5#wY$x`T#u#j|%mIhb<$Kp(!`bIw5*3PghGZf^|3Hq9eBz(^-R(ai5s!~b z8;vngEOF+-Q&@TXkE77=WLw^P@JWm?f8OE5vl+BpowTs@s1P;y0hsF}a=>I=*YiDW z{~)Km=`_CerK`E{L!Ty7*%W_$|HnKn=y@PbN1Quez#ni z!n1!H%<+NgSPQB$8AX?#?_>K0IRApTlSn3b|3|K7^X6W_@$R?3nU2{rp;{Y#VnqZE zLfjr?<}}g+GS%trs#4Fv%V)BSc2AS zW4;j)nY#J-sRgOayu$}=9qXcNJn%dZ*EhhcPFTRJUV9>7pioAwgE7*oCYu!;1^)I@ z%DQuaw)j92b$g^L!+0L9RK^ubAmEvLH?Xl}qxT3aIHIg;sXVn!{`QDyRv;$rqmp8h z7_>V>R6V=(|LOv;3a(ZcQJ@GW%ci*=Ikz}Iaoa4k-9TQR3i{+^o_T3#+ zK{e@*x9+d`s1Kr!+$}lh@KPyOKCp_vzx30@;&H-oqA6k2DeGyLefKN8;jA;Tg~C(| z`|chh-d|1`t}5|(oJ1lyX`x`>^XTdA<7?me0dIKYX?qzrAcBu-Q`)^v6{u=t{wL4{ zY&~OMan_PfCc&7!uYZwZeT=C9nLQpn881W#f`D4BN-i%GZULfolw;0*`|$Bg-#;m9 zj;6v0I9K*jSHkl%grV-0HjJ&I;MbjeJU{*3*NDerQCZqVLKQKFSqJQg7E622 zb}(vNCg3VQNFHOR@9BFQ4@3llfH?=wVa^eUPHrBcQo-#_!f(JBu#)qEemnz{L#CcM zh@iCqSE)|wWgAVP_A)4*5d!*sU^AWvd*JBuW@D(e{1nF?FCY=odbG92059y>yZP&a zbB=OEzuWT-uvMQkz_ZQh1okpU0O!c0(;Rxx0a$C<(%X;PaPnP6M5hH=dxwXW+;{>CycBpo){{X5ZqHf z1^X;5-X>!HzSM%fP63>AnAR*?UU-q4f4zbiUi|ZvRDyIW#lHK@Ospdf zxg0ZRPG{ym)1gvmR#EouAt=5t*xDuv_E}#JK5kGqKfIoJyrBSl4V-hBmMk~@@-{wr z*-~D3apTqwnNtv+?~}cK9dXH^;Y&h^dMY+AEG*0UO-7Cpi+BM4nA%$N(PCn zCgv}!A3CsCz&eMQN%P>n4{-i_KS~%{rgwF2=f$R$BB(0XI@UhEocaaO%ts4B=cay6Kou_*qr9b$hu1zqI+Y>}Ll6ixiV88ul;mVbX z*%~T}F&=~Y5a-E(a#d4L;lzJrZDTj*$QjW~mKMd@tI@RcjhC7VeQ+6gO+LIf(+kSCto%y0j& zo|S7h0FX^52!fEVX`MX0Zawe1=yGoR`8P==;^Qio-8EE6CWTVvac0bWHtG??3QuH7 zsGA?Yn?!sbrApIU#7rhcq84=f&YsDsixxpS2XUWw{M~tcV*N9GYU#E7=!TnUYi+3? z+T`=%<^i7mV=qfDIh$gxgg=qnFo_yhl-|9F?g!WNh40+K18bkBJ)0s30;YGi^Sj?a z#8sd964!m{YTUpe((Ltsh$9gf%H{6p;4}dZLK(UWRh|I{fBpP#)*eB@8H?wDwPSXi~bx^GasB^Sr)2z7XLDsHXi%F%L z*KS6{l1?cizmd*^2csio8a;wIul^zZ3Dyd#Q(z4+g65KJEoV>{^#^!#-IM(1_1AOV z=fBEhk30^^MATZ=7+k5$%tPmL(fMy9UnpY4kcfG_xOspF);>=v8N-c&jXWNB#!xEP zIAC@s|8U-^lqvyYqH5{ET!CBex(Axs=|t5KS^@W?=#5C`4M9gw9qOIri_epYPkA?> z){$<>GNY>#YeN)ADwX8^ht_b(rT>@9ulg76x$h4!Y!-dY-Xq#b!aUQ zu6;f_s&*1%N1kUWmTN42-O=nby^UJ^^f1r!Soz=@sEwgUa%WH+iG(3v_#+{A)!%hc zR{#-F?e6wv_JSfJKO>z6ousKS28akQ4Ds7rdCMD5qg*Z%i^Twl$Ky=vY{!qqNYq`x z@b5{r#$kudW&i#5p;ilk$nQV>$1PNAA>JewcZdkpAY{K8Z5(mXEGpF~mJyHnYB>R>PV+R%#Wi^;oW}YG|{c5e&NDM;Ku$Jxk6Z{ichUr>M)pk@1c)e@;=U3 zbSj%RZ62EGQKxaY12tSkP-{uGWSFz>EP{IQ$ny-F`|{L+aMEL7s!H7Vn7eQ1P&(W5 zJ$m~GDU{35j9q}iBVP!y_Pfy=3*FW~)gdBIRgFwLb}eCW2Q68d>Q;a-B$G+;)9+u; z#qaw&vY9lsT0pfHpw1HRVgaRMNG790B^v99YBiX&Lnd~B5CwngiL7Wl8xmSK{vElh zC7XdDxI<ZxaWapR_;PTmI{FbB5l(j_8bErYono);ZYud1X|2|Um2k>*mW(3dL`c^^UR z4X=(xrxJN8Q2ZHTTn!Ie|iH+~)?44pJ}kiqYQI z!iMKxBsvfz#*)bc)$CyCOf0l1e0acEbz&?)ML& z>23GNB7*S@TB~6TMO>kX%@xof*oJClt%G!m75CiFAOEz8MEx{!YaNFjIDgKVcoNvNF`#R5Cj2p57>`bTMKSn0U?blfQpdcsjV$pZn=F0 zzgTu7epd%UF!JN%gCM}`?Bu_`{XhKXw<~FB$>LP0R6`D)Go2HUK7dlCHfiPEp>?!n zlRWa&M!xgQ`)J8Ti_*Y`OzUXltkX}0N_Ffsu|_8_k*lIb-_<*n;!b~EWQo;f%RK2i z`gZb#TWQUDs7{&{Fh-zU;nlBRz!8VdrCd+as49tMf)9P-8rD6qnpoE~f*{=OEOE{e z1|hK-)A{|KzvYUhU!*0I#<{3PU8z!I$r;BoqqCJDnD|FjA|Ibg#mN<`T>7s+r7u^+ z_oIA4E??x#g(q>yQHSHo<*}_tR4uJpk9_e~nQ_dmx@_4tr-cs3uGQo84jA`6@!_B<)-5;V_3+l(z3WZXY17>&f?z4_(uu!gd8g;vT*(SV<2wm-2dio3e z?I*v-J*%G`n*G*Vvgs68e)yvCl(#F!2&GCuT&`4A8ItAB#(KBER6l1{|MbwmGJV>| z>Fc)`GbuX)RYi@V8d^?Yd=U>m{1|PmS%UiU@}+W_L_E%=7hlLl?>UeC=k5=&*f2Vv zLM`CQ$DiW*Z~TC7eQz1Y2=ThIh(u=izdv^Yi_d%|)m(X-lS_7fPoum4AxPxbRF&Sr zBDdc27@z<49c#W~whSd+Q;k38Bmmstx5^=&Xj9SfEOD>mZ z_N#Z@Z^Tg+`Hx();+t4WZWkik71o79*eQLr|pD%d@UAD}VB}=UKKJt2!$=fKE zEsB{i{?vA`*5b9d@vEQT#`*8R0&5-FY&zlq5>dfwwSZE&jIF=dXxr-h9_e(NSj^uE zA26bY<%^Y<9))@-)kqREjjAgnGE{D@M8zv2LNei#s%QB`qLB8ME&VJ!<#>Mj!!I+f zqZO^zM&ETTB0xCeF^^*9beX;2u7>P(_q7oTamW>HUj0=%JN}X0fe<5;)?cWh1oy01 z$$KxkiYL}@ptZGyc-%*w)(5?De$TLD<}|V*yILeh+s2XW@rXUZPCnSs9arxnBO(+_ z70Trb7oGnWzIyGa$)r=bauwr^sZCyF`nU9bRc0OgVeRhrced@@;l4)p+YMK+A-_d_StRjiRZeGft!X_}EOJ zQs0q;mU5*+Xe~z_eh627^nJYh{BxjI#RX$56piBj9;Nac0(&yEo~*!mZg-}?fe}AT z#2{H>wfC{3h?)BcZHgcqnO$rWoVA!l9MUN^JpME{{OS(wSaBauJhg%TfgH73FcdQw zDRfkym%2r9j5atTBBW9YI@{Yg=BUFsckvl4dCQq(W^_daP#NP1WKNa1uNbdP$(<;( zk9>3_rhn@bjRFm`qMKH~hxWGbkt>9tliF&oAuunMgj5pB75aO6d2!=r1_tw3>!?OY zqP*m9MLPjYPzy&i647xxVSW8E0*Fwp)~RQi6tkvJbRV~fdGh&_IJh$r;57B3rWleKL!ooIhvUy zqx}3>Bcn=`*s0Z`RyK`$AD;mY=xmR%rT03SdFr*MOr80P$%syrF_AH;#V9eXNh(fl^li3S4Q^}uAwfY>{ zbaede%a|BAXUV30s@3PH6c$IqU*?Tf_|Swz?@*BFg_VcW(sl=l!~x_BA@Z^%Xev}g zTC$Pw^Mhx|oRikSRGfb#7#(MNAJ?e>Rg3R=q|;C;T`QeOeLQ-5?5q7~^?zPl{ zRdlxdKqH&-GKNFdp*T9*eJa6fa=F*a%=zEZ?rtAsLWBh9T`e=UgO*deK;A)Pb~7QV{k11HOVC#-73_Uqh|3BjbqPlx+1 z-L&dV63Krjn?90(L2!RrXBLeLs!{m7tp$puC#Z#&%Z&Lq!&WBNMBl=s1<ew7^qCOGXd_<;uMvpOelbBXd8=vwk@C=-_I- z7tzrApnu)D;4UW~KMBu3z6eT)VA$Jw7b*^L2tKV@2to*gd%;{M9Y_2Oc6|OlfhjS& zRF`?f^VvGM_DuxtgBbIAS~5PRGE{4kRe*8RXeJENt|lT3CgO&4iikGHZTRvZ(l+mw z`o{#8o5?o!JHwP3NLBU3h;3|ov~SIPFn@<~9?9eZ#5^dKp%yq07d5qH&#^%wf$Pw{ z#AAk3Dx!Xs%FkiU4d8uOI$yD-{_$;G-&DYqQh)~P7D0zxL(jSv2u>&Nza6Wmkxa}c z=0^=6D%B`Yj@0Wg>YYxTU$~<6)6DCZNCjg&k_kw}p%y@;@@I_v2IOai=1!S@L_T^R zHLzT!!i?V@Q&IsMsQXA6K4Wy?(N4siOsHp~ZXwPcNqeh@F%X84QiNf&;%=OOphIo& z>%C=mVKKG_rgZ2SJ*|Jwh#}@fJPt7*oTE;IdkoLqjgebWw^G`V>KpcR9#Lu5l#P5& zX$5GYVLD+s!)KAI3WIA8Ca@=9%yC#f2J~=@OeY?X6N}X=IyE}4$GS*xQOVHO3pAL) zVxq2Go`D8cyWWh7YPE)=2XsB2Sq1U{9uLqq@9E*I_qz3hJ+!JHE%pip7>*%jSg}HO zMuFD8r`w=(AkH0%_;Ydg5MX~`I?w^Mf+kT(4fQ^XPEfC+6cO@3Kd>2i0b`!Qx@Ym_ u2_$?@I*uLK;hNpuJ_{Erdx_A8RHc>x literal 0 HcmV?d00001 diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index daf736213..3e8253adc 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -43,6 +43,7 @@ import blastNode from "./blast"; import sankoNode from "./dmt"; import degenNode from "./degen"; import hamNode from "./ham"; +import scrollNode from "./scroll"; export default { sepolia: sepoliaNode, @@ -99,4 +100,5 @@ export default { sanko: sankoNode, degen: degenNode, ham: hamNode, + scroll: scrollNode, }; diff --git a/packages/extension/src/providers/ethereum/networks/scroll.ts b/packages/extension/src/providers/ethereum/networks/scroll.ts new file mode 100644 index 000000000..814749bb8 --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/scroll.ts @@ -0,0 +1,28 @@ +import { NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; +import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; +import { EtherscanActivity } from "../libs/activity-handlers"; +import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; +import shNFTHandler from "@/libs/nft-handlers/simplehash"; + +const scrollOptions: EvmNetworkOptions = { + name: NetworkNames.Scroll, + name_long: "Scroll", + homePage: "https://scroll.io/", + blockExplorerTX: "https://scrollscan.com/tx/[[txHash]]", + blockExplorerAddr: "https://scrollscan.com/address/[[address]]", + chainID: "0x82750", + isTestNetwork: false, + currencyName: "ETH", + currencyNameLong: "Scroll ETH", + node: "https://scroll.api.onfinality.io/public", + icon: require("./icons/scroll.png"), + NFTHandler: shNFTHandler, + coingeckoID: "ethereum", + assetsInfoHandler, + activityHandler: wrapActivityHandler(EtherscanActivity), +}; + +const scroll = new EvmNetwork(scrollOptions); + +export default scroll; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index 48bd18ea7..f5f6dfc52 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -77,6 +77,7 @@ export enum NetworkNames { Sanko = "sanko", Degen = "degen", Ham = "ham", + Scroll = "scroll", } export enum CoingeckoPlatform { @@ -123,4 +124,5 @@ export enum CoingeckoPlatform { Blast = "blast", Sanko = "sanko", Degen = "degen", + Scroll = "scroll", } From c1430511c9b50a3759ce7f167d55fd4a2dfa5559 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 13 Aug 2024 16:43:06 -0700 Subject: [PATCH 253/375] devop: solana wallet-standard connection --- .../extension/configs/rollup.config.base.mjs | 6 +- packages/extension/package.json | 3 + .../extension/src/providers/solana/index.ts | 2 +- .../extension/src/providers/solana/inject.ts | 175 +++-- .../solana/libs/wallet-standard/account.ts | 67 ++ .../solana/libs/wallet-standard/icon.ts | 3 + .../solana/libs/wallet-standard/index.ts | 1 + .../solana/libs/wallet-standard/initialize.ts | 8 + .../solana/libs/wallet-standard/register.ts | 83 +++ .../solana/libs/wallet-standard/solana.ts | 36 ++ .../solana/libs/wallet-standard/util.ts | 23 + .../solana/libs/wallet-standard/wallet.ts | 368 +++++++++++ .../solana/libs/wallet-standard/window.ts | 57 ++ .../solana/methods/btc_getBalance.ts | 39 -- .../src/providers/solana/methods/index.ts | 6 +- .../providers/solana/methods/sol_connect.ts | 89 +++ .../solana/methods/sol_signInMessage.ts | 37 ++ .../solana/methods/sol_signTransaction.ts | 44 ++ .../src/providers/solana/networks/solana.ts | 3 +- .../src/providers/solana/types/sol-network.ts | 3 +- .../solana/ui/libs/signin-message.ts | 47 ++ .../solana/ui/send-transaction/index.vue | 3 - .../providers/solana/ui/sol-connect-dapp.vue | 12 +- .../providers/solana/ui/sol-sign-message.vue | 147 ++++- .../solana/ui/sol-verify-transaction.vue | 610 ++++++++++++------ .../src/providers/solana/ui/types.ts | 20 +- packages/extension/src/scripts/inject.ts | 6 + packages/extension/src/types/provider.ts | 1 + .../extension/src/ui/provider-pages/routes.ts | 10 +- yarn.lock | 50 ++ 30 files changed, 1598 insertions(+), 361 deletions(-) create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/account.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/icon.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/index.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/register.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/solana.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/util.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts create mode 100644 packages/extension/src/providers/solana/libs/wallet-standard/window.ts delete mode 100644 packages/extension/src/providers/solana/methods/btc_getBalance.ts create mode 100644 packages/extension/src/providers/solana/methods/sol_connect.ts create mode 100644 packages/extension/src/providers/solana/methods/sol_signInMessage.ts create mode 100644 packages/extension/src/providers/solana/methods/sol_signTransaction.ts create mode 100644 packages/extension/src/providers/solana/ui/libs/signin-message.ts diff --git a/packages/extension/configs/rollup.config.base.mjs b/packages/extension/configs/rollup.config.base.mjs index 6f83f2904..5f26a0aeb 100644 --- a/packages/extension/configs/rollup.config.base.mjs +++ b/packages/extension/configs/rollup.config.base.mjs @@ -4,6 +4,7 @@ import nodeResolve from "@rollup/plugin-node-resolve"; import { uglify } from "rollup-plugin-uglify"; import inject from "@rollup/plugin-inject"; import replace from "@rollup/plugin-replace"; +import json from "@rollup/plugin-json"; import packageJson from "../package.json" assert { type: "json" }; const enableMinification = process.env.minify === "on"; @@ -20,8 +21,11 @@ const base = { __VERSION__: JSON.stringify(packageJson.version), __IS_OPERA__: process.env.BROWSER === "opera-edge", }), - typescript(), + typescript({ + exclude: [/node_modules/], + }), commonjs(), + json(), inject({ Buffer: ["buffer", "Buffer"], }), diff --git a/packages/extension/package.json b/packages/extension/package.json index a123abd39..a147886d3 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -43,6 +43,7 @@ "@rollup/plugin-replace": "^5.0.7", "@solana-developers/helpers": "^2.4.0", "@solana/spl-token": "^0.4.8", + "@solana/wallet-standard-features": "^1.2.0", "@solana/web3.js": "^1.95.2", "@types/chrome": "^0.0.269", "@types/events": "^3.0.3", @@ -50,6 +51,7 @@ "@types/lodash": "^4.17.7", "@types/utf-8-validate": "^5.0.2", "@vueuse/core": "^10.11.0", + "@wallet-standard/base": "^0.0.0-20240703212708", "add": "^2.0.6", "bignumber.js": "^9.1.2", "bip39": "^3.1.0", @@ -97,6 +99,7 @@ "@polkadot/wasm-crypto": "^7.3.2", "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-inject": "^5.0.5", + "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-typescript": "^11.1.6", "@types/bs58": "^4.0.4", diff --git a/packages/extension/src/providers/solana/index.ts b/packages/extension/src/providers/solana/index.ts index 918228e47..db57526e1 100644 --- a/packages/extension/src/providers/solana/index.ts +++ b/packages/extension/src/providers/solana/index.ts @@ -40,7 +40,7 @@ class SolanaProvider this.requestProvider.on("notification", (notif: any) => { this.sendNotification(JSON.stringify(notif)); }); - this.namespace = ProviderName.bitcoin; + this.namespace = ProviderName.solana; this.KeyRing = new PublicKeyRing(); } private setMiddleWares(): void { diff --git a/packages/extension/src/providers/solana/inject.ts b/packages/extension/src/providers/solana/inject.ts index 0bbcf7969..9a9ddc259 100644 --- a/packages/extension/src/providers/solana/inject.ts +++ b/packages/extension/src/providers/solana/inject.ts @@ -9,113 +9,107 @@ import { SendMessageHandler, } from "@/types/provider"; import { EnkryptWindow } from "@/types/globals"; -import { SolanaNetwork } from "./types/sol-network"; import { InternalMethods } from "@/types/messenger"; import { SettingsType } from "@/libs/settings-state/types"; - -export class Provider extends EventEmitter implements ProviderInterface { +import { Enkrypt, EnkryptSolAccount } from "./libs/wallet-standard/window"; +import type { + PublicKey, + SendOptions, + Transaction, + VersionedTransaction, +} from "@solana/web3.js"; +import type { + SolanaSignInInput, + SolanaSignInOutput, +} from "@solana/wallet-standard-features"; +import { initialize } from "./libs/wallet-standard"; +import { EnkryptWalletAccount } from "./libs/wallet-standard/account"; +import { SolSignInResponse, SolSignTransactionRequest } from "./ui/types"; + +export class Provider + extends EventEmitter + implements ProviderInterface, Enkrypt +{ connected: boolean; name: ProviderName; type: ProviderType; version: string = __VERSION__; autoRefreshOnNetworkChange = false; - networks: typeof SolanaNetwork; sendMessageHandler: SendMessageHandler; + accounts: EnkryptSolAccount[]; constructor(options: ProviderOptions) { super(); this.connected = true; this.name = options.name; this.type = options.type; - this.networks = SolanaNetwork; this.sendMessageHandler = options.sendMessageHandler; + this.accounts = []; } - - async request(request: EthereumRequest): Promise { - const res = (await this.sendMessageHandler( - this.name, - JSON.stringify(request) - )) as EthereumResponse; - return res; - } - - requestAccounts = async () => { - return this.request({ - method: "btc_requestAccounts", - }); - }; - - getAccounts = async () => { - return this.request({ - method: "btc_requestAccounts", - }); - }; - - getPublicKey = async () => { + connect( + options?: { onlyIfTrusted?: boolean | undefined } | undefined + ): Promise { return this.request({ - method: "btc_getPublicKey", + method: "sol_connect", + params: [options], + }).then((res: { address: string; pubkey: string }[]) => { + this.accounts = res; + return res; }); - }; - - getNetwork = async () => { - return this.request({ - method: "btc_getNetwork", - }); - }; - - switchNetwork = async (network: string) => { - return this.request({ - method: "btc_switchNetwork", - params: [network], - }); - }; - - getBalance = async () => { + } + disconnect(): Promise { + console.log("disconnect"); + return Promise.reject("not implemented"); + } + signAndSendTransaction( + transaction: T, + options?: SendOptions | undefined + ): Promise<{ signature: string }> { + console.log("signAndSendTransaction"); + return Promise.reject("not implemented"); + } + signAllTransactions( + transactions: T[] + ): Promise { + console.log("signAllTransactions"); + return Promise.reject("not implemented"); + } + signIn(input?: SolanaSignInInput | undefined): Promise { return this.request({ - method: "btc_getBalance", + method: "sol_signInMessage", + params: [JSON.stringify(input)], + }).then((res: SolSignInResponse) => { + const accExists = this.accounts.find( + (acc) => acc.address === res.address + ); + if (!accExists) { + this.accounts.push({ address: res.address, pubkey: res.pubkey }); + } + return res; }); - }; - - signPsbt = async (psbtHex: string, options?: any) => { + } + signMessage(options: { + address: string; + message: string; + }): Promise { return this.request({ - method: "btc_signPsbt", - params: [psbtHex, options], - }); - }; - - signMessage = async (text: string, type: string) => { + method: "sol_signMessage", + params: [JSON.stringify(options)], + }).then((res: SolSignInResponse) => res); + } + signTransaction(transaction: SolSignTransactionRequest): Promise { + console.log("signTransaction"); return this.request({ - method: "btc_signMessage", - params: [text, type], - }); - }; - - getInscriptions = async () => { - return Promise.reject("not implemented"); - }; - - sendBitcoin = async () => { - return Promise.reject("not implemented"); - }; - - sendInscription = async () => { - return Promise.reject("not implemented"); - }; - - inscribeTransfer = async () => { - return Promise.reject("not implemented"); - }; - - pushTx = async () => { - return Promise.reject("not implemented"); - }; - - signPsbts = async () => { - return Promise.reject("not implemented"); - }; - - pushPsbt = async () => { - return Promise.reject("not implemented"); - }; + method: "sol_signTransaction", + params: [JSON.stringify(transaction)], + }).then((res: string) => res); + } + async request(request: EthereumRequest): Promise { + const res = (await this.sendMessageHandler( + this.name, + JSON.stringify(request) + )) as EthereumResponse; + return res; + } isConnected(): boolean { return this.connected; @@ -130,14 +124,7 @@ const injectDocument = ( options: ProviderOptions ): void => { const provider = new Provider(options); - options - .sendMessageHandler( - ProviderName.enkrypt, - JSON.stringify({ method: InternalMethods.getSettings, params: [] }) - ) - .then((settings: SettingsType) => { - if (settings.btc.injectUnisat) document["unisat"] = provider; - }); + initialize(provider); document["enkrypt"]["providers"][options.name] = provider; }; export default injectDocument; diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/account.ts b/packages/extension/src/providers/solana/libs/wallet-standard/account.ts new file mode 100644 index 000000000..a35583be8 --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/account.ts @@ -0,0 +1,67 @@ +// This is copied with modification from @wallet-standard/wallet + +import { + SolanaSignAndSendTransaction, + SolanaSignMessage, + SolanaSignTransaction, +} from "@solana/wallet-standard-features"; +import type { WalletAccount } from "@wallet-standard/base"; +import { SOLANA_CHAINS } from "./solana"; + +const chains = SOLANA_CHAINS; +const features = [ + SolanaSignAndSendTransaction, + SolanaSignTransaction, + SolanaSignMessage, +] as const; + +export class EnkryptWalletAccount implements WalletAccount { + readonly #address: WalletAccount["address"]; + readonly #publicKey: WalletAccount["publicKey"]; + readonly #chains: WalletAccount["chains"]; + readonly #features: WalletAccount["features"]; + readonly #label: WalletAccount["label"]; + readonly #icon: WalletAccount["icon"]; + + get address() { + return this.#address; + } + + get publicKey() { + return this.#publicKey.slice(); + } + + get chains() { + return this.#chains.slice(); + } + + get features() { + return this.#features.slice(); + } + + get label() { + return this.#label; + } + + get icon() { + return this.#icon; + } + + constructor({ + address, + publicKey, + label, + icon, + }: Omit) { + if (new.target === EnkryptWalletAccount) { + Object.freeze(this); + } + + this.#address = address; + this.#publicKey = publicKey; + this.#chains = chains; + this.#features = features; + this.#label = label; + this.#icon = icon; + } +} diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/icon.ts b/packages/extension/src/providers/solana/libs/wallet-standard/icon.ts new file mode 100644 index 000000000..d5952dbc7 --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/icon.ts @@ -0,0 +1,3 @@ +import type { WalletIcon } from "@wallet-standard/base"; +export const icon: WalletIcon = + "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODEiIGhlaWdodD0iODEiIHZpZXdCb3g9IjAgMCA4MSA4MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNy4wMDU3IDE3LjAwNjJDMTguOTMwMyAxNS4wODE2IDIxLjU0MDUgMTQuMDAwNCAyNC4yNjIyIDE0LjAwMDRMNjcuMzI5NiAxNFYyMS44NzQxQzY3LjMyOTYgMjMuODMwNSA2Ni41NTIzIDI1LjcwNjcgNjUuMTY5IDI3LjA5QzYzLjc4NTcgMjguNDczMyA2MS45MDk1IDI5LjI1MDQgNTkuOTUzMiAyOS4yNTA0SDM5LjcwNDVDMzYuOTgyOCAyOS4yNTA0IDM0LjM3MjYgMzAuMzMxNiAzMi40NDggMzIuMjU2MUMzMC41MjM1IDM0LjE4MDcgMjkuNDQyMyAzNi43OTA5IDI5LjQ0MjMgMzkuNTEyNlY0Mi4xMjQyQzI5LjQ0MjMgNDQuODQ1OSAzMC41MjM1IDQ3LjQ1NjEgMzIuNDQ4IDQ5LjM4MDZDMzQuMzcyNiA1MS4zMDUxIDM2Ljk4MjggNTIuMzg2MyAzOS43MDQ1IDUyLjM4NjNINTkuOTUzMkM2MS45MDk1IDUyLjM4NjMgNjMuNzg1NyA1My4xNjM1IDY1LjE2OSA1NC41NDY4QzY2LjU1MjMgNTUuOTMwMSA2Ny4zMjk2IDU3LjgwNjMgNjcuMzI5NiA1OS43NjI2VjY3LjMzSDI0LjI2MjJDMjEuNTQwNSA2Ny4zMyAxOC45MzAzIDY2LjI0ODggMTcuMDA1NyA2NC4zMjQzQzE1LjA4MTIgNjIuMzk5NyAxNCA1OS43ODk1IDE0IDU3LjA2NzhWMjQuMjYyNkMxNCAyMS41NDA5IDE1LjA4MTIgMTguOTMwNyAxNy4wMDU3IDE3LjAwNjJaTTQwLjE0NzkgMzMuNTQyM0g2MC45MTU3QzY0LjQ1OCAzMy41NDIzIDY3LjMyOTUgMzYuNDEzOCA2Ny4zMjk1IDM5Ljk1NjFWNDEuNjgxNkM2Ny4zMjk1IDQ1LjIyMzggNjQuNDU4IDQ4LjA5NTQgNjAuOTE1NyA0OC4wOTU0SDQwLjE0NzlDMzYuNjA1NyA0OC4wOTU0IDMzLjczNDEgNDUuMjIzOCAzMy43MzQxIDQxLjY4MTZWMzkuOTU2MUMzMy43MzQxIDM2LjQxMzggMzYuNjA1NyAzMy41NDIzIDQwLjE0NzkgMzMuNTQyM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8yODdfMjM1OSkiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yODdfMjM1OSIgeDE9IjE5LjM2MDIiIHkxPSIxNCIgeDI9IjU2Ljc2OTYiIHkyPSI2OS44MDA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDNTQ5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjU0QkZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg=="; diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/index.ts b/packages/extension/src/providers/solana/libs/wallet-standard/index.ts new file mode 100644 index 000000000..048cfe5bb --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/index.ts @@ -0,0 +1 @@ +export * from "./initialize"; diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts b/packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts new file mode 100644 index 000000000..a361ca724 --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts @@ -0,0 +1,8 @@ +import { registerWallet } from "./register"; +import { EnkryptWallet } from "./wallet"; +import type { Enkrypt } from "./window"; + +export function initialize(enkrypt: Enkrypt): void { + console.log(new EnkryptWallet(enkrypt)); + registerWallet(new EnkryptWallet(enkrypt)); +} diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/register.ts b/packages/extension/src/providers/solana/libs/wallet-standard/register.ts new file mode 100644 index 000000000..900ffadb9 --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/register.ts @@ -0,0 +1,83 @@ +// This is copied from @wallet-standard/wallet + +import type { + DEPRECATED_WalletsWindow, + Wallet, + WalletEventsWindow, + WindowRegisterWalletEvent, + WindowRegisterWalletEventCallback, +} from "@wallet-standard/base"; + +export function registerWallet(wallet: Wallet): void { + const callback: WindowRegisterWalletEventCallback = ({ register }) => + register(wallet); + try { + (window as WalletEventsWindow).dispatchEvent( + new RegisterWalletEvent(callback) + ); + } catch (error) { + console.error( + "wallet-standard:register-wallet event could not be dispatched\n", + error + ); + } + try { + (window as WalletEventsWindow).addEventListener( + "wallet-standard:app-ready", + ({ detail: api }) => callback(api) + ); + } catch (error) { + console.error( + "wallet-standard:app-ready event listener could not be added\n", + error + ); + } +} + +class RegisterWalletEvent extends Event implements WindowRegisterWalletEvent { + readonly #detail: WindowRegisterWalletEventCallback; + + get detail() { + return this.#detail; + } + + get type() { + return "wallet-standard:register-wallet" as const; + } + + constructor(callback: WindowRegisterWalletEventCallback) { + super("wallet-standard:register-wallet", { + bubbles: false, + cancelable: false, + composed: false, + }); + this.#detail = callback; + } + + /** @deprecated */ + preventDefault(): never { + throw new Error("preventDefault cannot be called"); + } + + /** @deprecated */ + stopImmediatePropagation(): never { + throw new Error("stopImmediatePropagation cannot be called"); + } + + /** @deprecated */ + stopPropagation(): never { + throw new Error("stopPropagation cannot be called"); + } +} + +/** @deprecated */ +export function DEPRECATED_registerWallet(wallet: Wallet): void { + registerWallet(wallet); + try { + ((window as DEPRECATED_WalletsWindow).navigator.wallets ||= []).push( + ({ register }) => register(wallet) + ); + } catch (error) { + console.error("window.navigator.wallets could not be pushed\n", error); + } +} diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/solana.ts b/packages/extension/src/providers/solana/libs/wallet-standard/solana.ts new file mode 100644 index 000000000..0763451f6 --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/solana.ts @@ -0,0 +1,36 @@ +// This is copied from @solana/wallet-standard-chains + +import type { IdentifierString } from "@wallet-standard/base"; +import type { Transaction, VersionedTransaction } from "@solana/web3.js"; + +/** Solana Mainnet (beta) cluster, e.g. https://api.mainnet-beta.solana.com */ +export const SOLANA_MAINNET_CHAIN = "solana:mainnet"; + +/** Solana Devnet cluster, e.g. https://api.devnet.solana.com */ +export const SOLANA_DEVNET_CHAIN = "solana:devnet"; + +/** Solana Testnet cluster, e.g. https://api.testnet.solana.com */ +export const SOLANA_TESTNET_CHAIN = "solana:testnet"; + +/** Array of all Solana clusters */ +export const SOLANA_CHAINS = [ + SOLANA_MAINNET_CHAIN, + SOLANA_DEVNET_CHAIN, + SOLANA_TESTNET_CHAIN, +] as const; + +/** Type of all Solana clusters */ +export type SolanaChain = (typeof SOLANA_CHAINS)[number]; + +/** + * Check if a chain corresponds with one of the Solana clusters. + */ +export function isSolanaChain(chain: IdentifierString): chain is SolanaChain { + return SOLANA_CHAINS.includes(chain as SolanaChain); +} + +export function isVersionedTransaction( + transaction: Transaction | VersionedTransaction +): transaction is VersionedTransaction { + return "version" in transaction; +} diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/util.ts b/packages/extension/src/providers/solana/libs/wallet-standard/util.ts new file mode 100644 index 000000000..efa84cbab --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/util.ts @@ -0,0 +1,23 @@ +// This is copied from @wallet-standard/wallet + +export function bytesEqual(a: Uint8Array, b: Uint8Array): boolean { + return arraysEqual(a, b); +} + +interface Indexed { + length: number; + [index: number]: T; +} + +export function arraysEqual(a: Indexed, b: Indexed): boolean { + if (a === b) return true; + + const length = a.length; + if (length !== b.length) return false; + + for (let i = 0; i < length; i++) { + if (a[i] !== b[i]) return false; + } + + return true; +} diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts new file mode 100644 index 000000000..398becc9a --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts @@ -0,0 +1,368 @@ +import { + SolanaSignAndSendTransaction, + type SolanaSignAndSendTransactionFeature, + type SolanaSignAndSendTransactionMethod, + type SolanaSignAndSendTransactionOutput, + SolanaSignIn, + type SolanaSignInFeature, + type SolanaSignInMethod, + type SolanaSignInOutput, + SolanaSignMessage, + type SolanaSignMessageFeature, + type SolanaSignMessageMethod, + type SolanaSignMessageOutput, + SolanaSignTransaction, + type SolanaSignTransactionFeature, + type SolanaSignTransactionMethod, + type SolanaSignTransactionOutput, +} from "@solana/wallet-standard-features"; +import { Transaction, VersionedTransaction } from "@solana/web3.js"; +import type { Wallet } from "@wallet-standard/base"; +import { + StandardConnect, + type StandardConnectFeature, + type StandardConnectMethod, + StandardDisconnect, + type StandardDisconnectFeature, + type StandardDisconnectMethod, + StandardEvents, + type StandardEventsFeature, + type StandardEventsListeners, + type StandardEventsNames, + type StandardEventsOnMethod, +} from "@wallet-standard/features"; +import { EnkryptWalletAccount } from "./account.js"; +import { icon } from "./icon.js"; +import type { SolanaChain } from "./solana.js"; +import { + isSolanaChain, + isVersionedTransaction, + SOLANA_CHAINS, +} from "./solana.js"; +import { bytesEqual } from "./util.js"; +import type { Enkrypt } from "./window.js"; + +export const EnkryptNamespace = "enkrypt:"; + +export type EnkryptFeature = { + [EnkryptNamespace]: { + enkrypt: Enkrypt; + }; +}; +const hexToUint8Array = (hexString: string) => { + hexString = hexString.replace("0x", ""); + return Uint8Array.from( + hexString.match(/.{1,2}/g)!.map((byte) => parseInt(byte, 16)) + ); +}; +const uint8ArrayToHex = (buffer: Uint8Array) => { + const str = Array.prototype.map + .call(buffer, (x) => ("00" + x.toString(16)).slice(-2)) + .join(""); + return `0x${str}`; +}; + +export class EnkryptWallet implements Wallet { + readonly #listeners: { + [E in StandardEventsNames]?: StandardEventsListeners[E][]; + } = {}; + readonly #version = "1.0.0" as const; + readonly #name = "Enkrypt" as const; + readonly #icon = icon; + #accounts: EnkryptWalletAccount[] | null = null; + readonly #enkrypt: Enkrypt; + + get version() { + return this.#version; + } + + get name() { + return this.#name; + } + + get icon() { + return this.#icon; + } + + get chains() { + return SOLANA_CHAINS.slice(); + } + + get features(): StandardConnectFeature & + StandardDisconnectFeature & + StandardEventsFeature & + SolanaSignAndSendTransactionFeature & + SolanaSignTransactionFeature & + SolanaSignMessageFeature & + SolanaSignInFeature & + EnkryptFeature { + return { + [StandardConnect]: { + version: "1.0.0", + connect: this.#connect, + }, + [StandardDisconnect]: { + version: "1.0.0", + disconnect: this.#disconnect, + }, + [StandardEvents]: { + version: "1.0.0", + on: this.#on, + }, + [SolanaSignAndSendTransaction]: { + version: "1.0.0", + supportedTransactionVersions: ["legacy", 0], + signAndSendTransaction: this.#signAndSendTransaction, + }, + [SolanaSignTransaction]: { + version: "1.0.0", + supportedTransactionVersions: ["legacy", 0], + signTransaction: this.#signTransaction, + }, + [SolanaSignMessage]: { + version: "1.0.0", + signMessage: this.#signMessage, + }, + [SolanaSignIn]: { + version: "1.0.0", + signIn: this.#signIn, + }, + [EnkryptNamespace]: { + enkrypt: this.#enkrypt, + }, + }; + } + get accounts() { + return this.#accounts && this.#accounts.length ? this.#accounts : []; + } + + constructor(enkrypt: Enkrypt) { + if (new.target === EnkryptWallet) { + Object.freeze(this); + } + this.#enkrypt = enkrypt; + enkrypt.on("connect", this.#connected, this); + enkrypt.on("disconnect", this.#disconnected, this); + enkrypt.on("accountChanged", this.#reconnected, this); + this.#connected(); + } + + #on: StandardEventsOnMethod = (event, listener) => { + this.#listeners[event]?.push(listener) || + (this.#listeners[event] = [listener]); + return (): void => this.#off(event, listener); + }; + + #emit( + event: E, + ...args: Parameters + ): void { + // eslint-disable-next-line prefer-spread + this.#listeners[event]?.forEach((listener) => listener.apply(null, args)); + } + + #off( + event: E, + listener: StandardEventsListeners[E] + ): void { + this.#listeners[event] = this.#listeners[event]?.filter( + (existingListener) => listener !== existingListener + ); + } + + #connected = () => { + if (this.#enkrypt.accounts.length) { + if (this.#accounts?.length !== this.#enkrypt.accounts.length) { + this.#accounts = this.#enkrypt.accounts.map((acc) => { + return new EnkryptWalletAccount({ + address: acc.address, + publicKey: hexToUint8Array(acc.pubkey), + }); + }); + this.#emit("change", { accounts: this.accounts }); + } + } + }; + + #disconnected = () => { + if (this.#accounts?.length) { + this.#accounts = null; + this.#emit("change", { accounts: this.accounts }); + } + }; + + #reconnected = () => { + if (this.#enkrypt.accounts.length) { + this.#connected(); + } else { + this.#disconnected(); + } + }; + + #connect: StandardConnectMethod = async ({ silent } = {}) => { + if (!this.#accounts?.length) { + await this.#enkrypt.connect(silent ? { onlyIfTrusted: true } : undefined); + } + this.#connected(); + return { accounts: this.accounts }; + }; + + #disconnect: StandardDisconnectMethod = async () => { + await this.#enkrypt.disconnect(); + }; + + #signAndSendTransaction: SolanaSignAndSendTransactionMethod = async ( + ...inputs + ) => { + if (!this.#accounts?.length) throw new Error("not connected"); + console.log(inputs); + throw new Error("not implemented: signAndSendTransaction"); + // const outputs: SolanaSignAndSendTransactionOutput[] = []; + + // if (inputs.length === 1) { + // // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + // const { transaction, account, chain, options } = inputs[0]!; + // const { minContextSlot, preflightCommitment, skipPreflight, maxRetries } = + // options || {}; + // if (account !== this.#account) throw new Error("invalid account"); + // if (!isSolanaChain(chain)) throw new Error("invalid chain"); + + // const { signature } = await this.#enkrypt.signAndSendTransaction( + // VersionedTransaction.deserialize(transaction), + // { + // preflightCommitment, + // minContextSlot, + // maxRetries, + // skipPreflight, + // } + // ); + + // outputs.push({ signature: bs58.decode(signature) }); + // } else if (inputs.length > 1) { + // for (const input of inputs) { + // outputs.push(...(await this.#signAndSendTransaction(input))); + // } + // } + + // return outputs; + }; + + #signTransaction: SolanaSignTransactionMethod = async (...inputs) => { + if (!this.#accounts?.length) throw new Error("not connected"); + const outputs: SolanaSignTransactionOutput[] = []; + + if (inputs.length === 1) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { transaction, account, chain } = inputs[0]!; + const validAccount = this.#accounts.find( + (acc) => acc.address === account.address + ); + if (!validAccount) throw new Error("invalid account"); + if (chain && !isSolanaChain(chain)) throw new Error("invalid chain"); + + const signedTransaction = await this.#enkrypt.signTransaction({ + address: account.address, + hex: uint8ArrayToHex(transaction), + chain: chain, + }); + + // const serializedTransaction = isVersionedTransaction(signedTransaction) + // ? signedTransaction.serialize() + // : new Uint8Array( + // (signedTransaction as Transaction).serialize({ + // requireAllSignatures: false, + // verifySignatures: false, + // }) + // ); + + outputs.push({ signedTransaction: hexToUint8Array(signedTransaction) }); + } else if (inputs.length > 1) { + // let chain: SolanaChain | undefined = undefined; + // for (const input of inputs) { + // const validAccount = this.#accounts.find( + // (acc) => acc.address === input.account.address + // ); + // if (!validAccount) throw new Error("invalid account"); + // if (input.chain) { + // if (!isSolanaChain(input.chain)) throw new Error("invalid chain"); + // if (chain) { + // if (input.chain !== chain) throw new Error("conflicting chain"); + // } else { + // chain = input.chain; + // } + // } + // } + // const transactions = inputs.map(({ transaction }) => + // VersionedTransaction.deserialize(transaction) + // ); + // const signedTransactions = await this.#enkrypt.signAllTransactions( + // transactions + // ); + // outputs.push( + // ...signedTransactions.map((signedTransaction) => { + // const serializedTransaction = isVersionedTransaction( + // signedTransaction + // ) + // ? signedTransaction.serialize() + // : new Uint8Array( + // (signedTransaction as Transaction).serialize({ + // requireAllSignatures: false, + // verifySignatures: false, + // }) + // ); + // return { signedTransaction: serializedTransaction }; + // }) + // ); + } + + return outputs; + }; + + #signMessage: SolanaSignMessageMethod = async (...inputs) => { + if (!this.#accounts?.length) throw new Error("not connected"); + const outputs: SolanaSignMessageOutput[] = []; + if (inputs.length === 1) { + const { message, account } = inputs[0]!; + let isValidAccount = false; + for (const acc of this.#accounts) { + if (acc.address === account.address) { + isValidAccount = true; + break; + } + } + if (!isValidAccount) throw new Error("invalid account"); + const { signature } = await this.#enkrypt.signMessage({ + address: account.address, + message: uint8ArrayToHex(message), + }); + outputs.push({ + signedMessage: message, + signature: hexToUint8Array(signature), + }); + } else if (inputs.length > 1) { + for (const input of inputs) { + outputs.push(...(await this.#signMessage(input))); + } + } + return outputs; + }; + + #signIn: SolanaSignInMethod = async (...inputs) => { + const outputs: SolanaSignInOutput[] = []; + for (const input of inputs) { + const res = await this.#enkrypt.signIn(input); + const output = { + account: new EnkryptWalletAccount({ + address: res.address, + publicKey: hexToUint8Array(res.pubkey), + }), + signature: hexToUint8Array(res.signature), + signedMessage: hexToUint8Array(res.signedMessage), + signatureType: res.signatureType, + }; + outputs.push(output); + } + this.#connected(); + return outputs; + }; +} diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/window.ts b/packages/extension/src/providers/solana/libs/wallet-standard/window.ts new file mode 100644 index 000000000..491fc3fb6 --- /dev/null +++ b/packages/extension/src/providers/solana/libs/wallet-standard/window.ts @@ -0,0 +1,57 @@ +import type { + SolanaSignInInput, + SolanaSignInOutput, +} from "@solana/wallet-standard-features"; +import type { + SendOptions, + Transaction, + TransactionSignature, + VersionedTransaction, +} from "@solana/web3.js"; +import { + SolSignInResponse, + SolSignTransactionRequest, +} from "@/providers/solana/ui/types"; + +export interface EnkryptEvent { + connect(...args: unknown[]): unknown; + disconnect(...args: unknown[]): unknown; + accountChanged(...args: unknown[]): unknown; +} + +export interface EnkryptSolAccount { + address: string; + pubkey: string; +} + +export interface EnkryptEventEmitter { + on( + event: E, + listener: EnkryptEvent[E], + context?: any + ): void; + off( + event: E, + listener: EnkryptEvent[E], + context?: any + ): void; +} + +export interface Enkrypt extends EnkryptEventEmitter { + accounts: EnkryptSolAccount[]; + connect(options?: { onlyIfTrusted?: boolean }): Promise; + disconnect(): Promise; + signAndSendTransaction( + transaction: T, + options?: SendOptions + ): Promise<{ signature: TransactionSignature }>; + signTransaction(transaction: SolSignTransactionRequest): Promise; + signAllTransactions( + transactions: T[] + ): Promise; + signMessage(options: { + address: string; + message: string; + }): Promise; + signIn(input?: SolanaSignInInput): Promise; +} diff --git a/packages/extension/src/providers/solana/methods/btc_getBalance.ts b/packages/extension/src/providers/solana/methods/btc_getBalance.ts deleted file mode 100644 index 8e9ac1bd2..000000000 --- a/packages/extension/src/providers/solana/methods/btc_getBalance.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { MiddlewareFunction } from "@enkryptcom/types"; -import { ProviderRPCRequest } from "@/types/provider"; -import { getCustomError } from "@/libs/error"; -import BitcoinProvider from ".."; -import AccountState from "../libs/accounts-state"; -const method: MiddlewareFunction = function ( - this: BitcoinProvider, - payload: ProviderRPCRequest, - res, - next -): void { - if (payload.method !== "btc_getBalance") return next(); - else { - if (!payload.options || !payload.options.domain) { - return res(getCustomError("btc_getNetwork: invalid domain")); - } - const accountsState = new AccountState(); - - accountsState - .getApprovedAddresses(payload.options!.domain) - .then((accounts) => { - if (!accounts.length) { - return res(null, ""); - } - this.network.api().then((api) => { - api - .getBalance(this.network.displayAddress(accounts[0])) - .then((bal) => { - res(null, { - confirmed: parseInt(bal), - unconfirmed: 0, - total: parseInt(bal), - }); - }); - }); - }); - } -}; -export default method; diff --git a/packages/extension/src/providers/solana/methods/index.ts b/packages/extension/src/providers/solana/methods/index.ts index 07e8bab18..00a87e4a2 100644 --- a/packages/extension/src/providers/solana/methods/index.ts +++ b/packages/extension/src/providers/solana/methods/index.ts @@ -1,3 +1,5 @@ -import btcGetBalance from "./btc_getBalance"; +import solSignInMessage from "./sol_signInMessage"; +import solConnect from "./sol_connect"; +import solSignTransaction from "./sol_signTransaction"; -export default [btcGetBalance]; +export default [solSignInMessage, solConnect, solSignTransaction]; diff --git a/packages/extension/src/providers/solana/methods/sol_connect.ts b/packages/extension/src/providers/solana/methods/sol_connect.ts new file mode 100644 index 000000000..40a3595b7 --- /dev/null +++ b/packages/extension/src/providers/solana/methods/sol_connect.ts @@ -0,0 +1,89 @@ +import { CallbackFunction, MiddlewareFunction } from "@enkryptcom/types"; +import { ProviderRPCRequest } from "@/types/provider"; +import { WindowPromise } from "@/libs/window-promise"; +import AccountState from "../libs/accounts-state"; +import { getCustomError } from "@/libs/error"; +import SolanaProvider from ".."; +let isAccountAccessPending = false; +const pendingPromises: { + payload: ProviderRPCRequest; + res: CallbackFunction; +}[] = []; +const method: MiddlewareFunction = function ( + this: SolanaProvider, + payload: ProviderRPCRequest, + res, + next +): void { + if (payload.method !== "sol_connect") return next(); + else { + if (isAccountAccessPending) { + pendingPromises.push({ + payload, + res, + }); + return; + } + isAccountAccessPending = true; + const handleRemainingPromises = () => { + isAccountAccessPending = false; + if (pendingPromises.length) { + const promi = pendingPromises.pop(); + if (promi) handleAccountAccess(promi.payload, promi.res); + } + }; + const handleAccountAccess = ( + _payload: ProviderRPCRequest, + _res: CallbackFunction + ) => { + if (_payload.options && _payload.options.domain) { + isAccountAccessPending = true; + const accountsState = new AccountState(); + accountsState + .getApprovedAddresses(_payload.options.domain) + .then((accounts) => { + if (accounts.length) { + _res( + null, + accounts.map((acc) => { + return { + address: this.network.displayAddress(acc), + pubkey: acc, + }; + }) + ); + handleRemainingPromises(); + } else { + const windowPromise = new WindowPromise(); + windowPromise + .getResponse( + this.getUIPath(this.UIRoutes.solConnectDApp.path), + JSON.stringify({ + ..._payload, + params: [this.network.name], + }) + ) + .then(({ error, result }) => { + if (error) _res(error as any); + const accounts = JSON.parse(result || "[]"); + _res( + null, + accounts.map((acc: string) => { + return { + address: this.network.displayAddress(acc), + pubkey: acc, + }; + }) + ); + }) + .finally(handleRemainingPromises); + } + }); + } else { + _res(getCustomError("No domain set!")); + } + }; + handleAccountAccess(payload, res); + } +}; +export default method; diff --git a/packages/extension/src/providers/solana/methods/sol_signInMessage.ts b/packages/extension/src/providers/solana/methods/sol_signInMessage.ts new file mode 100644 index 000000000..ca2b677ae --- /dev/null +++ b/packages/extension/src/providers/solana/methods/sol_signInMessage.ts @@ -0,0 +1,37 @@ +import { getCustomError } from "@/libs/error"; +import { MiddlewareFunction } from "@enkryptcom/types"; +import EthereumProvider from ".."; +import { WindowPromise } from "@/libs/window-promise"; +import { ProviderRPCRequest } from "@/types/provider"; +const method: MiddlewareFunction = function ( + this: EthereumProvider, + payload: ProviderRPCRequest, + res, + next +): void { + if ( + payload.method !== "sol_signInMessage" && + payload.method !== "sol_signMessage" + ) + return next(); + else { + if (!payload.params || payload.params.length < 1) { + return res(getCustomError("sol_signInMessage: invalid params")); + } + const windowPromise = new WindowPromise(); + windowPromise + .getResponse( + this.getUIPath(this.UIRoutes.solSign.path), + JSON.stringify({ + ...payload, + params: [payload.method, payload.params[0], this.network.name], + }), + true + ) + .then(({ error, result }) => { + if (error) return res(error); + res(null, JSON.parse(result as string)); + }); + } +}; +export default method; diff --git a/packages/extension/src/providers/solana/methods/sol_signTransaction.ts b/packages/extension/src/providers/solana/methods/sol_signTransaction.ts new file mode 100644 index 000000000..33e09b9f4 --- /dev/null +++ b/packages/extension/src/providers/solana/methods/sol_signTransaction.ts @@ -0,0 +1,44 @@ +import { getCustomError } from "@/libs/error"; +import { MiddlewareFunction } from "@enkryptcom/types"; +import SolanaProvider from ".."; +import { WindowPromise } from "@/libs/window-promise"; +import bs58 from "bs58"; +import { bufferToHex } from "@enkryptcom/utils"; +import { SolSignTransactionRequest } from "../ui/types"; +const method: MiddlewareFunction = function ( + this: SolanaProvider, + payload, + res, + next +): void { + if (payload.method !== "sol_signTransaction") return next(); + else { + if (!payload.params || payload.params.length < 1) { + return res( + getCustomError("eth_sendTransaction: invalid request not enough params") + ); + } + const txMessage = JSON.parse( + payload.params[0] + ) as SolSignTransactionRequest; + this.KeyRing.getAccount(bufferToHex(bs58.decode(txMessage.address))).then( + (account) => { + const windowPromise = new WindowPromise(); + windowPromise + .getResponse( + this.getUIPath(this.UIRoutes.solSendTransaction.path), + JSON.stringify({ + ...payload, + params: [payload.params![0], account, this.network.name], + }), + true + ) + .then(({ error, result }) => { + if (error) return res(error); + res(null, JSON.parse(result as string)); + }); + } + ); + } +}; +export default method; diff --git a/packages/extension/src/providers/solana/networks/solana.ts b/packages/extension/src/providers/solana/networks/solana.ts index b9b6128b7..e16936eb1 100644 --- a/packages/extension/src/providers/solana/networks/solana.ts +++ b/packages/extension/src/providers/solana/networks/solana.ts @@ -1,4 +1,4 @@ -import { NetworkNames } from "@enkryptcom/types"; +import { CoingeckoPlatform, NetworkNames } from "@enkryptcom/types"; import { SolanaNetwork, SolanaNetworkOptions } from "../types/sol-network"; import wrapActivityHandler from "@/libs/activity-state/wrap-activity-handler"; import assetsInfoHandler from "@/providers/ethereum/libs/assets-handlers/assetinfo-mew"; @@ -21,6 +21,7 @@ const solanaOptions: SolanaNetworkOptions = { basePath: "m/44'/501'", assetsInfoHandler, NFTHandler: shNFTHandler, + coingeckoPlatform: CoingeckoPlatform.Solana, }; const bitcoin = new SolanaNetwork(solanaOptions); diff --git a/packages/extension/src/providers/solana/types/sol-network.ts b/packages/extension/src/providers/solana/types/sol-network.ts index 46a4784bd..8b732d2dc 100644 --- a/packages/extension/src/providers/solana/types/sol-network.ts +++ b/packages/extension/src/providers/solana/types/sol-network.ts @@ -3,7 +3,7 @@ import SolAPI from "@/providers/solana/libs/api"; import { AssetsType } from "@/types/provider"; import { BaseToken } from "@/types/base-token"; import { ProviderName } from "@/types/provider"; -import { NetworkNames, SignerType } from "@enkryptcom/types"; +import { CoingeckoPlatform, NetworkNames, SignerType } from "@enkryptcom/types"; import createIcon from "../libs/blockies"; import { Activity } from "@/types/activity"; import { @@ -33,6 +33,7 @@ export interface SolanaNetworkOptions { decimals: number; node: string; coingeckoID?: string; + coingeckoPlatform: CoingeckoPlatform; basePath: string; NFTHandler?: ( network: BaseNetwork, diff --git a/packages/extension/src/providers/solana/ui/libs/signin-message.ts b/packages/extension/src/providers/solana/ui/libs/signin-message.ts new file mode 100644 index 000000000..9cbf6cc00 --- /dev/null +++ b/packages/extension/src/providers/solana/ui/libs/signin-message.ts @@ -0,0 +1,47 @@ +import { SolanaSignInInput } from "@solana/wallet-standard-features"; + +export function createSignInMessageText(input: SolanaSignInInput): string { + let message = `${input.domain} wants you to sign in with your Solana account:\n`; + message += `${input.address}`; + + if (input.statement) { + message += `\n\n${input.statement}`; + } + + const fields: string[] = []; + if (input.uri) { + fields.push(`URI: ${input.uri}`); + } + if (input.version) { + fields.push(`Version: ${input.version}`); + } + if (input.chainId) { + fields.push(`Chain ID: ${input.chainId}`); + } + if (input.nonce) { + fields.push(`Nonce: ${input.nonce}`); + } + if (input.issuedAt) { + fields.push(`Issued At: ${input.issuedAt}`); + } + if (input.expirationTime) { + fields.push(`Expiration Time: ${input.expirationTime}`); + } + if (input.notBefore) { + fields.push(`Not Before: ${input.notBefore}`); + } + if (input.requestId) { + fields.push(`Request ID: ${input.requestId}`); + } + if (input.resources) { + fields.push(`Resources:`); + for (const resource of input.resources) { + fields.push(`- ${resource}`); + } + } + if (fields.length) { + message += `\n\n${fields.join("\n")}`; + } + + return message; +} diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index 0747ff2d8..2b6f1d4d6 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -168,7 +168,6 @@ import { SystemProgram, PublicKey, ComputeBudgetProgram, - TransactionInstruction, } from "@solana/web3.js"; import { createTransferInstruction, @@ -179,9 +178,7 @@ import { } from "@solana/spl-token"; import getPriorityFees from "../libs/get-priority-fees"; import bs58 from "bs58"; - import SolanaAPI from "@/providers/solana/libs/api"; -import { getSimulationComputeUnits } from "@solana-developers/helpers"; const props = defineProps({ network: { diff --git a/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue b/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue index 0dd5ec9b8..d9f8c81d6 100644 --- a/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue +++ b/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue @@ -72,18 +72,22 @@ import SelectAccountInput from "@action/components/select-account-input/index.vu import ModalAccounts from "@action/views/modal-accounts/index.vue"; import { AccountsHeaderData } from "@action/types/account"; import { EnkryptAccount } from "@enkryptcom/types"; -import { DEFAULT_BTC_NETWORK, getNetworkByName } from "@/libs/utils/networks"; +import { + DEFAULT_BTC_NETWORK, + DEFAULT_SOLANA_NETWORK, + getNetworkByName, +} from "@/libs/utils/networks"; import { WindowPromiseHandler } from "@/libs/window-promise"; -import { BitcoinNetwork } from "../types/bitcoin-network"; import { ProviderRequestOptions } from "@/types/provider"; import PublicKeyRing from "@/libs/keyring/public-keyring"; import { fromBase } from "@enkryptcom/utils"; import { getError } from "@/libs/error"; import { ErrorCodes } from "@/providers/ethereum/types"; import AccountState from "../libs/accounts-state"; +import { SolanaNetwork } from "../types/sol-network"; const windowPromise = WindowPromiseHandler(1); -const network = ref(DEFAULT_BTC_NETWORK); +const network = ref(DEFAULT_SOLANA_NETWORK); const identicon = ref(""); const displayAddress = ref(""); const accountHeaderData = ref({ @@ -108,7 +112,7 @@ onBeforeMount(async () => { const { Request, options } = await windowPromise; network.value = (await getNetworkByName( Request.value.params![0] - )) as BitcoinNetwork; + )) as SolanaNetwork; const keyring = new PublicKeyRing(); Options.value = options; const accounts = await keyring.getAccounts(network.value.signer); diff --git a/packages/extension/src/providers/solana/ui/sol-sign-message.vue b/packages/extension/src/providers/solana/ui/sol-sign-message.vue index 219ff065e..51cb0ebf6 100644 --- a/packages/extension/src/providers/solana/ui/sol-sign-message.vue +++ b/packages/extension/src/providers/solana/ui/sol-sign-message.vue @@ -28,7 +28,7 @@
- +

{{ Options.title }}

{{ Options.domain }}

@@ -59,14 +59,30 @@ import { getError } from "@/libs/error"; import { ErrorCodes } from "@/providers/ethereum/types"; import { WindowPromiseHandler } from "@/libs/window-promise"; import { onBeforeMount, ref } from "vue"; -import { DEFAULT_BTC_NETWORK, getNetworkByName } from "@/libs/utils/networks"; +import { + DEFAULT_SOLANA_NETWORK, + getNetworkByName, +} from "@/libs/utils/networks"; import { ProviderRequestOptions } from "@/types/provider"; -import { BitcoinNetwork } from "../types/bitcoin-network"; -import { EnkryptAccount } from "@enkryptcom/types"; -import { MessageSigner } from "./libs/signer"; +import { SolanaNetwork } from "../types/sol-network"; +import { EnkryptAccount, SignerType } from "@enkryptcom/types"; +import { + SolanaSignInInput, + SolanaSignInOutput, +} from "@solana/wallet-standard-features"; +import bs58 from "bs58"; +import { bufferToHex, hexToBuffer, utf8ToHex } from "@enkryptcom/utils"; +import PublicKeyRing from "@/libs/keyring/public-keyring"; +import { createSignInMessageText } from "./libs/signin-message"; +import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; +import { InternalMethods } from "@/types/messenger"; +import { SolSignInResponse } from "./types"; +import { isUtf8 } from "@polkadot/util"; +import { hexToUtf8 } from "web3-utils"; -const windowPromise = WindowPromiseHandler(4); -const network = ref(DEFAULT_BTC_NETWORK); +const windowPromise = WindowPromiseHandler(3); +const keyring = new PublicKeyRing(); +const network = ref(DEFAULT_SOLANA_NETWORK); const account = ref({ name: "", address: "", @@ -80,31 +96,114 @@ const Options = ref({ tabId: 0, }); +const signInMessage = ref({}); +const signMessage = ref<{ address: string; message: string }>(); const message = ref(""); -const type = ref(""); +const reqMethod = ref<"sol_signInMessage" | "sol_signMessage">( + "sol_signInMessage" +); onBeforeMount(async () => { - const { Request, options } = await windowPromise; + const { Request, Resolve, options } = await windowPromise; network.value = (await getNetworkByName( - Request.value.params![3] - )) as BitcoinNetwork; - account.value = Request.value.params![2] as EnkryptAccount; - identicon.value = network.value.identicon(account.value.address); + Request.value.params![2] + )) as SolanaNetwork; + reqMethod.value = Request.value.params![0]; + if (reqMethod.value === "sol_signInMessage") { + signInMessage.value = JSON.parse( + Request.value.params![1] + ) as SolanaSignInInput; + message.value = createSignInMessageText(signInMessage.value); + if ( + signInMessage.value.address && + network.value.isAddress(signInMessage.value.address) + ) { + const pubKey = bufferToHex(bs58.decode(signInMessage.value.address)); + keyring + .getAccount(pubKey) + .then((acc) => { + account.value = acc; + identicon.value = network.value.identicon(account.value.address); + }) + .catch((e) => { + console.log(e); + Resolve.value({ + error: getError(ErrorCodes.unauthorized), + }); + }); + } else { + keyring.getAccounts([SignerType.ed25519sol]).then((accs) => { + account.value = accs[0]; + identicon.value = network.value.identicon(account.value.address); + message.value = createSignInMessageText({ + ...signInMessage.value, + address: network.value.displayAddress(account.value.address), + }); + }); + } + } else if (reqMethod.value === "sol_signMessage") { + signMessage.value = JSON.parse(Request.value.params![1]); + message.value = isUtf8(signMessage.value!.message) + ? hexToUtf8(signMessage.value!.message) + : signMessage.value!.message; + console.log(message.value); + keyring + .getAccount(bufferToHex(bs58.decode(signMessage.value!.address))) + .then((acc) => { + account.value = acc; + identicon.value = network.value.identicon(account.value.address); + }) + .catch((e) => { + console.log(e); + Resolve.value({ + error: getError(ErrorCodes.unauthorized), + }); + }); + } Options.value = options; - message.value = Request.value.params![0]; - type.value = Request.value.params![1]; }); const approve = async () => { - const { Request, Resolve } = await windowPromise; - const msg = Request.value.params![0] as string; - MessageSigner({ - account: account.value, - network: network.value as BitcoinNetwork, - payload: Buffer.from(msg, "utf8"), - type: type.value, + const { Resolve } = await windowPromise; + sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [ + reqMethod.value === "sol_signInMessage" + ? utf8ToHex(message.value) + : signMessage.value?.message, + account.value, + ], }) - .then(Resolve.value) - .catch(Resolve.value); + .then((res) => { + if (res.error) { + return Promise.reject({ + error: res.error, + }); + } else { + const response: SolSignInResponse = { + address: bs58.encode(hexToBuffer(account.value.address)), + pubkey: account.value.address, + signature: JSON.parse(res.result!), + signedMessage: utf8ToHex(message.value), + signatureType: "ed25519", + }; + Resolve.value({ + result: JSON.stringify(response), + }); + } + }) + .catch((e) => { + Resolve.value({ + error: e.message, + }); + }); + // MessageSigner({ + // account: account.value, + // network: network.value as BitcoinNetwork, + // payload: Buffer.from(msg, "utf8"), + // type: type.value, + // }) + // .then(Resolve.value) + // .catch(Resolve.value); }; const deny = async () => { const { Resolve } = await windowPromise; diff --git a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue index 484cda6c5..4a19ef023 100644 --- a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue +++ b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue @@ -19,18 +19,16 @@

{{ - $filters.formatFloatingPointValue( - fromBase(TokenBalance, network.decimals) - ).value + TokenBalance == "~" + ? "~" + : $filters.formatFloatingPointValue(TokenBalance).value }} {{ network.currencyName }}

{{ $filters.replaceWithEllipsis( - account.address - ? network.displayAddress(account.address) - : "", + network.displayAddress(account.address), 6, 4 ) @@ -42,56 +40,79 @@

- +
-

{{ Options.title }}

-

{{ Options.domain }}

+

{{ Options.domain }}

-
- +
+

+ {{ parseFloat(item.change) < 0 ? "-" : "" }} {{ $filters.formatFloatingPointValue( - fromBase(getTotalOut.toString(), network.decimals) + Math.abs(parseFloat(item.change)) ).value }} - {{ network.currencyName }} + {{ item.name }}

+ {{ parseFloat(item.change) < 0 ? "-" : "" }} ${{ - fiatValue !== "~" - ? $filters.formatFiatValue(fiatValue).value - : fiatValue + $filters.formatFiatValue(Math.abs(parseFloat(item.usdval))) + .value }}

-
+
-

You don't have enough balance for this transaction

+

+ Warning: you will allow this DApp to spend {{ approvalAmount }} of + {{ decodedTx?.tokenName || network.currencyName }} at any time in + the future. Please proceed only if you are trust this DApp. +

-
- -
+ + +
+ Show data + +
+

Data Hex: {{ decodedTx?.dataHex || "0x" }}

+
+
+

+ {{ errorMsg }} +

+ @@ -106,9 +127,9 @@ @@ -117,52 +138,74 @@ diff --git a/packages/extension/src/providers/solana/ui/types.ts b/packages/extension/src/providers/solana/ui/types.ts index 1085e6da4..5c6438db4 100644 --- a/packages/extension/src/providers/solana/ui/types.ts +++ b/packages/extension/src/providers/solana/ui/types.ts @@ -1,6 +1,6 @@ -import { ToTokenData } from "@/ui/action/types/token"; -import { GasFeeInfo, GasPriceTypes } from "@/providers/common/types"; -import { NFTItemWithCollectionName } from "@/types/nft"; +import type { ToTokenData } from "@/ui/action/types/token"; +import type { GasFeeInfo, GasPriceTypes } from "@/providers/common/types"; +import type { NFTItemWithCollectionName } from "@/types/nft"; export interface SendTransactionDataType { from: string; @@ -21,3 +21,17 @@ export interface VerifyTransactionParams { gasPriceType: GasPriceTypes; encodedTx: string; } + +export interface SolSignInResponse { + address: string; + pubkey: string; + signature: string; + signedMessage: string; + signatureType: "ed25519"; +} + +export interface SolSignTransactionRequest { + hex: string; + address: string; + chain?: string; +} diff --git a/packages/extension/src/scripts/inject.ts b/packages/extension/src/scripts/inject.ts index 5b3186114..6a95ddda5 100644 --- a/packages/extension/src/scripts/inject.ts +++ b/packages/extension/src/scripts/inject.ts @@ -8,6 +8,7 @@ import EthereumProvider from "@/providers/ethereum/inject"; import PolkadotProvider from "@/providers/polkadot/inject"; import BitcoinProvider from "@/providers/bitcoin/inject"; import KadenaProvider from "@/providers/kadena/inject"; +import SolanaProvider from "@/providers/solana/inject"; import { InternalMethods } from "@/types/messenger"; @@ -37,6 +38,11 @@ const loadInjectedProviders = () => { type: ProviderType.kadena, sendMessageHandler: providerSendMessage, }); + SolanaProvider(window, { + name: ProviderName.solana, + type: ProviderType.solana, + sendMessageHandler: providerSendMessage, + }); }; loadInjectedProviders(); diff --git a/packages/extension/src/types/provider.ts b/packages/extension/src/types/provider.ts index fc5a55d19..8bce232a5 100644 --- a/packages/extension/src/types/provider.ts +++ b/packages/extension/src/types/provider.ts @@ -62,6 +62,7 @@ export enum ProviderType { substrate, bitcoin, kadena, + solana, } export type SendMessageHandler = ( diff --git a/packages/extension/src/ui/provider-pages/routes.ts b/packages/extension/src/ui/provider-pages/routes.ts index a74d99f21..5bf69cf6f 100644 --- a/packages/extension/src/ui/provider-pages/routes.ts +++ b/packages/extension/src/ui/provider-pages/routes.ts @@ -5,8 +5,16 @@ import EthereumUI from "@/providers/ethereum/ui"; import PolkadotUI from "@/providers/polkadot/ui"; import BitcoinUI from "@/providers/bitcoin/ui"; import KadenaUI from "@/providers/kadena/ui"; +import SolanaUI from "@/providers/solana/ui"; import EnkryptUI from "./enkrypt"; -const uiProviders = [EthereumUI, PolkadotUI, BitcoinUI, EnkryptUI, KadenaUI]; +const uiProviders = [ + EthereumUI, + PolkadotUI, + BitcoinUI, + EnkryptUI, + KadenaUI, + SolanaUI, +]; let uiRoutes: RouteRecordRaw[] = []; uiProviders.forEach((provider) => { uiRoutes = uiRoutes.concat(provider.routes); diff --git a/yarn.lock b/yarn.lock index cd7126f0b..a0d7239f6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2792,11 +2792,13 @@ __metadata: "@polkadot/wasm-crypto": ^7.3.2 "@rollup/plugin-commonjs": ^26.0.1 "@rollup/plugin-inject": ^5.0.5 + "@rollup/plugin-json": ^6.1.0 "@rollup/plugin-node-resolve": ^15.2.3 "@rollup/plugin-replace": ^5.0.7 "@rollup/plugin-typescript": ^11.1.6 "@solana-developers/helpers": ^2.4.0 "@solana/spl-token": ^0.4.8 + "@solana/wallet-standard-features": ^1.2.0 "@solana/web3.js": ^1.95.2 "@types/bs58": ^4.0.4 "@types/chrome": ^0.0.269 @@ -2818,6 +2820,7 @@ __metadata: "@vue/cli-service": ~5.0.8 "@vue/eslint-config-typescript": ^11.0.3 "@vueuse/core": ^10.11.0 + "@wallet-standard/base": ^0.0.0-20240703212708 add: ^2.0.6 bignumber.js: ^9.1.2 bip39: ^3.1.0 @@ -7439,6 +7442,20 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-json@npm:^6.1.0": + version: 6.1.0 + resolution: "@rollup/plugin-json@npm:6.1.0" + dependencies: + "@rollup/pluginutils": ^5.1.0 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: cc018d20c80242a2b8b44fae61a968049cf31bb8406218187cc7cda35747616594e79452dd65722e7da6dd825b392e90d4599d43cd4461a02fefa2865945164e + languageName: node + linkType: hard + "@rollup/plugin-node-resolve@npm:^15.2.3": version: 15.2.3 resolution: "@rollup/plugin-node-resolve@npm:15.2.3" @@ -8068,6 +8085,16 @@ __metadata: languageName: node linkType: hard +"@solana/wallet-standard-features@npm:^1.2.0": + version: 1.2.0 + resolution: "@solana/wallet-standard-features@npm:1.2.0" + dependencies: + "@wallet-standard/base": ^1.0.1 + "@wallet-standard/features": ^1.0.3 + checksum: 03ec568f9a4a945970dda57abed4c5a9f669798b272bd7c2d6c135c8baeba8fd78a5fd6d850364dba8257eaf84b7bf8578ba039666f377206c2fd89f6093fca3 + languageName: node + linkType: hard + "@solana/web3.js@npm:1.77.3": version: 1.77.3 resolution: "@solana/web3.js@npm:1.77.3" @@ -10729,6 +10756,29 @@ __metadata: languageName: node linkType: hard +"@wallet-standard/base@npm:^0.0.0-20240703212708": + version: 0.0.0-20240802213516 + resolution: "@wallet-standard/base@npm:0.0.0-20240802213516" + checksum: e117172f5d1d71fcedcf028ebfa9e16c300873f8b0625f5937adba5b254fdb9e36b69e01151414025c8760f2283dd38261d74c0eeda4ce773d5bbb4dd2f9dd98 + languageName: node + linkType: hard + +"@wallet-standard/base@npm:^1.0.1": + version: 1.0.1 + resolution: "@wallet-standard/base@npm:1.0.1" + checksum: 8f40bee1c69d2c3c0a4c317b3069301406025f8dc1a794b4b4b6d36d2e8e1e38193e6db1c3ac729c773d380f4e2c3a7454bfd3e138708aa6821b6e2029063590 + languageName: node + linkType: hard + +"@wallet-standard/features@npm:^1.0.3": + version: 1.0.3 + resolution: "@wallet-standard/features@npm:1.0.3" + dependencies: + "@wallet-standard/base": ^1.0.1 + checksum: 000a4087d6fd70aaed7f66b118c85097f1d75aa29b962467ee7dee179d01ce009ee685552f53caaef67fdfab63d452073f6fb3bcc0471e3c88fc7e742d2c4e05 + languageName: node + linkType: hard + "@walletconnect/core@npm:2.8.6": version: 2.8.6 resolution: "@walletconnect/core@npm:2.8.6" From 90fe8a07c93546e1d1d65843b6caa336cfa426a9 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 14 Aug 2024 16:12:16 -0700 Subject: [PATCH 254/375] devop: solana verify tx --- .../libs/assets-handlers/solanachain.ts | 1 + .../extension/src/providers/solana/inject.ts | 33 +- .../src/providers/solana/libs/api.ts | 32 +- .../solana/libs/wallet-standard/solana.ts | 10 +- .../solana/libs/wallet-standard/wallet.ts | 112 +---- .../solana/libs/wallet-standard/window.ts | 14 +- .../solana/methods/sol_signTransaction.ts | 14 +- .../src/providers/solana/types/sol-token.ts | 6 + .../src/providers/solana/ui/libs/decode-tx.ts | 158 ++++++ .../components/send-fee-select.vue | 5 +- .../solana/ui/send-transaction/index.vue | 2 +- .../verify-transaction/index.vue | 2 +- .../providers/solana/ui/sol-connect-dapp.vue | 1 - .../providers/solana/ui/sol-sign-message.vue | 5 +- .../solana/ui/sol-verify-transaction.vue | 475 ++++-------------- 15 files changed, 356 insertions(+), 514 deletions(-) create mode 100644 packages/extension/src/providers/solana/ui/libs/decode-tx.ts diff --git a/packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts b/packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts index babb42ba5..4c0e18441 100644 --- a/packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts +++ b/packages/extension/src/providers/ethereum/libs/assets-handlers/solanachain.ts @@ -33,6 +33,7 @@ const getBalances = (network: BaseNetwork, address: string) => { const balance = numberToHex( (acc.account.data as any).parsed.info.tokenAmount.amount ); + if (balance === "0x0") return; const contract = (acc.account.data as any).parsed.info.mint; if (!balanceObj[contract]) balanceObj[contract] = toBN(0); balanceObj[contract] = balanceObj[contract].add(toBN(balance)); diff --git a/packages/extension/src/providers/solana/inject.ts b/packages/extension/src/providers/solana/inject.ts index 9a9ddc259..25a3022c4 100644 --- a/packages/extension/src/providers/solana/inject.ts +++ b/packages/extension/src/providers/solana/inject.ts @@ -9,21 +9,10 @@ import { SendMessageHandler, } from "@/types/provider"; import { EnkryptWindow } from "@/types/globals"; -import { InternalMethods } from "@/types/messenger"; -import { SettingsType } from "@/libs/settings-state/types"; import { Enkrypt, EnkryptSolAccount } from "./libs/wallet-standard/window"; -import type { - PublicKey, - SendOptions, - Transaction, - VersionedTransaction, -} from "@solana/web3.js"; -import type { - SolanaSignInInput, - SolanaSignInOutput, -} from "@solana/wallet-standard-features"; +import type { SendOptions } from "@solana/web3.js"; +import type { SolanaSignInInput } from "@solana/wallet-standard-features"; import { initialize } from "./libs/wallet-standard"; -import { EnkryptWalletAccount } from "./libs/wallet-standard/account"; import { SolSignInResponse, SolSignTransactionRequest } from "./ui/types"; export class Provider @@ -60,18 +49,15 @@ export class Provider console.log("disconnect"); return Promise.reject("not implemented"); } - signAndSendTransaction( - transaction: T, + signAndSendTransaction( + transaction: SolSignTransactionRequest, options?: SendOptions | undefined - ): Promise<{ signature: string }> { + ): Promise { console.log("signAndSendTransaction"); - return Promise.reject("not implemented"); - } - signAllTransactions( - transactions: T[] - ): Promise { - console.log("signAllTransactions"); - return Promise.reject("not implemented"); + return this.request({ + method: "sol_signAndSendTransaction", + params: [JSON.stringify(transaction), JSON.stringify(options)], + }).then((res: string) => res); } signIn(input?: SolanaSignInInput | undefined): Promise { return this.request({ @@ -97,7 +83,6 @@ export class Provider }).then((res: SolSignInResponse) => res); } signTransaction(transaction: SolSignTransactionRequest): Promise { - console.log("signTransaction"); return this.request({ method: "sol_signTransaction", params: [JSON.stringify(transaction)], diff --git a/packages/extension/src/providers/solana/libs/api.ts b/packages/extension/src/providers/solana/libs/api.ts index b350069f4..7445d4cdd 100644 --- a/packages/extension/src/providers/solana/libs/api.ts +++ b/packages/extension/src/providers/solana/libs/api.ts @@ -2,9 +2,9 @@ import { SOLRawInfo } from "@/types/activity"; import { ProviderAPIInterface } from "@/types/provider"; import { getAddress as getSolAddress } from "../types/sol-network"; import { Connection, PublicKey } from "@solana/web3.js"; -import { numberToHex } from "@enkryptcom/utils"; -import { ERC20TokenInfo } from "@/providers/ethereum/types"; +import { hexToBuffer, numberToHex } from "@enkryptcom/utils"; import cacheFetch from "@/libs/cache-fetch"; +import { SPLTokenInfo } from "../types/sol-token"; class API implements ProviderAPIInterface { node: string; @@ -47,15 +47,19 @@ class API implements ProviderAPIInterface { return numberToHex(balance); } async broadcastTx(rawtx: string): Promise { - console.log(rawtx, "broadcasttx"); - return true; + return this.web3 + .sendRawTransaction(hexToBuffer(rawtx)) + .then(() => true) + .catch(() => false); } - getTokenInfo = async (contractAddress: string): Promise => { + getTokenInfo = async (contractAddress: string): Promise => { interface TokenDetails { address: string; decimals: number; name: string; symbol: string; + logoURI: string; + extensions?: { coingeckoId: string }; } const allTokensResponse = await cacheFetch( { @@ -72,17 +76,33 @@ class API implements ProviderAPIInterface { 60 * 60 * 1000 ); const allTokens = allTokensResponse as Record; + let decimals = 9; if (allTokens[contractAddress]) { return { name: allTokens[contractAddress].name, symbol: allTokens[contractAddress].symbol, decimals: allTokens[contractAddress].decimals, + icon: allTokens[contractAddress].logoURI, + cgId: allTokens[contractAddress].extensions?.coingeckoId + ? allTokens[contractAddress].extensions?.coingeckoId + : undefined, }; + } else { + await this.web3 + .getParsedAccountInfo(new PublicKey(contractAddress)) + .then((info) => { + decimals = (info.value?.data as any).parsed.info.decimals; + }) + .catch(() => { + decimals = 9; + }); } return { name: "Unknown", symbol: "UNKNWN", - decimals: 9, + decimals, + icon: undefined, + cgId: undefined, }; }; } diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/solana.ts b/packages/extension/src/providers/solana/libs/wallet-standard/solana.ts index 0763451f6..95725a680 100644 --- a/packages/extension/src/providers/solana/libs/wallet-standard/solana.ts +++ b/packages/extension/src/providers/solana/libs/wallet-standard/solana.ts @@ -6,17 +6,13 @@ import type { Transaction, VersionedTransaction } from "@solana/web3.js"; /** Solana Mainnet (beta) cluster, e.g. https://api.mainnet-beta.solana.com */ export const SOLANA_MAINNET_CHAIN = "solana:mainnet"; -/** Solana Devnet cluster, e.g. https://api.devnet.solana.com */ -export const SOLANA_DEVNET_CHAIN = "solana:devnet"; - -/** Solana Testnet cluster, e.g. https://api.testnet.solana.com */ -export const SOLANA_TESTNET_CHAIN = "solana:testnet"; +// /** Solana Devnet cluster, e.g. https://api.devnet.solana.com */ +// export const SOLANA_DEVNET_CHAIN = "solana:devnet"; /** Array of all Solana clusters */ export const SOLANA_CHAINS = [ SOLANA_MAINNET_CHAIN, - SOLANA_DEVNET_CHAIN, - SOLANA_TESTNET_CHAIN, + // SOLANA_DEVNET_CHAIN, ] as const; /** Type of all Solana clusters */ diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts index 398becc9a..3941679c5 100644 --- a/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts +++ b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts @@ -16,7 +16,6 @@ import { type SolanaSignTransactionMethod, type SolanaSignTransactionOutput, } from "@solana/wallet-standard-features"; -import { Transaction, VersionedTransaction } from "@solana/web3.js"; import type { Wallet } from "@wallet-standard/base"; import { StandardConnect, @@ -33,13 +32,7 @@ import { } from "@wallet-standard/features"; import { EnkryptWalletAccount } from "./account.js"; import { icon } from "./icon.js"; -import type { SolanaChain } from "./solana.js"; -import { - isSolanaChain, - isVersionedTransaction, - SOLANA_CHAINS, -} from "./solana.js"; -import { bytesEqual } from "./util.js"; +import { isSolanaChain, SOLANA_CHAINS } from "./solana.js"; import type { Enkrypt } from "./window.js"; export const EnkryptNamespace = "enkrypt:"; @@ -215,45 +208,32 @@ export class EnkryptWallet implements Wallet { ...inputs ) => { if (!this.#accounts?.length) throw new Error("not connected"); - console.log(inputs); - throw new Error("not implemented: signAndSendTransaction"); - // const outputs: SolanaSignAndSendTransactionOutput[] = []; - - // if (inputs.length === 1) { - // // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - // const { transaction, account, chain, options } = inputs[0]!; - // const { minContextSlot, preflightCommitment, skipPreflight, maxRetries } = - // options || {}; - // if (account !== this.#account) throw new Error("invalid account"); - // if (!isSolanaChain(chain)) throw new Error("invalid chain"); - - // const { signature } = await this.#enkrypt.signAndSendTransaction( - // VersionedTransaction.deserialize(transaction), - // { - // preflightCommitment, - // minContextSlot, - // maxRetries, - // skipPreflight, - // } - // ); - - // outputs.push({ signature: bs58.decode(signature) }); - // } else if (inputs.length > 1) { - // for (const input of inputs) { - // outputs.push(...(await this.#signAndSendTransaction(input))); - // } - // } - - // return outputs; + const outputs: SolanaSignAndSendTransactionOutput[] = []; + for (const input of inputs) { + const { transaction, account, chain, options } = input; + const validAccount = this.#accounts.find( + (acc) => acc.address === account.address + ); + if (!validAccount) throw new Error("invalid account"); + if (!isSolanaChain(chain)) throw new Error("invalid chain"); + const signature = await this.#enkrypt.signAndSendTransaction( + { + address: account.address, + hex: uint8ArrayToHex(transaction), + chain: chain, + }, + options || {} + ); + outputs.push({ signature: hexToUint8Array(signature) }); + } + return outputs; }; #signTransaction: SolanaSignTransactionMethod = async (...inputs) => { if (!this.#accounts?.length) throw new Error("not connected"); const outputs: SolanaSignTransactionOutput[] = []; - - if (inputs.length === 1) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { transaction, account, chain } = inputs[0]!; + for (const input of inputs) { + const { transaction, account, chain } = input; const validAccount = this.#accounts.find( (acc) => acc.address === account.address ); @@ -265,56 +245,8 @@ export class EnkryptWallet implements Wallet { hex: uint8ArrayToHex(transaction), chain: chain, }); - - // const serializedTransaction = isVersionedTransaction(signedTransaction) - // ? signedTransaction.serialize() - // : new Uint8Array( - // (signedTransaction as Transaction).serialize({ - // requireAllSignatures: false, - // verifySignatures: false, - // }) - // ); - outputs.push({ signedTransaction: hexToUint8Array(signedTransaction) }); - } else if (inputs.length > 1) { - // let chain: SolanaChain | undefined = undefined; - // for (const input of inputs) { - // const validAccount = this.#accounts.find( - // (acc) => acc.address === input.account.address - // ); - // if (!validAccount) throw new Error("invalid account"); - // if (input.chain) { - // if (!isSolanaChain(input.chain)) throw new Error("invalid chain"); - // if (chain) { - // if (input.chain !== chain) throw new Error("conflicting chain"); - // } else { - // chain = input.chain; - // } - // } - // } - // const transactions = inputs.map(({ transaction }) => - // VersionedTransaction.deserialize(transaction) - // ); - // const signedTransactions = await this.#enkrypt.signAllTransactions( - // transactions - // ); - // outputs.push( - // ...signedTransactions.map((signedTransaction) => { - // const serializedTransaction = isVersionedTransaction( - // signedTransaction - // ) - // ? signedTransaction.serialize() - // : new Uint8Array( - // (signedTransaction as Transaction).serialize({ - // requireAllSignatures: false, - // verifySignatures: false, - // }) - // ); - // return { signedTransaction: serializedTransaction }; - // }) - // ); } - return outputs; }; diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/window.ts b/packages/extension/src/providers/solana/libs/wallet-standard/window.ts index 491fc3fb6..3291e359c 100644 --- a/packages/extension/src/providers/solana/libs/wallet-standard/window.ts +++ b/packages/extension/src/providers/solana/libs/wallet-standard/window.ts @@ -1,7 +1,4 @@ -import type { - SolanaSignInInput, - SolanaSignInOutput, -} from "@solana/wallet-standard-features"; +import type { SolanaSignInInput } from "@solana/wallet-standard-features"; import type { SendOptions, Transaction, @@ -41,14 +38,11 @@ export interface Enkrypt extends EnkryptEventEmitter { accounts: EnkryptSolAccount[]; connect(options?: { onlyIfTrusted?: boolean }): Promise; disconnect(): Promise; - signAndSendTransaction( - transaction: T, + signAndSendTransaction( + transaction: SolSignTransactionRequest, options?: SendOptions - ): Promise<{ signature: TransactionSignature }>; + ): Promise; signTransaction(transaction: SolSignTransactionRequest): Promise; - signAllTransactions( - transactions: T[] - ): Promise; signMessage(options: { address: string; message: string; diff --git a/packages/extension/src/providers/solana/methods/sol_signTransaction.ts b/packages/extension/src/providers/solana/methods/sol_signTransaction.ts index 33e09b9f4..2c1345d28 100644 --- a/packages/extension/src/providers/solana/methods/sol_signTransaction.ts +++ b/packages/extension/src/providers/solana/methods/sol_signTransaction.ts @@ -11,7 +11,11 @@ const method: MiddlewareFunction = function ( res, next ): void { - if (payload.method !== "sol_signTransaction") return next(); + if ( + payload.method !== "sol_signTransaction" && + payload.method !== "sol_signAndSendTransaction" + ) + return next(); else { if (!payload.params || payload.params.length < 1) { return res( @@ -29,7 +33,13 @@ const method: MiddlewareFunction = function ( this.getUIPath(this.UIRoutes.solSendTransaction.path), JSON.stringify({ ...payload, - params: [payload.params![0], account, this.network.name], + params: [ + payload.method, + payload.params![0], + payload.params![1], + account, + this.network.name, + ], }), true ) diff --git a/packages/extension/src/providers/solana/types/sol-token.ts b/packages/extension/src/providers/solana/types/sol-token.ts index 636b7befa..402b49bc1 100644 --- a/packages/extension/src/providers/solana/types/sol-token.ts +++ b/packages/extension/src/providers/solana/types/sol-token.ts @@ -1,5 +1,11 @@ import { BaseToken, BaseTokenOptions } from "@/types/base-token"; import SolanaAPI from "@/providers/bitcoin/libs/api"; +import { ERC20TokenInfo } from "@/providers/ethereum/types"; + +export interface SPLTokenInfo extends ERC20TokenInfo { + icon: string | undefined; + cgId: string | undefined; +} export interface SolTokenOptions extends BaseTokenOptions { contract: string; diff --git a/packages/extension/src/providers/solana/ui/libs/decode-tx.ts b/packages/extension/src/providers/solana/ui/libs/decode-tx.ts new file mode 100644 index 000000000..03b0d4051 --- /dev/null +++ b/packages/extension/src/providers/solana/ui/libs/decode-tx.ts @@ -0,0 +1,158 @@ +import { NATIVE_TOKEN_ADDRESS } from "@/providers/ethereum/libs/common"; +import { + ACCOUNT_SIZE, + AccountLayout, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { VersionedTransaction, PublicKey } from "@solana/web3.js"; +import SolanaAPI from "@/providers/solana/libs/api"; +import { SolanaNetwork } from "../../types/sol-network"; +import { toBN } from "web3-utils"; +import BigNumber from "bignumber.js"; +import { fromBase } from "@enkryptcom/utils"; +import MarketData from "@/libs/market-data"; + +export interface DecodedTxResponseType { + contract: string; + decimals: number; + icon: string; + change: number; + isNegative: boolean; + name: string; + symbol: string; + USDval: string; + price: string; +} +const assetFetch = ( + node: string, + method: string, + params: any +): Promise => { + return fetch(node, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + jsonrpc: "2.0", + id: "rpd-op-123", + method, + params, + }), + }).then((res) => res.json()); +}; + +const decodeTransaction = async ( + tx: VersionedTransaction, + from: PublicKey, + network: SolanaNetwork +) => { + const solAPI = (await network.api()).api as SolanaAPI; + const allBalances = await network.getAllTokenInfo(from.toBase58()); + const marketData = new MarketData(); + return solAPI.web3 + .simulateTransaction(tx, { + accounts: { + addresses: tx.message.staticAccountKeys.map((k) => k.toBase58()), + encoding: "base64", + }, + }) + .then(async (result) => { + if (result.value.err) return null; + const nativeChange = { + contract: NATIVE_TOKEN_ADDRESS, + amount: BigInt(result.value.accounts![0]!.lamports), + }; + const balanceChanges = result.value + .accounts!.filter((a) => { + const data = Buffer.from(a!.data[0], "base64"); + return ( + a!.owner === TOKEN_PROGRAM_ID.toBase58() && + data.length === ACCOUNT_SIZE + ); + }) + .map((a) => { + const data = Buffer.from(a!.data[0], "base64"); + return AccountLayout.decode(data); + }) + .filter((val) => val.owner.toBase58() === from.toBase58()) + .map((val) => { + return { + contract: val.mint.toBase58(), + amount: val.amount, + }; + }); + const getTokenInfoPromises = await Promise.all( + balanceChanges.map((val) => { + return solAPI.getTokenInfo(val.contract).then((info) => { + return { + ...info, + ...val, + }; + }); + }) + ); + getTokenInfoPromises.unshift({ + amount: nativeChange.amount, + cgId: network.coingeckoID, + contract: NATIVE_TOKEN_ADDRESS, + decimals: network.decimals, + icon: network.icon, + name: network.currencyNameLong, + symbol: network.currencyName, + }); + const retVal: DecodedTxResponseType[] = []; + for (const token of getTokenInfoPromises) { + const res: DecodedTxResponseType = { + change: 0, + contract: token.contract, + decimals: token.decimals, + icon: token.icon || "", + isNegative: false, + name: token.name, + symbol: token.symbol, + price: "0", + USDval: "0", + }; + const balInfo = allBalances.find((b) => b.contract === token.contract); + if (balInfo) { + const curBalance = toBN(balInfo.balance); + const newBalance = toBN(token.amount.toString()); + const diff = newBalance.sub(curBalance).toNumber(); + res.change = Math.abs(diff); + res.isNegative = diff < 0; + res.USDval = new BigNumber(balInfo.value) + .times(fromBase(res.change.toString(), res.decimals)) + .toString(); + res.price = balInfo.value; + } else { + res.change = toBN(token.amount.toString()).toNumber(); + res.isNegative = false; + if (token.cgId) { + const val = await marketData.getMarketData([token.cgId]); + res.USDval = new BigNumber(val[0]!.current_price) + .times(fromBase(res.change.toString(), res.decimals)) + .toString(); + res.price = val[0]!.current_price.toString(); + } + } + if (token.decimals === 0) { + const assetDetails = await assetFetch(network.node, "getAsset", { + id: token.contract, + }).catch(() => { + return null; + }); + if (assetDetails) { + res.icon = `https://img.mewapi.io/?image=${assetDetails.result.content.links.image}`; + res.name = assetDetails.result.content.metadata.name; + res.symbol = assetDetails.result.content.metadata.symbol; + } + } + retVal.push(res); + } + retVal.sort((v) => (v.isNegative ? -1 * v.change : v.change)); + return retVal; + }); +}; + +export default decodeTransaction; diff --git a/packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue b/packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue index 31fac7429..21add0fda 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/components/send-fee-select.vue @@ -46,12 +46,13 @@ defineProps({ min-height: 40px; height: auto; background: #ffffff; - margin: 0px 32px 8px 32px; + margin-right: 32px; + margin-bottom: 8px; box-sizing: border-box; border: 1px solid @gray02; box-sizing: border-box; border-radius: 10px; - width: calc(~"100% - 64px"); + width: calc(~"100%"); padding: 10px 16px; display: flex; justify-content: flex-start; diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index 2b6f1d4d6..31b59ae81 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -88,6 +88,7 @@ /> @@ -222,7 +223,6 @@ const hasEnoughBalance = computed(() => { if (!isValidDecimals(sendAmount.value, selectedAsset.value.decimals!)) { return false; } - return toBN(selectedAsset.value.balance ?? "0").gte( toBN(toBase(sendAmount.value ?? "0", selectedAsset.value.decimals!)) ); diff --git a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue index 22824a093..01b53a1a8 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue @@ -240,7 +240,7 @@ const sendAction = async () => { } }; solAPI.web3 - .sendRawTransaction(Buffer.from(transaction.serialize())) + .sendRawTransaction(transaction.serialize()) .then((hash) => { onHash(hash); }) diff --git a/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue b/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue index d9f8c81d6..b489cbfc4 100644 --- a/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue +++ b/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue @@ -73,7 +73,6 @@ import ModalAccounts from "@action/views/modal-accounts/index.vue"; import { AccountsHeaderData } from "@action/types/account"; import { EnkryptAccount } from "@enkryptcom/types"; import { - DEFAULT_BTC_NETWORK, DEFAULT_SOLANA_NETWORK, getNetworkByName, } from "@/libs/utils/networks"; diff --git a/packages/extension/src/providers/solana/ui/sol-sign-message.vue b/packages/extension/src/providers/solana/ui/sol-sign-message.vue index 51cb0ebf6..00206ee43 100644 --- a/packages/extension/src/providers/solana/ui/sol-sign-message.vue +++ b/packages/extension/src/providers/solana/ui/sol-sign-message.vue @@ -66,10 +66,7 @@ import { import { ProviderRequestOptions } from "@/types/provider"; import { SolanaNetwork } from "../types/sol-network"; import { EnkryptAccount, SignerType } from "@enkryptcom/types"; -import { - SolanaSignInInput, - SolanaSignInOutput, -} from "@solana/wallet-standard-features"; +import { SolanaSignInInput } from "@solana/wallet-standard-features"; import bs58 from "bs58"; import { bufferToHex, hexToBuffer, utf8ToHex } from "@enkryptcom/utils"; import PublicKeyRing from "@/libs/keyring/public-keyring"; diff --git a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue index 4a19ef023..89b4d9e22 100644 --- a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue +++ b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue @@ -46,74 +46,50 @@
-
- +
+
+ -
-

- {{ parseFloat(item.change) < 0 ? "-" : "" }} - {{ - $filters.formatFloatingPointValue( - Math.abs(parseFloat(item.change)) - ).value - }} - {{ item.name }} -

-

- {{ parseFloat(item.change) < 0 ? "-" : "" }} - ${{ - $filters.formatFiatValue(Math.abs(parseFloat(item.usdval))) - .value - }} -

+
+

+ {{ item.isNegative ? "-" : "" }} + {{ + $filters.formatFloatingPointValue( + fromBase(item.change.toString(), item.decimals) + ).value + }} + {{ item.symbol }} +

+

+ {{ item.isNegative ? "-" : "" }} + ${{ $filters.formatFiatValue(parseFloat(item.USDval)).value }} +

+
-
+

- Warning: you will allow this DApp to spend {{ approvalAmount }} of - {{ decodedTx?.tokenName || network.currencyName }} at any time in - the future. Please proceed only if you are trust this DApp. + Warning: This transaction failed during simulation, which means this + transaction will most likely fail!

- -
- Show data - -
-

Data Hex: {{ decodedTx?.dataHex || "0x" }}

-
-

{{ errorMsg }}

- - - - - diff --git a/packages/extension/src/providers/polkadot/ui/send-transaction/components/send-from-contacts-list.vue b/packages/extension/src/providers/polkadot/ui/send-transaction/components/send-from-contacts-list.vue deleted file mode 100644 index fa52defff..000000000 --- a/packages/extension/src/providers/polkadot/ui/send-transaction/components/send-from-contacts-list.vue +++ /dev/null @@ -1,148 +0,0 @@ - - - - - diff --git a/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue b/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue index 36e767183..5e9db5f06 100644 --- a/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/polkadot/ui/send-transaction/index.vue @@ -21,10 +21,9 @@ @@ -39,9 +38,9 @@ ; + isSegwit: boolean; + constructor(network: NetworkNames) { this.transport = null; this.network = network; this.HDNodes = {}; + this.isSegwit = !!( + this.network === NetworkNames.Bitcoin || + this.network === NetworkNames.Litecoin + ); } async init(): Promise { @@ -59,7 +64,7 @@ class LedgerBitcoin implements HWWalletProvider { if (!this.HDNodes[options.pathType.basePath]) { const rootPub = await connection.getWalletPublicKey( options.pathType.basePath, - { format: "bech32" } + { format: this.isSegwit ? "bech32" : "legacy" } ); hdKey.publicKey = Buffer.from(rootPub.publicKey, "hex"); hdKey.chainCode = Buffer.from(rootPub.chainCode, "hex"); @@ -77,7 +82,7 @@ class LedgerBitcoin implements HWWalletProvider { return connection .getWalletPublicKey( options.pathType.path.replace(`{index}`, options.pathIndex), - { format: "bech32" } + { format: this.isSegwit ? "bech32" : "legacy" } ) .then((res) => { hdKey.publicKey = Buffer.from(res.publicKey, "hex"); @@ -134,9 +139,12 @@ class LedgerBitcoin implements HWWalletProvider { outputScriptHex: serializeTransactionOutputs({ outputs: txOutputs, } as any).toString("hex"), - segwit: true, - additionals: ["bech32"], + segwit: this.isSegwit, + additionals: [], }; + if (this.isSegwit) { + txArg.additionals.push("bech32"); + } return connection.createPaymentTransaction(txArg).then((result) => result); } From b4a69bd5b331f0a78c60d75ef9894f9869c1e53d Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:54:12 -0700 Subject: [PATCH 292/375] feat: add trezor support for dogecoin --- packages/hw-wallets/src/configs.ts | 5 +++++ .../hw-wallets/src/trezor/bitcoin/configs.ts | 18 +++++++++++++++++- .../hw-wallets/src/trezor/bitcoin/index.ts | 12 +++++++----- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/packages/hw-wallets/src/configs.ts b/packages/hw-wallets/src/configs.ts index b22f65472..782de1736 100644 --- a/packages/hw-wallets/src/configs.ts +++ b/packages/hw-wallets/src/configs.ts @@ -100,5 +100,10 @@ const bip44Paths = { basePath: "m/84'/2'/0'/0", label: "Litecoin", }, + dogecoinTrezor: { + path: "m/44'/3'/0'/0/{index}", + basePath: "m/44'/3'/0'/0", + label: "Dogecoin", + }, }; export { walletConfigs, MessengerName, ledgerAppNames, bip44Paths }; diff --git a/packages/hw-wallets/src/trezor/bitcoin/configs.ts b/packages/hw-wallets/src/trezor/bitcoin/configs.ts index 7d3387e15..0e534fe94 100644 --- a/packages/hw-wallets/src/trezor/bitcoin/configs.ts +++ b/packages/hw-wallets/src/trezor/bitcoin/configs.ts @@ -4,5 +4,21 @@ import { bip44Paths } from "../../configs"; const supportedPaths = { [NetworkNames.Bitcoin]: [bip44Paths.bitcoinSegwitTrezor], [NetworkNames.Litecoin]: [bip44Paths.litecoinSegwitTrezor], + [NetworkNames.Dogecoin]: [bip44Paths.dogecoinTrezor], }; -export { supportedPaths }; + +const TrezorNetworkConfigs = { + [NetworkNames.Bitcoin]: { + symbol: "btc", + isSegwit: true, + }, + [NetworkNames.Litecoin]: { + symbol: "ltc", + isSegwit: true, + }, + [NetworkNames.Dogecoin]: { + symbol: "doge", + isSegwit: false, + }, +}; +export { supportedPaths, TrezorNetworkConfigs }; diff --git a/packages/hw-wallets/src/trezor/bitcoin/index.ts b/packages/hw-wallets/src/trezor/bitcoin/index.ts index b7009d0c8..1ae46cc74 100644 --- a/packages/hw-wallets/src/trezor/bitcoin/index.ts +++ b/packages/hw-wallets/src/trezor/bitcoin/index.ts @@ -12,7 +12,7 @@ import { SignMessageRequest, SignTransactionRequest, } from "../../types"; -import { supportedPaths } from "./configs"; +import { supportedPaths, TrezorNetworkConfigs } from "./configs"; class TrezorEthereum implements HWWalletProvider { network: NetworkNames; @@ -90,13 +90,15 @@ class TrezorEthereum implements HWWalletProvider { options.pathType.path.replace(`{index}`, options.pathIndex) ); return TrezorConnect.signTransaction({ - coin: this.network === NetworkNames.Bitcoin ? "btc" : "ltc", - inputs: transactionOptions.psbtTx.txInputs.map((tx, idx) => ({ + coin: TrezorNetworkConfigs[this.network].symbol, + inputs: transactionOptions.psbtTx.txInputs.map((tx) => ({ address_n: addressN, prev_hash: tx.hash.reverse().toString("hex"), prev_index: tx.index, - amount: transactionOptions.psbtTx.data.inputs[idx].witnessUtxo.value, - script_type: "SPENDWITNESS", + amount: 0, + script_type: TrezorNetworkConfigs[this.network].isSegwit + ? "SPENDWITNESS" + : "SPENDADDRESS", })), outputs: transactionOptions.psbtTx.txOutputs.map((out) => ({ amount: out.value, From f0afe1f978ff5afe39a5a82968fe228c4b1cae27 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 30 Aug 2024 12:56:45 -0700 Subject: [PATCH 293/375] devop: minor comment --- packages/hw-wallets/src/trezor/bitcoin/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hw-wallets/src/trezor/bitcoin/index.ts b/packages/hw-wallets/src/trezor/bitcoin/index.ts index 1ae46cc74..e2b46dc78 100644 --- a/packages/hw-wallets/src/trezor/bitcoin/index.ts +++ b/packages/hw-wallets/src/trezor/bitcoin/index.ts @@ -95,7 +95,7 @@ class TrezorEthereum implements HWWalletProvider { address_n: addressN, prev_hash: tx.hash.reverse().toString("hex"), prev_index: tx.index, - amount: 0, + amount: 0, // doesnt seem like this do anything script_type: TrezorNetworkConfigs[this.network].isSegwit ? "SPENDWITNESS" : "SPENDADDRESS", From 28ade35f6dd0356f1c87b176a5e311a31c929eb1 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 3 Sep 2024 12:51:41 -0500 Subject: [PATCH 294/375] feat: automatic jupiter fee account creation, fix: some swap bug --- .../src/ui/action/views/swap/index.vue | 157 ++- .../views/swap/libs/send-transactions.ts | 2 - .../action/views/swap/libs/solana-gasvals.ts | 35 +- .../swap/views/swap-best-offer/index.vue | 1 + packages/swap/src/configs.ts | 6 +- packages/swap/src/index.ts | 12 +- packages/swap/src/providers/jupiter/index.ts | 1046 ++++++++++++++--- packages/swap/src/types/index.ts | 7 +- 8 files changed, 1000 insertions(+), 266 deletions(-) diff --git a/packages/extension/src/ui/action/views/swap/index.vue b/packages/extension/src/ui/action/views/swap/index.vue index a0428559c..9e8573fe0 100644 --- a/packages/extension/src/ui/action/views/swap/index.vue +++ b/packages/extension/src/ui/action/views/swap/index.vue @@ -223,8 +223,12 @@ const errors = ref({ }); const bestProviderQuotes = ref([]); +/** Receiver address (address that will be receiving the swap output) */ const address = ref(""); + +/** Is the receiver address valid */ const addressIsValid = ref(true); + const isOpenSelectContact = ref(false); const addressInput = ref(); const toAccounts = ref([]); @@ -272,7 +276,7 @@ onMounted(async () => { .getAllTokenInfo(props.accountInfo.selectedAccount?.address as string) .then(async (tokens) => { await swap.initPromise; - let swapFromTokens = await swap.getFromTokens(); + let swapFromTokens = swap.getFromTokens(); const tokensWithBalance: Record = {}; tokens.forEach((t) => { if ( @@ -422,21 +426,29 @@ const toggleSelectContact = () => { isOpenSelectContact.value = !isOpenSelectContact.value; }; +/** + * Check whether the receiver address is a valid on the network + * + * If it is then asynchronously refresh the quote + */ const isValidToAddress = debounce(() => { addressIsValid.value = true; if (!address.value) addressIsValid.value = false; else { try { const converted = toAddressInputMeta.value.displayAddress(address.value); - toToken.value?.networkInfo.isAddress(converted).then((res) => { - addressIsValid.value = res; - if (res) updateQuote(); - }); + toToken.value?.networkInfo + .isAddress(converted) + .then((receiverAddressIsValid) => { + addressIsValid.value = receiverAddressIsValid; + if (receiverAddressIsValid) checkUpdateQuote(); + }); } catch (e) { addressIsValid.value = false; } } }, 200); + const nativeSwapToken = computed(() => { const nToken = fromTokens.value?.find( (ft) => ft.address === NATIVE_TOKEN_ADDRESS @@ -451,6 +463,13 @@ const nativeSwapToken = computed(() => { * Update the quote list and dest asset amount based */ const pickBestQuote = (fromAmountBN: BN, quotes: ProviderQuoteResponse[]) => { + if (toToken.value == null) { + console.debug( + "Skipping quote picking: no destination token amount selected yet" + ); + return; + } + errors.value.inputAmount = ""; // No quotes at all @@ -516,6 +535,7 @@ const pickBestQuote = (fromAmountBN: BN, quotes: ProviderQuoteResponse[]) => { filteredQuotes.sort((a, b) => (b.toTokenAmount.gt(a.toTokenAmount) ? 1 : -1)); // Apply the results + // NOTE: toToken.value is sometimes not defined here? (it's null) toAmount.value = new SwapToken(toToken.value!).toReadable( filteredQuotes[0].toTokenAmount ); @@ -523,6 +543,33 @@ const pickBestQuote = (fromAmountBN: BN, quotes: ProviderQuoteResponse[]) => { isFindingRate.value = false; }; +/** Used to cancel avoid race conditions */ +const updateQuoteContext = { + /** view id */ + id: Math.random().toString().substring(2).slice(0, 3).padStart(3, "0"), + current: { + /** context id */ + id: 0, + /** context aborter */ + aborter: new AbortController(), + }, +}; + +function checkUpdateQuote() { + if ( + fromToken.value && + toToken.value && + fromAmount.value && + !isNaN(fromAmount.value as any) && + Number(fromAmount.value) > 0 + ) { + updateQuote(); + } else { + isFindingRate.value = false; + toAmount.value = ""; + } +} + /** * Request quotes from all swap providers & pick the best one */ @@ -532,48 +579,88 @@ const updateQuote = () => { bestProviderQuotes.value = []; errors.value.noProviders = false; const token = new SwapToken(fromToken.value!); - const fromRawAmount = token.toRaw(fromAmount.value!); + if (fromAmount.value == null) { + // User probably set a destination token before setting a "from" amount + console.debug("Skipping quote update: no source token amount set"); + return; + } + let fromRawAmount: BN; + try { + fromRawAmount = token.toRaw(fromAmount.value!); + } catch (err) { + console.warn( + `Failed to convert amount to raw: ${err}` + + ` fromAmount.value=${fromAmount.value} (${typeof fromAmount.value})` + ); + throw err; + } trackSwapEvents(SwapEventType.SwapRate, { network: props.network.name, fromToken: fromToken.value!.name, toToken: toToken.value!.name, }); + if (!toToken.value) { + console.warn("No destination token selected yet, yet requesting a quote??"); + } + + // Avoid race conditions + // Abort the previous execution (doesn't actually cancel anything + // since nothing is listening to the abort signal but once the quotes + // are ready they'll just be dropped) + updateQuoteContext.current.aborter.abort(); + const vid = updateQuoteContext.id; + // Setup a new abortable context + const ctx = { + id: updateQuoteContext.current.id + 1, + aborter: new AbortController(), + }; + updateQuoteContext.current = ctx; + console.debug(`Starting quote update id=${vid}:${ctx.id}`); + swap - .getQuotes({ - amount: fromRawAmount, - fromAddress: props.network.displayAddress( - props.accountInfo.selectedAccount!.address - ), - fromToken: fromToken.value!, - toToken: toToken.value!, - toAddress: toAddressInputMeta.value.displayAddress(address.value), - }) + .getQuotes( + { + amount: fromRawAmount, + fromAddress: props.network.displayAddress( + props.accountInfo.selectedAccount!.address + ), + fromToken: fromToken.value!, + toToken: toToken.value!, + toAddress: toAddressInputMeta.value.displayAddress(address.value), + }, + { signal: ctx.aborter.signal } + ) .then((quotes) => { - if (quotes.length) pickBestQuote(fromRawAmount, quotes); - else { + // Overidden by new update, drop these quotes + if (ctx.aborter.signal.aborted) { + console.debug(`Dropping quotes due to new update id=${vid}:${ctx.id}`); + return; + } + + if (quotes.length) { + console.debug(`Found ${quotes.length} quotes id=${vid}:${ctx.id}`); + pickBestQuote(fromRawAmount, quotes); + } else { + console.debug(`No quotes id=${vid}:${ctx.id}`); isFindingRate.value = false; errors.value.noProviders = true; } + }) + .catch((err) => { + // Context aborted, just ignore the error + if (err === ctx.aborter.signal.reason) { + console.debug( + `Ignoring error due to quote request context abort id=${vid}:${ctx.id}` + ); + return; + } + throw err; }); }; -watch( - [fromToken, toToken, fromAmount], - debounce(async () => { - if ( - fromToken.value && - toToken.value && - fromAmount.value && - !isNaN(fromAmount.value as any) && - Number(fromAmount.value) > 0 - ) { - updateQuote(); - } else { - isFindingRate.value = false; - toAmount.value = ""; - } - }, 300) -); +// Whenever the token types or amounts change, update the quote (within a +// debounce) +watch([fromToken, toToken, fromAmount], debounce(checkUpdateQuote, 300)); const selectTokenFrom = (token: TokenType | TokenTypeTo) => { fromToken.value = token as TokenType; @@ -704,11 +791,13 @@ const sendAction = async () => { const trades: (ProviderResponseWithStatus | null)[] = await Promise.all( tradePromises ).then((responses) => responses.filter((r) => !!r)); + const tradeStatusOptions = trades.map((t) => t!.getStatusObject({ transactionHashes: [], }) ); + const statusObjects = await Promise.all(tradeStatusOptions); trades.forEach((t, idx) => (t!.status = statusObjects[idx])); if (!trades.length) { diff --git a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts index 2c5251456..5fbebd509 100644 --- a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts +++ b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts @@ -37,8 +37,6 @@ import BitcoinAPI from "@/providers/bitcoin/libs/api"; import SolanaAPI from "@/providers/solana/libs/api"; import { VersionedTransaction as SolanaVersionedTransaction, - Transaction as SolanaTransaction, - PublicKey as SolPublicKey, PublicKey, SendTransactionError, } from "@solana/web3.js"; diff --git a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts index fd6570495..9b4a92284 100644 --- a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts +++ b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts @@ -1,5 +1,3 @@ -// TODO: is this worth trying to figure out for Solana? It's so cheap anyway - import { GasFeeType, GasPriceTypes } from "@/providers/common/types"; import SolanaAPI from "@/providers/solana/libs/api"; import { SolanaNetwork } from "@/providers/solana/types/sol-network"; @@ -12,12 +10,11 @@ export const getSolanaTransactionFees = async ( price: number, additionalFee: ReturnType ): Promise> => { - // NOTE: if this is too slow we can do it in parallel or we can - // try to calculate the fee ourselves let feesumlamp = additionalFee; const conn = ((await network.api()) as SolanaAPI).web3; for (let i = 0, len = txs.length; i < len; i++) { const tx = txs[i]; + /** Base fee + priority fee */ const fee = await conn.getFeeForMessage(tx.message, "processed"); if (fee.value == null) { // TODO: handle this @@ -29,36 +26,18 @@ export const getSolanaTransactionFees = async ( } // Convert from lamports to SOL - // TODO: are we at risk of float overflow? (I think BN throws an error - // on float overflow, i.e. bn.toNumber() > 2 ** 53) - // NOTE: Solana has 9 decimals (hence 10e-10) - const feesumsol = feesumlamp.toNumber() * 10e-10; + // Hope that we'll never get 64 bit floating point overflow in BN.toNumber()... + const feesumsol = feesumlamp.toNumber() * 1e-9; // TODO: give different fees for different priority levels return { - // [GasPriceTypes.ECONOMY]: { - // nativeValue: feesumsol.toString(), - // fiatValue: (price * feesumsol).toString(), - // nativeSymbol: "SOL", - // fiatSymbol: "USD", - // }, [GasPriceTypes.REGULAR]: { - nativeValue: feesumsol.toString(), - fiatValue: (price * feesumsol).toString(), + // Convert to string, cut off floating point rounding errors, trim + // redundant trailing 0's + nativeValue: feesumsol.toFixed(10).replace(/\.?0+$/, ""), + fiatValue: (price * feesumsol).toFixed(10).replace(/\.?0+$/, ""), nativeSymbol: "SOL", fiatSymbol: "USD", }, - // [GasPriceTypes.FAST]: { - // nativeValue: feesumsol.toString(), - // fiatValue: (price * feesumsol).toString(), - // nativeSymbol: "SOL", - // fiatSymbol: "USD", - // }, - // [GasPriceTypes.FASTEST]: { - // nativeValue: (feesumsol * 10e9).toString(), - // fiatValue: (price * feesumsol * 10e9).toString(), - // nativeSymbol: "SOL", - // fiatSymbol: "USD", - // }, }; }; diff --git a/packages/extension/src/ui/action/views/swap/views/swap-best-offer/index.vue b/packages/extension/src/ui/action/views/swap/views/swap-best-offer/index.vue index 51aee9483..d1b0332f4 100644 --- a/packages/extension/src/ui/action/views/swap/views/swap-best-offer/index.vue +++ b/packages/extension/src/ui/action/views/swap/views/swap-best-offer/index.vue @@ -206,6 +206,7 @@ const setWarning = async () => { console.warn("No gas cost values for selected fee"); return; } + const currentGasCost = toBase( selectedGasTier.nativeValue, network.value!.decimals diff --git a/packages/swap/src/configs.ts b/packages/swap/src/configs.ts index 5e0de5f48..351580cfe 100644 --- a/packages/swap/src/configs.ts +++ b/packages/swap/src/configs.ts @@ -57,12 +57,14 @@ const FEE_CONFIGS: Partial< [ProviderName.jupiter]: { [WalletIdentifier.enkrypt]: { // TODO: THIS IS NICK'S TESTING REFERRAL ADDRESS, NEEDS TO CHANGE BEFORE RELEASE - referrer: "78ZKhPea9sVW3jLsjvQov9jUooGe3qGnwauA1QoJFCq1", + // referrer: "78ZKhPea9sVW3jLsjvQov9jUooGe3qGnwauA1QoJFCq1", + referrer: "41gBjMVCQ4FD2GAsKdjVPEGLQc7K6AxoY8C7PJ7HDp6y", fee: 0.00875, }, [WalletIdentifier.mew]: { // TODO: THIS IS NICK'S TESTING REFERRAL ADDRESS, NEEDS TO CHANGE BEFORE RELEASE - referrer: "78ZKhPea9sVW3jLsjvQov9jUooGe3qGnwauA1QoJFCq1", + // referrer: "78ZKhPea9sVW3jLsjvQov9jUooGe3qGnwauA1QoJFCq1", + referrer: "41gBjMVCQ4FD2GAsKdjVPEGLQc7K6AxoY8C7PJ7HDp6y", fee: 0.025, }, }, diff --git a/packages/swap/src/index.ts b/packages/swap/src/index.ts index 28d0d9ffd..fd2f2dac2 100644 --- a/packages/swap/src/index.ts +++ b/packages/swap/src/index.ts @@ -192,13 +192,13 @@ class Swap extends EventEmitter { * * Only providers that support the network will respond */ - async getQuotes(options: getQuoteOptions): Promise { + async getQuotes(options: getQuoteOptions, context?: { signal?: AbortSignal, }): Promise { const response = await Promise.all( - this.providers.map((Provider) => - Provider.getQuote(options, { + this.providers.map((provider) => + provider.getQuote(options, { infiniteApproval: this.evmOptions.infiniteApproval, walletIdentifier: this.walletId, - }).then((res) => { + }, context).then((res) => { if (!res) return res; this.emit(Events.QuoteUpdate, res.toTokenAmount); return res; @@ -211,9 +211,9 @@ class Swap extends EventEmitter { .sort((a, b) => (b.toTokenAmount.gt(a.toTokenAmount) ? 1 : -1)); } - getSwap(quote: SwapQuote): Promise { + getSwap(quote: SwapQuote, context?: { signal?: AbortSignal, }): Promise { const provider = this.providers.find((p) => p.name === quote.provider); - return provider.getSwap(quote); + return provider.getSwap(quote, context); } getStatus(options: StatusOptionsResponse): Promise { diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 295c35b02..b11b71da7 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -1,5 +1,7 @@ +/* eslint-disable no-use-before-define, no-new, no-constant-condition, no-restricted-syntax, no-labels */ + import { NetworkNames } from "@enkryptcom/types"; -import { Connection, PublicKey, } from "@solana/web3.js"; +import { AddressLookupTableAccount, ComputeBudgetProgram, Connection, PublicKey, SystemProgram, TransactionInstruction, TransactionMessage, VersionedTransaction, } from "@solana/web3.js"; import { DEFAULT_SLIPPAGE, FEE_CONFIGS, NATIVE_TOKEN_ADDRESS } from "@src/configs"; import { ProviderClass, @@ -38,62 +40,79 @@ import { toBN } from "web3-utils"; * visiting the Jupiter referral dashboard https://referral.jup.ag/dashboard * and selecting "create account". * - * After you have a referral account (associated with a Solana address) you + * After you have a referral account (associated with your Solana address) you * need to create token accounts for it so that it can receive referral fees * for those tokens. This is also done via the Jupiter referral dashboard * https://referral.jup.ag/dashboard. * * ## Steps * - * 1. Request a quote from the Jupiter swap API + * 1. Request a quote from the Jupiter swap API * 2. Request a swap transaction from the Jupiter swap API with the quote provided - * 3. Deserialize and signt he transaction + * 2.5. Modify the transaction to create the referrer ATA to receive platform fees, if required + * 3. Deserialize and signt the transaction * 4. Execute the transaction * - * ## Extra notes + * ## Terminology * - * "Mint" is the address of a token. + * - Mint: is the address of a token. + * - SPL: Solana Program Library, a collection of on-chain programs that + * - SPL Token: a token that uses the SPL program (an in-built standard Solana + * token program) to manage its state. Similar to an ERC20 token. + * - ATA: Associated Token Account, an SPL token account that is associated with + * a Solana address. In EVM this would just be your own account. * * [Solana 101](https://2501babe.github.io/posts/solana101.html) */ +const JUPITER_TOKENS_URL = "https://tokens.jup.ag/tokens?tags=verified"; + +/** + * @see https://station.jup.ag/docs/APIs/swap-api + * @see https://station.jup.ag/api-v6/introduction + */ +const JUPITER_API_URL = "https://quote-api.jup.ag/v6/"; + /** * Wrapped SOL address * @see https://solscan.io/token/So11111111111111111111111111111111111111112 */ const WRAPPED_SOL_ADDRESS = "So11111111111111111111111111111111111111112" -// const NATIVE_SOL_ADDRESS = "So11111111111111111111111111111111111111111" +/** + * @see https://solscan.io/account/45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp + * + * Manages referral fees + */ +const JUPITER_REFERRAL_VAULT_PUBKEY = new PublicKey('45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp') + +/** + * @see https://solscan.io/account/REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3 + * + * Program targetted by instructions + */ +const JUPITER_REFERRAL_PROGRAM_PUBKEY = new PublicKey('REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3') /** - * Trim a string to (close to) the desired length and if trimmed, then - * put the cut length at the end + * Address of the SPL Token program * - * @example - * ```ts - * shorten('hello world!!', 10) // 'hello world!!' - * shorten('hello world!!', 5) // 'hello world!!' - * shorten('hello world!!', 3) // 'hel... (3/13)' - * shorten('hello world!!', 2) // 'he... (2/13)' - * shorten('hello world!!', 1) // 'h... (1/13)' - * ```` + * @see https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA + */ +export const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'); + +/** + * Address of the SPL Token 2022 program * + * @see https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb */ -function shorten(string: string, max: number): string { - let short = string - const len = short.length; - if (len > max + 7 + max.toString().length + len.toString().length) { - short = `${short.slice(0, max)}... (${max}/${len})`; - } - return short; -} +export const TOKEN_2022_PROGRAM_ID = new PublicKey('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'); + + +// Jupiter API Tokens /** * curl -sL https://tokens.jup.ag/tokens?tags=verified | jq -C | less -N */ -const JUPITER_TOKENS_URL = "https://tokens.jup.ag/tokens?tags=verified"; -const JUPITER_API_URL = "https://quote-api.jup.ag/v6/"; - type JupiterTokenInfo = { address: string; name: string; @@ -101,8 +120,11 @@ type JupiterTokenInfo = { decimals: string; } +// Jupiter API Quote + /** * see https://station.jup.ag/api-v 6/get-quote + * * ```sh * curl -sL -H 'Accept: application/json' 'https://quote-api.jup.ag/v6/quote?inputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&outputMint=So11111111111111111111111111111111111111112&amount=5' * ``` @@ -122,8 +144,13 @@ type JupiterQuoteResponse = { swapMode: string; /** @example 50 */ slippageBps: number; - /** TODO: @example null */ - platformFee: null; + /** @example {"amount":"1","feeBps":1} */ + platformFee: null | { + /** @example '1' */ + amount: string, + /** @example 1 */ + feeBps: number, + }; /** @example "0" */ priceImpactPct: string; routePlan: { @@ -154,13 +181,13 @@ type JupiterQuoteResponse = { timeTaken: number; } + +// Jupiter API Swap + /** * @see https://station.jup.ag/api-v6/post-swap - * - * @example - * ```sh - * curl -sL -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' 'https://quote-api.jup.ag/v6/swap' -d ... - * ``` + * + * HTTP request JSON body to request a Swap transaction for a given quote */ type JupiterSwapParams = { userPublicKey: string; @@ -193,21 +220,28 @@ type JupiterSwapParams = { quoteResponse: JupiterQuoteResponse; }; +/** + * @see https://station.jup.ag/api-v6/post-swap + */ type JupiterSwapResponse = { + /** Base64 encoded versioned transaction */ swapTransaction: string; + /** @example 265642441 */ lastValidBlockHeight: number + /** @example 99999 */ prioritizationFeeLamports?: number; + /** @example 1400000 */ + computeUnitLimit?: number + prioritizationType?: { + computeBudget?: { + microLamports: 71428, + estimatedMicroLamports: 142856, + }, + }, + dynamicSlippageReport: null, + simulationError: null, } -function isValidSolanaAddress(address: string): Promise { - try { - // eslint-disable-next-line no-new - new PublicKey(address) - return Promise.resolve(true) - } catch (err) { - return Promise.resolve(false) - } -} /** * Jupiter is a DEX on Solana @@ -250,30 +284,15 @@ export class Jupiter extends ProviderClass { * @param enkryptTokenList Tokens with prices, from swaplists on`https://github.com/enkryptcom/dynamic-data` * * ```sh - * `curl -sL https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/SOLANA.json | jq -C | less -N` + * curl -sL https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/SOLANA.json | jq -C | less -N * ``` */ async init(enkryptTokenList: TokenType[]): Promise { // Only supports Solana if ((this.network as unknown as string) !== NetworkNames.Solana) return; - // Load supported verified tok ens from the Jupiter API - const res = await fetch(JUPITER_TOKENS_URL, { - signal: AbortSignal.timeout(30_000), - }); - - if (!res.ok) { - const msg = await res - .text() - .catch((err) => `Failed to parse response text: ${String(err)}`); - const shortMsg = shorten(msg, 512); - throw new Error( - `Failed to fetch Jupiter tokens. HTTP request returned not-ok status ${res.status}, ${res.statusText}: ${shortMsg}` - ); - } - /** List of Jupiter tokens */ - const jupiterTokenList = (await res.json()) as JupiterTokenInfo[]; + const jupiterTokenList = await getJupiterTokens() // Inner join jupiter tokens with our tokens from`https://github.com/enkryptcom/dynamic-data` // and save the results @@ -319,13 +338,13 @@ export class Jupiter extends ProviderClass { return this.toTokens; } - /** * Get a quote and swap prepare a swap transactin for the assets */ private async querySwapInfo( options: getQuoteOptions, - meta: QuoteMetaOptions + meta: QuoteMetaOptions, + context?: { signal?: AbortSignal, }, ): Promise<{ jupiterQuote: JupiterQuoteResponse; jupiterSwap: JupiterSwapResponse; @@ -333,149 +352,89 @@ export class Jupiter extends ProviderClass { feePercentage: number, }> { const feeConf = FEE_CONFIGS[this.name][meta.walletIdentifier]; - - // NOTE: we let Jupiter automatically wrap and unwrap SOL so it appears to the user - // as if they can swap their native SOL - if (!feeConf) throw new Error("Something went wrong: no fee config for Jupiter swap"); - - /** Address of the source token. For native SOL we use the wrapped SOL address */ - let fromTokenAddress: string = options.fromToken.address + const referrerPubkey = new PublicKey(feeConf.referrer) + /** Jupiter API requires an integer for bps so we must round */ + const feeBps = Math.round(100 * feeConf.fee) + + const signal = context?.signal + + /** + * Source token. + * + * For native SOL we use the wrapped SOL address + */ + let srcMint: PublicKey; if (options.fromToken.address === NATIVE_TOKEN_ADDRESS) { - fromTokenAddress = WRAPPED_SOL_ADDRESS + srcMint = new PublicKey(WRAPPED_SOL_ADDRESS) } else { - fromTokenAddress = options.fromToken.address + srcMint = new PublicKey(options.fromToken.address) } - /** Address of the destination token.For native SOL we use the wrapped SOL address */ - let toTokenAddress: string = options.toToken.address + /** + * Pubkey of the destination token + * + * For native SOL we use the wrapped SOL address + */ + let dstMint: PublicKey; if (options.toToken.address === NATIVE_TOKEN_ADDRESS) { - toTokenAddress = WRAPPED_SOL_ADDRESS - } else { - toTokenAddress = options.toToken.address - } - - - // Get the SPL address of the account that will receive your fees - // the SPL address is owned by the referrer program which gives you - // the ability to claim (withdraw) your assets - // The address is specified in the swap documentation - // https://station.jup.ag/api-v6/post-swap in the `feeAccount` section - // we construct the SPL address here - const referrerAccountSeeds = [ - Buffer.from("referral_ata"), - // Your referrer address that the Jupiter referral program gave you - new PublicKey(feeConf.referrer).toBuffer(), - new PublicKey(fromTokenAddress).toBuffer(), - ]; - const referrerProgramId = new PublicKey("REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3"); - const [feeAccountPukey] = PublicKey.findProgramAddressSync(referrerAccountSeeds, referrerProgramId); - - /** SPL account address, owned by the Jupiter referral program, that holds our referral fees */ - - // Check if the address exists / has been created - // if not then we can't use it to receive fees - const referralAccountInfo = await this.conn.getAccountInfo(feeAccountPukey); - - // TODO: does the account get created for us automatically? - let feeAcountAddress: string | undefined - let feeBps: number - if (referralAccountInfo != null) { - feeAcountAddress = feeAccountPukey.toBase58(); - feeBps = Math.round(100 * feeConf.fee); + dstMint = new PublicKey(WRAPPED_SOL_ADDRESS) } else { - // If this happens you should go to the Jupiter referral console and create an account - // for this asset - console.warn(`Enkrypt Jupiter referral fee account ${feeAcountAddress} doesn't exist yet. You'll need to create it to receive referral fees for token type ${fromTokenAddress}.`); - feeBps = 0 + dstMint = new PublicKey(options.toToken.address) } - // Get a quote for the swap pair - - /** @see https://station.jup.ag/api-v6/get-quote */ - const quoteParams: [key: string, value: string][] = []; - - quoteParams.push(["inputMint", fromTokenAddress]); - quoteParams.push(["outputMint", toTokenAddress]); - quoteParams.push(["amount", options.amount.toString(10)]); - quoteParams.push(["slippageBps", Math.round(100 * parseFloat(meta.slippage || DEFAULT_SLIPPAGE)).toString()]); - if (feeAcountAddress != null) quoteParams.push(["platformFeeBps", feeBps.toString()]); - // Note: using ExactIn also implies the referral fee is in source tokens - quoteParams.push(["swapMode", "ExactIn"]); - - const quoteQuery = new URLSearchParams(quoteParams); - - /** @see https://station.jup.ag/api-v6/get-quote */ - const quoteUrl = `${JUPITER_API_URL}quote?${quoteQuery.toString()}`; - - const quoteRes = await fetch(quoteUrl, { - signal: AbortSignal.timeout(30_000), - headers: [["Accept", "application/json"]], - }); - - if (!quoteRes.ok) { - const msg = await quoteRes - .text() - .catch((err) => `Failed to parse response text: ${String(err)}`); - const shortMsg = shorten(msg, 512); - throw new Error( - `Failed to get a Jupiter swap quote. HTTP request returned not-ok status ${quoteRes.status}, ${quoteRes.statusText}: ${shortMsg}` - ); - } - - const quote = (await quoteRes.json()) as JupiterQuoteResponse; - - // Get a swap transaction based on the quote - const swapParams: JupiterSwapParams = { - userPublicKey: options.fromAddress, - feeAccount: feeAcountAddress, - quoteResponse: quote, - }; - - /** @see https://station.jup.ag/api-v6/post-swap */ - const swapUrl = `${JUPITER_API_URL}swap`; - - const swapRes = await fetch(swapUrl, { - method: "POST", - signal: AbortSignal.timeout(30_000), - body: JSON.stringify(swapParams), - headers: [ - ["Content-Type", "application/json"], - ["Accept", "application/json"], - ], - }); - - if (!swapRes.ok) { - const msg = await swapRes - .text() - .catch((err) => `Failed to parse response text: ${String(err)}`); - const shortMsg = shorten(msg, 512); - throw new Error( - `Failed to get Jupiter swap transaction. HTTP request returned not-ok status ${swapRes.status}, ${swapRes.statusText}: ${shortMsg}` - ); + const referrerATAPubkey = getJupiterReferrerAssociatedTokenAccount(referrerPubkey, srcMint) + + const referrerATAExists = await solAccountExists(this.conn, referrerATAPubkey) + + const quote = await getJupiterQuote({ + srcMint, + dstMint, + amount: BigInt(options.amount.toString(10)), + // Integer so must round + slippageBps: Math.round(100 * parseFloat(meta.slippage || DEFAULT_SLIPPAGE)), + referralFeeBps: feeBps, + }, { signal, }) + + const swap = await getJupiterSwap({ + quote, + signerPubkey: new PublicKey(options.fromAddress), + referrerATAPubkey, + }, { signal, }) + + let tx = VersionedTransaction.deserialize(Buffer.from(swap.swapTransaction, 'base64')); + + if (!referrerATAExists) { + // Update the transaction so it creates a ATA account to receive referral fees in + // see `updateSwapTransactionToCreateJupiterReferrerATA` for more details + console.debug(`Referrer ATA does not exist. Updating transaction with instruction to create it. Referral ATA pubkey: ${referrerATAPubkey.toBase58()}`) + + const tokenProgramId = await getTokenProgramOfMint(this.conn, srcMint) + + tx = await updateSwapTransactionToCreateJupiterReferrerATA(this.conn, tx, { + referrerPubkey, + mintPubkey: srcMint, + tokenProgramId, + referrerATAPubkey, + payerPubkey: new PublicKey(options.fromAddress), + }) } - - const swap = (await swapRes.json()) as JupiterSwapResponse; - return { feePercentage: feeBps / 100, jupiterSwap: swap, jupiterQuote: quote, - base64SwapTransaction: swap.swapTransaction, + base64SwapTransaction: Buffer.from(tx.serialize()).toString('base64'), } } - async getQuote( options: getQuoteOptions, - meta: QuoteMetaOptions + meta: QuoteMetaOptions, + context?: { signal?: AbortSignal, }, ): Promise { - const { jupiterQuote, } = await this.querySwapInfo( - options, - meta - ); + const { jupiterQuote, } = await this.querySwapInfo(options, meta, context); // Jupiter swaps have four different kinds of fees: // 1. Transaction base fees: number of signatures * lamports per signature @@ -493,8 +452,7 @@ export class Jupiter extends ProviderClass { // usually 5,000 Lamports per signature I think) // (unitsConsumed is kind-of like gas) totalGaslimit: 0, - // TODO: do we set additionalNativeFees to the priority fee, or leave it 0? - // additionalNativeFees: toBN(jupiterSwap.prioritizationFeeLamports ?? 0), + // TODO: consider setting this to price we pay to create the referrer ATA account if it doesn't already exist additionalNativeFees: toBN(0), provider: this.name, quote: { @@ -503,7 +461,7 @@ export class Jupiter extends ProviderClass { provider: this.name, }, minMax: { - // TODO: how do I get these limits + // TODO: how do I get these limits? minimumFrom: toBN("1"), maximumFrom: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND), minimumTo: toBN("1"), @@ -515,12 +473,12 @@ export class Jupiter extends ProviderClass { } - async getSwap(quote: SwapQuote): Promise { + async getSwap(quote: SwapQuote, context?: { signal?: AbortSignal, }): Promise { const { feePercentage, jupiterQuote, base64SwapTransaction, - } = await this.querySwapInfo(quote.options, quote.meta); + } = await this.querySwapInfo(quote.options, quote.meta, context); const enkryptTransaction: SolanaTransaction = { from: quote.options.fromAddress, @@ -533,8 +491,7 @@ export class Jupiter extends ProviderClass { transactions: [enkryptTransaction], fromTokenAmount: toBN(jupiterQuote.inAmount), toTokenAmount: toBN(jupiterQuote.outAmount), - // TODO: do we set additionalNativeFees to the priority fee, or leave it 0? - // additionalNativeFees: toBN(jupiterSwap.prioritizationFeeLamports ?? 0), + // TODO: consider setting this to price we pay to create the referrer ATA account if it doesn't already exist additionalNativeFees: toBN(0), provider: this.name, slippage: quote.meta.slippage, @@ -580,3 +537,710 @@ export class Jupiter extends ProviderClass { } } +/** + * Is the address a valid Solana address? (32 byte base58 string) + * + * @param address hopefully 32 byte base58 string + * @returns true if `address` is a 32 byte base58 string + */ +function isValidSolanaAddress(address: string): Promise { + try { + new PublicKey(address) + return Promise.resolve(true) + } catch (err) { + return Promise.resolve(false) + } +} + +/** + * Does the Solana account exist? + * + * Checks if the account has been created + * + * @param conn Solana connection + * @param address Address to check + * @returns `true` if there's an account at `address` + */ +async function solAccountExists(conn: Connection, address: PublicKey): Promise { + const account = await conn.getAccountInfo(address, 'max') + const exists = account != null + return exists +} + + +/** + * Request all verified tokens available on Jupiter swap + * + * (With retry, backoff, and timeouts) + * + * @see https://station.jup.ag/api-v6/get-quote + */ +async function getJupiterTokens(context?: { signal?: AbortSignal }): Promise { + const signal = context?.signal + + const url = JUPITER_TOKENS_URL + let failed = false + let tokens: JupiterTokenInfo[]; + const backoff = [0, 100, 500, 1000, 2_500, 5_000] + let backoffi = 0 + let errRef: undefined | { err: Error } + + while (true) { + if (signal?.aborted) { + // Context aborted + throw signal.reason + } + + if (backoffi >= backoff.length) { + // Failed after too many attempts + throw new Error(`Failed to get tokens after ${backoffi} retries: ${String(errRef?.err ?? '???')}`) + } + + if (backoff[backoffi] > 0) { + // Previous request failed, wait before retrying + console.debug(`Retrying after ${backoff[backoffi]}ms...`) + await new Promise((res, rej) => { + function onTimeout() { + cleanupTimeout() + res() + } + function onAbortDuringSleep() { + cleanupTimeout() + rej(signal!.reason) + } + function cleanupTimeout() { + signal?.removeEventListener('abort', onAbortDuringSleep) + clearTimeout(timeout) + } + signal?.addEventListener('abort', onAbortDuringSleep) + const timeout = setTimeout(onTimeout) + }) + } + + /** Cancels the HTTP request */ + const aborter = new AbortController() + + /** Cancel this request if the context cancels */ + const onAbortDuringRequest = () => { + aborter.abort(signal!.reason) + } + + /** Times out the request */ + const timeout = setTimeout(() => { + aborter.abort(new Error(`HTTP request timed out ${url}`)) + }, 30_000); + signal?.addEventListener('abort', onAbortDuringRequest) + + /** Cleanup timeouts and aborters */ + const cleanupRequest = () => { + clearTimeout(timeout) + signal?.removeEventListener('abort', onAbortDuringRequest) + } + + try { + console.debug(`Initiating HTTP request for Jupiter tokens ${url}`) + const res = await fetch(url, { + signal: aborter.signal, + headers: [["Accept", "application/json"]], + redirect: 'follow', + keepalive: true, + }) + if (!res.ok) { + let msg = await res.text().catch((err) => `Failed to decode response text: ${String(err)}`) + const msglen = msg.length; + if (msglen > 512 + 7 + 3 + msglen.toString().length) { + msg = `${msg.slice(0, 512)}... (512/${msglen})`; + } + switch (res.status) { + case 400: + case 401: + case 402: + case 403: + case 404: + case 405: + case 500: + failed = true + break; + default: /* noop */ + } + throw new Error(`Failed to get tokens, HTTP response returned not-ok status ${res.status} ${res.statusText || ''}: ${msg}`) + } + tokens = await res.json() as JupiterTokenInfo[] + + if (!tokens) { + throw new Error('Failed to get tokens: something went wrong and result is falsy') + } + + return tokens + } catch (err) { + if (signal?.aborted) throw signal.reason + if (failed) throw err + console.debug(`Failed to get tokens on attempt ${backoffi + 1}/${backoff.length}: ${String(err)}`) + errRef ??= { err: err as Error } + } finally { + cleanupRequest() + } + backoffi += 1 + } +} + + +/** + * Request a quote for a swap pair from the Jupiter API + * + * (With retry, backoff, and timeouts) + * + * @see https://station.jup.ag/api-v6/get-quote + */ +async function getJupiterQuote( + params: { + /** Source token pubkey (address) */ + srcMint: PublicKey, + /** Destination token pubkey (address) */ + dstMint: PublicKey, + /** How many of the source tokens? */ + amount: bigint, + /** Integer */ + slippageBps?: number, + /** Integer */ + referralFeeBps?: number, + }, + context?: { + signal?: AbortSignal, + }, +): Promise { + const { + srcMint, + dstMint, + amount, + slippageBps, + referralFeeBps, + } = params; + + const signal = context?.signal + + if (slippageBps != null) { + if (!Number.isSafeInteger(slippageBps)) { + throw new TypeError(`Invalid slippageBps: ${slippageBps} must be a safe integer`) + } + if (slippageBps < 0) { + throw new Error(`Invalid slippageBps: ${slippageBps} must be >= 0`) + } + } + + if (referralFeeBps != null) { + if (!Number.isSafeInteger(referralFeeBps)) { + throw new TypeError(`Invalid referralFeeBps: ${referralFeeBps} must be a safe integer`) + } + if (referralFeeBps < 0) { + throw new TypeError(`Invalid referralFeeBps: ${referralFeeBps} must be >= 0`) + } + } + + const quoteParams: [key: string, value: string][] = []; + quoteParams.push(["inputMint", srcMint.toBase58()]); + quoteParams.push(["outputMint", dstMint.toBase58()]); + quoteParams.push(["amount", amount.toString(10)]); + if (slippageBps != null) { + quoteParams.push(["slippageBps", slippageBps.toString(10)]); + } + if (referralFeeBps != null) { + quoteParams.push(["platformFeeBps", referralFeeBps.toString()]); + } + quoteParams.push(["swapMode", "ExactIn"]); + const queryString = new URLSearchParams(quoteParams) + const url = `${JUPITER_API_URL}quote?${queryString.toString()}` + + let failed = false + let quote: JupiterQuoteResponse; + const backoff = [0, 100, 500, 1000, 2_500, 5_000] + let backoffi = 0 + let errRef: undefined | { err: Error } + + while (true) { + if (signal?.aborted) { + // Context aborted + throw signal.reason + } + + if (backoffi >= backoff.length) { + // Failed after too many attempts + throw new Error(`Failed to get quote after ${backoffi} retries at url ${url}: ${String(errRef?.err ?? '???')}`) + } + + if (backoff[backoffi] > 0) { + // Previous request failed, wait before retrying + console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`) + await new Promise((res, rej) => { + function onTimeout() { + cleanupTimeout() + res() + } + function onAbortDuringSleep() { + cleanupTimeout() + rej(signal!.reason) + } + function cleanupTimeout() { + signal?.removeEventListener('abort', onAbortDuringSleep) + clearTimeout(timeout) + } + signal?.addEventListener('abort', onAbortDuringSleep) + const timeout = setTimeout(onTimeout) + }) + } + + /** Cancels the HTTP request */ + const aborter = new AbortController() + + /** Cancel this request if the context cancels */ + const onAbortDuringRequest = () => { + aborter.abort(signal!.reason) + } + + /** Times out the request */ + const timeout = setTimeout(() => { + aborter.abort(new Error(`HTTP request timed out ${url}`)) + }, 30_000); + signal?.addEventListener('abort', onAbortDuringRequest) + + /** Cleanup timeouts and aborters */ + const cleanupRequest = () => { + clearTimeout(timeout) + signal?.removeEventListener('abort', onAbortDuringRequest) + } + + try { + console.debug(`Initiating HTTP request for Jupiter quote ${url}`) + const res = await fetch(url, { + signal: aborter.signal, + headers: [["Accept", "application/json"]], + redirect: 'follow', + keepalive: true, + }) + if (!res.ok) { + let msg = await res.text().catch((err) => `Failed to decode response text: ${String(err)}`) + const msglen = msg.length; + if (msglen > 512 + 7 + 3 + msglen.toString().length) { + msg = `${msg.slice(0, 512)}... (512/${msglen})`; + } + switch (res.status) { + case 400: + case 401: + case 402: + case 403: + case 404: + case 405: + case 500: + failed = true + break; + default: /* noop */ + } + throw new Error(`Failed to get quote, HTTP response returned not-ok status ${res.status} ${res.statusText || ''} at url ${url}: ${msg}`) + } + quote = await res.json() as JupiterQuoteResponse + + if (!quote) { + throw new Error(`Failed to get quote at url ${url}, something went wrong and result is falsy`) + } + + return quote + } catch (err) { + if (signal?.aborted) throw signal.reason + if (failed) throw err; + console.warn(`Failed to get quote on attempt ${backoffi + 1}/${backoff.length}: ${String(err)}`) + errRef ??= { err: err as Error } + } finally { + cleanupRequest() + } + backoffi += 1 + } +} + + +/** + * Request a swap transaction for a given quote from the Jupiter swap API + * + * (With retry, backoff, and timeouts) + * + * @see https://station.jup.ag/api-v6/post-swap + */ +async function getJupiterSwap( + params: { + /** Base58 signer address that pays for the transaction */ + signerPubkey: PublicKey, + /** Base58 referrer address (created in the Jupiter dashboard, not the ATA address) */ + referrerATAPubkey?: PublicKey + /** Response from Jupiter API */ + quote: JupiterQuoteResponse, + }, + context?: { + signal?: AbortSignal, + } +): Promise { + const { signerPubkey, quote, referrerATAPubkey, } = params; + const signal = context?.signal + + const swapParams: JupiterSwapParams = { + userPublicKey: signerPubkey.toBase58(), + feeAccount: referrerATAPubkey?.toBase58() ?? undefined, + quoteResponse: quote, + } + + const url = `${JUPITER_API_URL}swap` + let failed = false; + let swap: JupiterSwapResponse; + const backoff = [0, 100, 500, 1000, 2_500, 5_000] + let backoffi = 0 + let errRef: undefined | { err: Error } + + while (true) { + if (signal?.aborted) { + // Context aborted + throw signal.reason + } + + if (backoffi >= backoff.length) { + // Failed after too many attempts + throw new Error(`Failed to get swap after ${backoffi} retries at url ${url}: ${String(errRef?.err ?? '???')}`) + } + + if (backoff[backoffi] > 0) { + // Previous request failed, wait before retrying + console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`) + await new Promise((res, rej) => { + function onTimeout() { + cleanupTimeout() + res() + } + function onAbortDuringSleep() { + cleanupTimeout() + rej(signal!.reason) + } + function cleanupTimeout() { + signal?.removeEventListener('abort', onAbortDuringSleep) + clearTimeout(timeout) + } + signal?.addEventListener('abort', onAbortDuringSleep) + const timeout = setTimeout(onTimeout) + }) + } + + /** Cancels the HTTP request */ + const aborter = new AbortController() + + /** Cancel this request if the context cancels */ + const onAbortDuringRequest = () => { + aborter.abort(signal!.reason) + } + + /** Times out the request */ + const timeout = setTimeout(() => { + aborter.abort(new Error(`HTTP request timed out ${url}`)) + }, 30_000); + signal?.addEventListener('abort', onAbortDuringRequest) + + /** Cleanup timeouts and aborters */ + const cleanupRequest = () => { + clearTimeout(timeout) + signal?.removeEventListener('abort', onAbortDuringRequest) + } + + try { + console.debug(`Initiating HTTP request for Jupiter swap ${url}`) + const res = await fetch(url, { + signal: aborter.signal, + method: 'POST', + headers: [ + ["Accept", "application/json"], + ["Content-Type", "application/json"], + ], + body: JSON.stringify(swapParams), + redirect: 'follow', + keepalive: true, + }) + if (!res.ok) { + let msg = await res.text().catch((err) => `Failed to decode response text: ${String(err)}`) + const msglen = msg.length; + if (msglen > 512 + 7 + 3 + msglen.toString().length) { + msg = `${msg.slice(0, 512)}... (512/${msglen})`; + } + switch (res.status) { + case 400: + case 401: + case 402: + case 403: + case 404: + case 405: + case 500: + failed = true + break; + default: /* noop */ + } + throw new Error(`Failed to get swap, HTTP response returned not-ok status ${res.status} ${res.statusText || ''} at url ${url}: ${msg}`) + } + + swap = await res.json() as JupiterSwapResponse + + if (!quote) { + throw new Error(`Failed to get swap at url ${url}, something went wrong and result is falsy`) + } + + return swap + } catch (err) { + if (failed) throw err + console.debug(`Failed to get swap on attempt ${backoffi + 1}/${backoff.length}: ${String(err)}`) + errRef ??= { err: err as Error } + } finally { + cleanupRequest() + } + backoffi += 1 + } +} + +/** + * Get the referral ATA address that will receive your referral fees + * + * The ATA address is owned by the Jupiter referrer program which gives you the + * ability to claim (withdraw) your assets. The address is specified in the swap + * documentation https://station.jup.ag/api-v6/post-swap in the `feeAccount` + * section + * + * @param referrerPubkey Jupiter referrer acount address (from Jupiter referrer dashboard) + * @param mintPubkey SPL token address + */ +function getJupiterReferrerAssociatedTokenAccount( + referrerPubkey: PublicKey, + mintPubkey: PublicKey, +): PublicKey { + /** `feeAccount` section of https://station.jup.ag/api-v6/post-swap */ + const referrerAccountSeeds = [ + Buffer.from("referral_ata"), + // Your referrer address that the Jupiter referral program gave you + referrerPubkey.toBuffer(), + mintPubkey.toBuffer(), + ]; + const [referrerATAPubkey] = PublicKey.findProgramAddressSync(referrerAccountSeeds, JUPITER_REFERRAL_PROGRAM_PUBKEY); + return referrerATAPubkey +} + +/** + * Links: + * - [Jupiter Referral GitHub](https://github.com/TeamRaccoons/referral) + * - [SDK code](https://github.com/TeamRaccoons/referral/tree/main/packages/sdk) + * - [Program code](https://github.com/TeamRaccoons/referral/tree/main/program/programs/referral) + * - [SDK initializeReferralTokenAccount](https://github.com/TeamRaccoons/referral/blob/1e4825087b25d59157800a571f32448e9c1e0b71/packages/sdk/src/referral.ts#L392) + * - [IDL](https://github.com/TeamRaccoons/referral/blob/1e4825087b25d59157800a571f32448e9c1e0b71/packages/sdk/src/idl.ts#L1) + * - [Dashboard code](https://github.com/TeamRaccoons/referral/tree/main/packages/dashboard) + * - [InitializeReferralTokenAccount entrypoint](https://github.com/TeamRaccoons/referral/blob/1e4825087b25d59157800a571f32448e9c1e0b71/program/programs/referral/src/lib.rs#L87) + * - [InitializeReferralTokenAccount command](https://github.com/TeamRaccoons/referral/blob/1e4825087b25d59157800a571f32448e9c1e0b71/program/programs/referral/src/instructions/initialize_referral_token_account.rs#L23) + * - [Dashboard URL](https://referral.jup.ag/dashboard) + * + * Old IDL (Interface Description Language) JSON + * + * ```json + * + * { + * name: "initializeReferralTokenAccount", + * args: [], + * accounts: [ + * { name: "payer"; isMut: true; isSigner: true; * }, + * { name: "project"; isMut: false; isSigner: false; }, + * { name: "referralAccount"; isMut: false; isSigner: false; }, + * { name: "referralTokenAccount"; isMut: true; isSigner: false; }, + * { name: "mint"; isMut: false; isSigner: false; }, + * { name: "systemProgram"; isMut: false; isSigner: false; }, + * { name: "tokenProgram"; isMut: false; isSigner: false; } + * ], + * } + * ``` + */ +function getJupiterInitialiseReferralTokenAccountInstruction(params: { + /** Pubkey of the referrer program itself that instructions will be executed on */ + programId: PublicKey, + /** Payer pubkey */ + payerPubkey: PublicKey, + /** ? */ + vaultPubkey: PublicKey, + /** Referrer project pubkey (your referrer address in the Jupiter console) */ + referralAccountPubkey: PublicKey, + /** Jupiter ATA account for your referrer address with the SPL token address */ + referralATAPubkey: PublicKey, + /** SPL token address */ + mintPubkey: PublicKey, + /** Pubkey of the Solana SPL System Program */ + systemProgramId: PublicKey, + /** Pubkey of the Solana SPL token program ?? TODO: WHICH ONE ?? */ + tokenProgramId: PublicKey, +}): TransactionInstruction { + const { + programId, + payerPubkey, + vaultPubkey, + referralAccountPubkey, + referralATAPubkey, + mintPubkey, + systemProgramId, + tokenProgramId, + } = params; + + // This is wrong: + // const hash = createHash('sha256'); + // hash.update('initializeReferralTokenAccount'); + // const fullHash = hash.digest(); + // const discriminator = fullHash.slice(0, 8); // First 8 bytes of the hash + + // TODO: how do we calculate this? I got it from Solscan and it seems to work + const discriminator = Buffer.from('7d12465f56b3ddbe', 'hex') + + // No data is needed, only: + // 1. The discriminator (similar to function selector in EVM) + // 2. Keys in the correct order + const instruction = new TransactionInstruction({ + programId, + data: discriminator, + keys: [ + { pubkey: payerPubkey, isSigner: true, isWritable: true, }, + { pubkey: vaultPubkey, isSigner: false, isWritable: false, }, + { pubkey: referralAccountPubkey, isSigner: false, isWritable: false, }, + { pubkey: referralATAPubkey, isSigner: false, isWritable: true, }, + { pubkey: mintPubkey, isSigner: false, isWritable: false, }, + { pubkey: systemProgramId, isSigner: false, isWritable: false, }, + { pubkey: tokenProgramId, isSigner: false, isWritable: false, }, + ], + }) + + return instruction +} + +/** + * Modify the transaction received from the Jupiter swap API to also create the + * Jupiter referrer ATA account so that we can receive referral fees in it + */ +async function updateSwapTransactionToCreateJupiterReferrerATA( + conn: Connection, + /** Transaction direectly from Jupiter Swap */ + tx: VersionedTransaction, + params: { + /** Pubkey paying for the transaction */ + payerPubkey: PublicKey, + /** Pubkey of your Jupiter referral account, from the Jupiter dashboard */ + referrerPubkey: PublicKey, + /** Jupiter referrer ATA pubkey @see `getJupiterReferrerAssociatedTokenAccount` */ + referrerATAPubkey: PublicKey, + /** SPL token address */ + mintPubkey: PublicKey, + /** The SPL token progam or the 2022 SPL token program */ + tokenProgramId: PublicKey, + }, +) { + const { + payerPubkey, + referrerPubkey, + referrerATAPubkey, + mintPubkey, + tokenProgramId, + } = params; + + // Get the instruction that creates the Jupiter referral ATA account + const instruction = getJupiterInitialiseReferralTokenAccountInstruction({ + payerPubkey, + programId: JUPITER_REFERRAL_PROGRAM_PUBKEY, + vaultPubkey: JUPITER_REFERRAL_VAULT_PUBKEY, + referralAccountPubkey: referrerPubkey, + referralATAPubkey: referrerATAPubkey, + mintPubkey, + systemProgramId: SystemProgram.programId, + tokenProgramId, + }) + + // Now we need to: + // 1. Decompile the transaction + // 2. Put our instruction in it + // 3. Recompile it + + // Request lookup accounts so that we can decompile the message + // + // Lookup accounts store arrays of addresses. These accounts let compiled transaction messages reference indexes + // in the lookup account rather than by the pubkey, saving lots of space (~4 byte integer index vs 32 byte pubkey). + // + // To decompile a message we first need all the lookup accounts that it includes so that we can get the + // the addresses that our message needs. + // + // We can also use the lookup accounts when re-compiling the transaction. + const lookupAccountsCount = tx.message.addressTableLookups.length + const addressLookupTableAccounts: AddressLookupTableAccount[] = new Array(lookupAccountsCount) + for (let i = 0; i < lookupAccountsCount; i++) { + const lookup = tx.message.addressTableLookups[i] + const result = await conn.getAddressLookupTable(lookup.accountKey) + const addressLookupTableAccount = result.value + if (addressLookupTableAccount == null) throw new Error(`Failed to get address lookup table for ${lookup.accountKey}`) + console.debug(`Fetching lookup account ${i + 1}. ${lookup.accountKey.toBase58()}`) + addressLookupTableAccounts[i] = addressLookupTableAccount + } + + // Decompile the transaction message so we can modify it + const decompiledTransactionMessage = TransactionMessage.decompile(tx.message, { addressLookupTableAccounts, }) + + // Insert our instruction to create an account directly after compute budget + // program instructions that compute limits and priority fees + const computeBudgetProgramAddr = ComputeBudgetProgram.programId.toBase58() + let inserted = false + instructionLoop: + for (let i = 0, len = decompiledTransactionMessage.instructions.length; i < len; i++) { + // As soon as we hit a non compute budget program, insert our instruction to create the account + const existingInstruction = decompiledTransactionMessage.instructions[i] + switch (existingInstruction.programId.toBase58()) { + case computeBudgetProgramAddr: + // do nothing + break; + default: { + // insert our instruction here & continue + console.debug(`Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}`) + inserted = true + decompiledTransactionMessage.instructions.splice(i, 0, instruction) + break instructionLoop; + } + } + } + + if (!inserted) { + // If there were no compute budget instructions then just add it at the start + console.debug(`Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions`) + decompiledTransactionMessage.instructions.unshift(instruction) + } + + // Switch to using this modified transaction + console.debug(`Re-compiling transaction`) + const modifiedTx = new VersionedTransaction(decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts)) + + return modifiedTx +} + +/** + * Get the SPL token program that owns (/created) the given mint (token). Either the SPL token program + * or the 2022 SPL token program + * + * @returns Pubkey of the SPL token token owner program + * @throws If the account does not exist or if it's not owned by one of the SPL token programs + */ +async function getTokenProgramOfMint(conn: Connection, mint: PublicKey): Promise { + console.debug(`Checking mint account of ${mint.toBase58()}`) + const srcMintAcc = await conn.getAccountInfo(mint) + + if (srcMintAcc == null) { + throw new Error(`There is no SPL token account at address ${mint.toBase58()}`) + } + + switch (srcMintAcc.owner.toBase58()) { + case TOKEN_PROGRAM_ID.toBase58(): + case TOKEN_2022_PROGRAM_ID.toBase58(): + return srcMintAcc.owner + default: + throw new Error( + `Mint address is not a valid SPL token, must either have owner` + + ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + + ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` + ); + } +} + diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index fb0869b34..4c97a7f22 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -195,7 +195,7 @@ export interface ProviderQuoteResponse { toTokenAmount: BN; fromTokenAmount: BN; totalGaslimit: number; - // ? Is this priority fees ? + // ? What is this ? additionalNativeFees: BN; provider: ProviderName; quote: SwapQuote; @@ -255,10 +255,11 @@ export abstract class ProviderClass { abstract getQuote( options: getQuoteOptions, - meta: QuoteMetaOptions + meta: QuoteMetaOptions, + context?: { signal?: AbortSignal, }, ): Promise; - abstract getSwap(quote: SwapQuote): Promise; + abstract getSwap(quote: SwapQuote, context?: { signal?: AbortSignal }): Promise; abstract getStatus(options: StatusOptions): Promise; } From d5cc0f1be3a6e721b27395b7cd9b787d224699e8 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 3 Sep 2024 12:55:24 -0500 Subject: [PATCH 295/375] chore: lint --- packages/swap/src/index.ts | 36 +- .../swap/src/providers/changelly/index.ts | 2 +- packages/swap/src/providers/jupiter/index.ts | 717 ++++++++++-------- packages/swap/src/providers/oneInch/index.ts | 3 +- packages/swap/src/providers/paraswap/index.ts | 3 +- packages/swap/src/providers/zerox/index.ts | 3 +- packages/swap/src/types/index.ts | 7 +- 7 files changed, 451 insertions(+), 320 deletions(-) diff --git a/packages/swap/src/index.ts b/packages/swap/src/index.ts index fd2f2dac2..d9b165204 100644 --- a/packages/swap/src/index.ts +++ b/packages/swap/src/index.ts @@ -74,8 +74,8 @@ class Swap extends EventEmitter { this.evmOptions = options.evmOptions ? options.evmOptions : { - infiniteApproval: true, - }; + infiniteApproval: true, + }; this.api = options.api; this.walletId = options.walletIdentifier; this.topTokenInfo = { @@ -192,17 +192,26 @@ class Swap extends EventEmitter { * * Only providers that support the network will respond */ - async getQuotes(options: getQuoteOptions, context?: { signal?: AbortSignal, }): Promise { + async getQuotes( + options: getQuoteOptions, + context?: { signal?: AbortSignal } + ): Promise { const response = await Promise.all( this.providers.map((provider) => - provider.getQuote(options, { - infiniteApproval: this.evmOptions.infiniteApproval, - walletIdentifier: this.walletId, - }, context).then((res) => { - if (!res) return res; - this.emit(Events.QuoteUpdate, res.toTokenAmount); - return res; - }) + provider + .getQuote( + options, + { + infiniteApproval: this.evmOptions.infiniteApproval, + walletIdentifier: this.walletId, + }, + context + ) + .then((res) => { + if (!res) return res; + this.emit(Events.QuoteUpdate, res.toTokenAmount); + return res; + }) ) ); // Sort by the dest token amount i.e. best offer first @@ -211,7 +220,10 @@ class Swap extends EventEmitter { .sort((a, b) => (b.toTokenAmount.gt(a.toTokenAmount) ? 1 : -1)); } - getSwap(quote: SwapQuote, context?: { signal?: AbortSignal, }): Promise { + getSwap( + quote: SwapQuote, + context?: { signal?: AbortSignal } + ): Promise { const provider = this.providers.find((p) => p.name === quote.provider); return provider.getSwap(quote, context); } diff --git a/packages/swap/src/providers/changelly/index.ts b/packages/swap/src/providers/changelly/index.ts index e4142ab90..91f39e2de 100644 --- a/packages/swap/src/providers/changelly/index.ts +++ b/packages/swap/src/providers/changelly/index.ts @@ -232,7 +232,7 @@ class Changelly extends ProviderClass { const result = response.result[0]; const evmGasLimit = options.fromToken.address === NATIVE_TOKEN_ADDRESS && - options.fromToken.type === NetworkType.EVM + options.fromToken.type === NetworkType.EVM ? 21000 : toBN(GAS_LIMITS.transferToken).toNumber(); const retResponse: ProviderQuoteResponse = { diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index b11b71da7..190543bd8 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -1,8 +1,21 @@ /* eslint-disable no-use-before-define, no-new, no-constant-condition, no-restricted-syntax, no-labels */ import { NetworkNames } from "@enkryptcom/types"; -import { AddressLookupTableAccount, ComputeBudgetProgram, Connection, PublicKey, SystemProgram, TransactionInstruction, TransactionMessage, VersionedTransaction, } from "@solana/web3.js"; -import { DEFAULT_SLIPPAGE, FEE_CONFIGS, NATIVE_TOKEN_ADDRESS } from "@src/configs"; +import { + AddressLookupTableAccount, + ComputeBudgetProgram, + Connection, + PublicKey, + SystemProgram, + TransactionInstruction, + TransactionMessage, + VersionedTransaction, +} from "@solana/web3.js"; +import { + DEFAULT_SLIPPAGE, + FEE_CONFIGS, + NATIVE_TOKEN_ADDRESS, +} from "@src/configs"; import { ProviderClass, ProviderName, @@ -49,7 +62,7 @@ import { toBN } from "web3-utils"; * * 1. Request a quote from the Jupiter swap API * 2. Request a swap transaction from the Jupiter swap API with the quote provided - * 2.5. Modify the transaction to create the referrer ATA to receive platform fees, if required + * 2.5. Modify the transaction to create the referrer ATA to receive platform fees, if required * 3. Deserialize and signt the transaction * 4. Execute the transaction * @@ -74,39 +87,46 @@ const JUPITER_TOKENS_URL = "https://tokens.jup.ag/tokens?tags=verified"; const JUPITER_API_URL = "https://quote-api.jup.ag/v6/"; /** -* Wrapped SOL address -* @see https://solscan.io/token/So11111111111111111111111111111111111111112 -*/ -const WRAPPED_SOL_ADDRESS = "So11111111111111111111111111111111111111112" + * Wrapped SOL address + * @see https://solscan.io/token/So11111111111111111111111111111111111111112 + */ +const WRAPPED_SOL_ADDRESS = "So11111111111111111111111111111111111111112"; /** * @see https://solscan.io/account/45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp * * Manages referral fees */ -const JUPITER_REFERRAL_VAULT_PUBKEY = new PublicKey('45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp') +const JUPITER_REFERRAL_VAULT_PUBKEY = new PublicKey( + "45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp" +); /** * @see https://solscan.io/account/REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3 * * Program targetted by instructions */ -const JUPITER_REFERRAL_PROGRAM_PUBKEY = new PublicKey('REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3') +const JUPITER_REFERRAL_PROGRAM_PUBKEY = new PublicKey( + "REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3" +); /** * Address of the SPL Token program * * @see https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA */ -export const TOKEN_PROGRAM_ID = new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'); +export const TOKEN_PROGRAM_ID = new PublicKey( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" +); /** * Address of the SPL Token 2022 program * * @see https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb */ -export const TOKEN_2022_PROGRAM_ID = new PublicKey('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'); - +export const TOKEN_2022_PROGRAM_ID = new PublicKey( + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" +); // Jupiter API Tokens @@ -118,7 +138,7 @@ type JupiterTokenInfo = { name: string; symbol: string; decimals: string; -} +}; // Jupiter API Quote @@ -147,9 +167,9 @@ type JupiterQuoteResponse = { /** @example {"amount":"1","feeBps":1} */ platformFee: null | { /** @example '1' */ - amount: string, + amount: string; /** @example 1 */ - feeBps: number, + feeBps: number; }; /** @example "0" */ priceImpactPct: string; @@ -174,13 +194,12 @@ type JupiterQuoteResponse = { }; /** @example 100 */ percent: number; - }[], + }[]; /** @example 284606533 */ contextSlot: number; /** @example 0.743937514 */ timeTaken: number; -} - +}; // Jupiter API Swap @@ -227,21 +246,20 @@ type JupiterSwapResponse = { /** Base64 encoded versioned transaction */ swapTransaction: string; /** @example 265642441 */ - lastValidBlockHeight: number + lastValidBlockHeight: number; /** @example 99999 */ prioritizationFeeLamports?: number; /** @example 1400000 */ - computeUnitLimit?: number + computeUnitLimit?: number; prioritizationType?: { computeBudget?: { - microLamports: 71428, - estimatedMicroLamports: 142856, - }, - }, - dynamicSlippageReport: null, - simulationError: null, -} - + microLamports: 71428; + estimatedMicroLamports: 142856; + }; + }; + dynamicSlippageReport: null; + simulationError: null; +}; /** * Jupiter is a DEX on Solana @@ -277,7 +295,6 @@ export class Jupiter extends ProviderClass { this.jupiterTokens = new Map(); } - /** * * Initialise`fromTokens` and`toTokens` @@ -292,7 +309,7 @@ export class Jupiter extends ProviderClass { if ((this.network as unknown as string) !== NetworkNames.Solana) return; /** List of Jupiter tokens */ - const jupiterTokenList = await getJupiterTokens() + const jupiterTokenList = await getJupiterTokens(); // Inner join jupiter tokens with our tokens from`https://github.com/enkryptcom/dynamic-data` // and save the results @@ -301,7 +318,7 @@ export class Jupiter extends ProviderClass { this.jupiterTokens = new Map(jupiterTokenList.map((t) => [t.address, t])); /** Intersection of token list & jupiter tokens */ - this.toTokens[this.network] ??= {} + this.toTokens[this.network] ??= {}; for (let i = 0, len = enkryptTokenList.length; i < len; i++) { // TODO: handle native address const enkryptToken = enkryptTokenList[i]; @@ -309,7 +326,7 @@ export class Jupiter extends ProviderClass { if (enkryptToken.address === NATIVE_TOKEN_ADDRESS) { // Jupiter swap API auto unwraps SOL (it's configurable) // Jupiter doesn't send back native SOL - isTradeable = this.jupiterTokens.has(WRAPPED_SOL_ADDRESS) + isTradeable = this.jupiterTokens.has(WRAPPED_SOL_ADDRESS); } else { isTradeable = this.jupiterTokens.has(enkryptToken.address); } @@ -324,12 +341,11 @@ export class Jupiter extends ProviderClass { networkInfo: { name: SupportedNetworkName.Solana, isAddress: isValidSolanaAddress, - } satisfies TokenNetworkType - } + } satisfies TokenNetworkType, + }; } } - getFromTokens(): ProviderFromTokenResponse { return this.fromTokens; } @@ -344,20 +360,21 @@ export class Jupiter extends ProviderClass { private async querySwapInfo( options: getQuoteOptions, meta: QuoteMetaOptions, - context?: { signal?: AbortSignal, }, + context?: { signal?: AbortSignal } ): Promise<{ jupiterQuote: JupiterQuoteResponse; jupiterSwap: JupiterSwapResponse; base64SwapTransaction: string; - feePercentage: number, + feePercentage: number; }> { const feeConf = FEE_CONFIGS[this.name][meta.walletIdentifier]; - if (!feeConf) throw new Error("Something went wrong: no fee config for Jupiter swap"); - const referrerPubkey = new PublicKey(feeConf.referrer) + if (!feeConf) + throw new Error("Something went wrong: no fee config for Jupiter swap"); + const referrerPubkey = new PublicKey(feeConf.referrer); /** Jupiter API requires an integer for bps so we must round */ - const feeBps = Math.round(100 * feeConf.fee) + const feeBps = Math.round(100 * feeConf.fee); - const signal = context?.signal + const signal = context?.signal; /** * Source token. @@ -366,9 +383,9 @@ export class Jupiter extends ProviderClass { */ let srcMint: PublicKey; if (options.fromToken.address === NATIVE_TOKEN_ADDRESS) { - srcMint = new PublicKey(WRAPPED_SOL_ADDRESS) + srcMint = new PublicKey(WRAPPED_SOL_ADDRESS); } else { - srcMint = new PublicKey(options.fromToken.address) + srcMint = new PublicKey(options.fromToken.address); } /** @@ -378,63 +395,84 @@ export class Jupiter extends ProviderClass { */ let dstMint: PublicKey; if (options.toToken.address === NATIVE_TOKEN_ADDRESS) { - dstMint = new PublicKey(WRAPPED_SOL_ADDRESS) + dstMint = new PublicKey(WRAPPED_SOL_ADDRESS); } else { - dstMint = new PublicKey(options.toToken.address) + dstMint = new PublicKey(options.toToken.address); } - const referrerATAPubkey = getJupiterReferrerAssociatedTokenAccount(referrerPubkey, srcMint) - - const referrerATAExists = await solAccountExists(this.conn, referrerATAPubkey) - - const quote = await getJupiterQuote({ - srcMint, - dstMint, - amount: BigInt(options.amount.toString(10)), - // Integer so must round - slippageBps: Math.round(100 * parseFloat(meta.slippage || DEFAULT_SLIPPAGE)), - referralFeeBps: feeBps, - }, { signal, }) + const referrerATAPubkey = getJupiterReferrerAssociatedTokenAccount( + referrerPubkey, + srcMint + ); + + const referrerATAExists = await solAccountExists( + this.conn, + referrerATAPubkey + ); + + const quote = await getJupiterQuote( + { + srcMint, + dstMint, + amount: BigInt(options.amount.toString(10)), + // Integer so must round + slippageBps: Math.round( + 100 * parseFloat(meta.slippage || DEFAULT_SLIPPAGE) + ), + referralFeeBps: feeBps, + }, + { signal } + ); - const swap = await getJupiterSwap({ - quote, - signerPubkey: new PublicKey(options.fromAddress), - referrerATAPubkey, - }, { signal, }) + const swap = await getJupiterSwap( + { + quote, + signerPubkey: new PublicKey(options.fromAddress), + referrerATAPubkey, + }, + { signal } + ); - let tx = VersionedTransaction.deserialize(Buffer.from(swap.swapTransaction, 'base64')); + let tx = VersionedTransaction.deserialize( + Buffer.from(swap.swapTransaction, "base64") + ); if (!referrerATAExists) { // Update the transaction so it creates a ATA account to receive referral fees in // see `updateSwapTransactionToCreateJupiterReferrerATA` for more details - console.debug(`Referrer ATA does not exist. Updating transaction with instruction to create it. Referral ATA pubkey: ${referrerATAPubkey.toBase58()}`) - - const tokenProgramId = await getTokenProgramOfMint(this.conn, srcMint) + console.debug( + `Referrer ATA does not exist. Updating transaction with instruction to create it. Referral ATA pubkey: ${referrerATAPubkey.toBase58()}` + ); - tx = await updateSwapTransactionToCreateJupiterReferrerATA(this.conn, tx, { - referrerPubkey, - mintPubkey: srcMint, - tokenProgramId, - referrerATAPubkey, - payerPubkey: new PublicKey(options.fromAddress), - }) + const tokenProgramId = await getTokenProgramOfMint(this.conn, srcMint); + + tx = await updateSwapTransactionToCreateJupiterReferrerATA( + this.conn, + tx, + { + referrerPubkey, + mintPubkey: srcMint, + tokenProgramId, + referrerATAPubkey, + payerPubkey: new PublicKey(options.fromAddress), + } + ); } return { feePercentage: feeBps / 100, jupiterSwap: swap, jupiterQuote: quote, - base64SwapTransaction: Buffer.from(tx.serialize()).toString('base64'), - } + base64SwapTransaction: Buffer.from(tx.serialize()).toString("base64"), + }; } - async getQuote( options: getQuoteOptions, meta: QuoteMetaOptions, - context?: { signal?: AbortSignal, }, + context?: { signal?: AbortSignal } ): Promise { - const { jupiterQuote, } = await this.querySwapInfo(options, meta, context); + const { jupiterQuote } = await this.querySwapInfo(options, meta, context); // Jupiter swaps have four different kinds of fees: // 1. Transaction base fees: number of signatures * lamports per signature @@ -466,19 +504,18 @@ export class Jupiter extends ProviderClass { maximumFrom: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND), minimumTo: toBN("1"), maximumTo: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND), - } - } + }, + }; return result; } - - async getSwap(quote: SwapQuote, context?: { signal?: AbortSignal, }): Promise { - const { - feePercentage, - jupiterQuote, - base64SwapTransaction, - } = await this.querySwapInfo(quote.options, quote.meta, context); + async getSwap( + quote: SwapQuote, + context?: { signal?: AbortSignal } + ): Promise { + const { feePercentage, jupiterQuote, base64SwapTransaction } = + await this.querySwapInfo(quote.options, quote.meta, context); const enkryptTransaction: SolanaTransaction = { from: quote.options.fromAddress, @@ -545,10 +582,10 @@ export class Jupiter extends ProviderClass { */ function isValidSolanaAddress(address: string): Promise { try { - new PublicKey(address) - return Promise.resolve(true) + new PublicKey(address); + return Promise.resolve(true); } catch (err) { - return Promise.resolve(false) + return Promise.resolve(false); } } @@ -561,13 +598,15 @@ function isValidSolanaAddress(address: string): Promise { * @param address Address to check * @returns `true` if there's an account at `address` */ -async function solAccountExists(conn: Connection, address: PublicKey): Promise { - const account = await conn.getAccountInfo(address, 'max') - const exists = account != null - return exists +async function solAccountExists( + conn: Connection, + address: PublicKey +): Promise { + const account = await conn.getAccountInfo(address, "max"); + const exists = account != null; + return exists; } - /** * Request all verified tokens available on Jupiter swap * @@ -575,78 +614,86 @@ async function solAccountExists(conn: Connection, address: PublicKey): Promise { - const signal = context?.signal +async function getJupiterTokens(context?: { + signal?: AbortSignal; +}): Promise { + const signal = context?.signal; - const url = JUPITER_TOKENS_URL - let failed = false + const url = JUPITER_TOKENS_URL; + let failed = false; let tokens: JupiterTokenInfo[]; - const backoff = [0, 100, 500, 1000, 2_500, 5_000] - let backoffi = 0 - let errRef: undefined | { err: Error } + const backoff = [0, 100, 500, 1000, 2_500, 5_000]; + let backoffi = 0; + let errRef: undefined | { err: Error }; while (true) { if (signal?.aborted) { // Context aborted - throw signal.reason + throw signal.reason; } if (backoffi >= backoff.length) { // Failed after too many attempts - throw new Error(`Failed to get tokens after ${backoffi} retries: ${String(errRef?.err ?? '???')}`) + throw new Error( + `Failed to get tokens after ${backoffi} retries: ${String( + errRef?.err ?? "???" + )}` + ); } if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - console.debug(`Retrying after ${backoff[backoffi]}ms...`) + console.debug(`Retrying after ${backoff[backoffi]}ms...`); await new Promise((res, rej) => { function onTimeout() { - cleanupTimeout() - res() + cleanupTimeout(); + res(); } function onAbortDuringSleep() { - cleanupTimeout() - rej(signal!.reason) + cleanupTimeout(); + rej(signal!.reason); } function cleanupTimeout() { - signal?.removeEventListener('abort', onAbortDuringSleep) - clearTimeout(timeout) + signal?.removeEventListener("abort", onAbortDuringSleep); + clearTimeout(timeout); } - signal?.addEventListener('abort', onAbortDuringSleep) - const timeout = setTimeout(onTimeout) - }) + signal?.addEventListener("abort", onAbortDuringSleep); + const timeout = setTimeout(onTimeout); + }); } /** Cancels the HTTP request */ - const aborter = new AbortController() + const aborter = new AbortController(); /** Cancel this request if the context cancels */ const onAbortDuringRequest = () => { - aborter.abort(signal!.reason) - } + aborter.abort(signal!.reason); + }; /** Times out the request */ const timeout = setTimeout(() => { - aborter.abort(new Error(`HTTP request timed out ${url}`)) + aborter.abort(new Error(`HTTP request timed out ${url}`)); }, 30_000); - signal?.addEventListener('abort', onAbortDuringRequest) + signal?.addEventListener("abort", onAbortDuringRequest); /** Cleanup timeouts and aborters */ const cleanupRequest = () => { - clearTimeout(timeout) - signal?.removeEventListener('abort', onAbortDuringRequest) - } + clearTimeout(timeout); + signal?.removeEventListener("abort", onAbortDuringRequest); + }; try { - console.debug(`Initiating HTTP request for Jupiter tokens ${url}`) + console.debug(`Initiating HTTP request for Jupiter tokens ${url}`); const res = await fetch(url, { signal: aborter.signal, headers: [["Accept", "application/json"]], - redirect: 'follow', + redirect: "follow", keepalive: true, - }) + }); if (!res.ok) { - let msg = await res.text().catch((err) => `Failed to decode response text: ${String(err)}`) + let msg = await res + .text() + .catch((err) => `Failed to decode response text: ${String(err)}`); const msglen = msg.length; if (msglen > 512 + 7 + 3 + msglen.toString().length) { msg = `${msg.slice(0, 512)}... (512/${msglen})`; @@ -659,32 +706,41 @@ async function getJupiterTokens(context?: { signal?: AbortSignal }): Promise'}: ${msg}`) + throw new Error( + `Failed to get tokens, HTTP response returned not-ok status ${ + res.status + } ${res.statusText || ""}: ${msg}` + ); } - tokens = await res.json() as JupiterTokenInfo[] + tokens = (await res.json()) as JupiterTokenInfo[]; if (!tokens) { - throw new Error('Failed to get tokens: something went wrong and result is falsy') + throw new Error( + "Failed to get tokens: something went wrong and result is falsy" + ); } - return tokens + return tokens; } catch (err) { - if (signal?.aborted) throw signal.reason - if (failed) throw err - console.debug(`Failed to get tokens on attempt ${backoffi + 1}/${backoff.length}: ${String(err)}`) - errRef ??= { err: err as Error } + if (signal?.aborted) throw signal.reason; + if (failed) throw err; + console.debug( + `Failed to get tokens on attempt ${backoffi + 1}/${ + backoff.length + }: ${String(err)}` + ); + errRef ??= { err: err as Error }; } finally { - cleanupRequest() + cleanupRequest(); } - backoffi += 1 + backoffi += 1; } } - /** * Request a quote for a swap pair from the Jupiter API * @@ -695,45 +751,45 @@ async function getJupiterTokens(context?: { signal?: AbortSignal }): Promise { - const { - srcMint, - dstMint, - amount, - slippageBps, - referralFeeBps, - } = params; + const { srcMint, dstMint, amount, slippageBps, referralFeeBps } = params; - const signal = context?.signal + const signal = context?.signal; if (slippageBps != null) { if (!Number.isSafeInteger(slippageBps)) { - throw new TypeError(`Invalid slippageBps: ${slippageBps} must be a safe integer`) + throw new TypeError( + `Invalid slippageBps: ${slippageBps} must be a safe integer` + ); } if (slippageBps < 0) { - throw new Error(`Invalid slippageBps: ${slippageBps} must be >= 0`) + throw new Error(`Invalid slippageBps: ${slippageBps} must be >= 0`); } } if (referralFeeBps != null) { if (!Number.isSafeInteger(referralFeeBps)) { - throw new TypeError(`Invalid referralFeeBps: ${referralFeeBps} must be a safe integer`) + throw new TypeError( + `Invalid referralFeeBps: ${referralFeeBps} must be a safe integer` + ); } if (referralFeeBps < 0) { - throw new TypeError(`Invalid referralFeeBps: ${referralFeeBps} must be >= 0`) + throw new TypeError( + `Invalid referralFeeBps: ${referralFeeBps} must be >= 0` + ); } } @@ -748,77 +804,83 @@ async function getJupiterQuote( quoteParams.push(["platformFeeBps", referralFeeBps.toString()]); } quoteParams.push(["swapMode", "ExactIn"]); - const queryString = new URLSearchParams(quoteParams) - const url = `${JUPITER_API_URL}quote?${queryString.toString()}` + const queryString = new URLSearchParams(quoteParams); + const url = `${JUPITER_API_URL}quote?${queryString.toString()}`; - let failed = false + let failed = false; let quote: JupiterQuoteResponse; - const backoff = [0, 100, 500, 1000, 2_500, 5_000] - let backoffi = 0 - let errRef: undefined | { err: Error } + const backoff = [0, 100, 500, 1000, 2_500, 5_000]; + let backoffi = 0; + let errRef: undefined | { err: Error }; while (true) { if (signal?.aborted) { // Context aborted - throw signal.reason + throw signal.reason; } if (backoffi >= backoff.length) { // Failed after too many attempts - throw new Error(`Failed to get quote after ${backoffi} retries at url ${url}: ${String(errRef?.err ?? '???')}`) + throw new Error( + `Failed to get quote after ${backoffi} retries at url ${url}: ${String( + errRef?.err ?? "???" + )}` + ); } if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`) + console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`); await new Promise((res, rej) => { function onTimeout() { - cleanupTimeout() - res() + cleanupTimeout(); + res(); } function onAbortDuringSleep() { - cleanupTimeout() - rej(signal!.reason) + cleanupTimeout(); + rej(signal!.reason); } function cleanupTimeout() { - signal?.removeEventListener('abort', onAbortDuringSleep) - clearTimeout(timeout) + signal?.removeEventListener("abort", onAbortDuringSleep); + clearTimeout(timeout); } - signal?.addEventListener('abort', onAbortDuringSleep) - const timeout = setTimeout(onTimeout) - }) + signal?.addEventListener("abort", onAbortDuringSleep); + const timeout = setTimeout(onTimeout); + }); } /** Cancels the HTTP request */ - const aborter = new AbortController() + const aborter = new AbortController(); /** Cancel this request if the context cancels */ const onAbortDuringRequest = () => { - aborter.abort(signal!.reason) - } + aborter.abort(signal!.reason); + }; /** Times out the request */ const timeout = setTimeout(() => { - aborter.abort(new Error(`HTTP request timed out ${url}`)) + aborter.abort(new Error(`HTTP request timed out ${url}`)); }, 30_000); - signal?.addEventListener('abort', onAbortDuringRequest) + signal?.addEventListener("abort", onAbortDuringRequest); /** Cleanup timeouts and aborters */ const cleanupRequest = () => { - clearTimeout(timeout) - signal?.removeEventListener('abort', onAbortDuringRequest) - } + clearTimeout(timeout); + signal?.removeEventListener("abort", onAbortDuringRequest); + }; try { - console.debug(`Initiating HTTP request for Jupiter quote ${url}`) + console.debug(`Initiating HTTP request for Jupiter quote ${url}`); const res = await fetch(url, { signal: aborter.signal, headers: [["Accept", "application/json"]], - redirect: 'follow', + redirect: "follow", keepalive: true, - }) + }); if (!res.ok) { - let msg = await res.text().catch((err) => `Failed to decode response text: ${String(err)}`) + let msg = await res + .text() + .catch((err) => `Failed to decode response text: ${String(err)}`); const msglen = msg.length; if (msglen > 512 + 7 + 3 + msglen.toString().length) { msg = `${msg.slice(0, 512)}... (512/${msglen})`; @@ -831,32 +893,41 @@ async function getJupiterQuote( case 404: case 405: case 500: - failed = true + failed = true; break; default: /* noop */ } - throw new Error(`Failed to get quote, HTTP response returned not-ok status ${res.status} ${res.statusText || ''} at url ${url}: ${msg}`) + throw new Error( + `Failed to get quote, HTTP response returned not-ok status ${ + res.status + } ${res.statusText || ""} at url ${url}: ${msg}` + ); } - quote = await res.json() as JupiterQuoteResponse + quote = (await res.json()) as JupiterQuoteResponse; if (!quote) { - throw new Error(`Failed to get quote at url ${url}, something went wrong and result is falsy`) + throw new Error( + `Failed to get quote at url ${url}, something went wrong and result is falsy` + ); } - return quote + return quote; } catch (err) { - if (signal?.aborted) throw signal.reason + if (signal?.aborted) throw signal.reason; if (failed) throw err; - console.warn(`Failed to get quote on attempt ${backoffi + 1}/${backoff.length}: ${String(err)}`) - errRef ??= { err: err as Error } + console.warn( + `Failed to get quote on attempt ${backoffi + 1}/${ + backoff.length + }: ${String(err)}` + ); + errRef ??= { err: err as Error }; } finally { - cleanupRequest() + cleanupRequest(); } - backoffi += 1 + backoffi += 1; } } - /** * Request a swap transaction for a given quote from the Jupiter swap API * @@ -867,99 +938,105 @@ async function getJupiterQuote( async function getJupiterSwap( params: { /** Base58 signer address that pays for the transaction */ - signerPubkey: PublicKey, + signerPubkey: PublicKey; /** Base58 referrer address (created in the Jupiter dashboard, not the ATA address) */ - referrerATAPubkey?: PublicKey + referrerATAPubkey?: PublicKey; /** Response from Jupiter API */ - quote: JupiterQuoteResponse, + quote: JupiterQuoteResponse; }, context?: { - signal?: AbortSignal, + signal?: AbortSignal; } ): Promise { - const { signerPubkey, quote, referrerATAPubkey, } = params; - const signal = context?.signal + const { signerPubkey, quote, referrerATAPubkey } = params; + const signal = context?.signal; const swapParams: JupiterSwapParams = { userPublicKey: signerPubkey.toBase58(), feeAccount: referrerATAPubkey?.toBase58() ?? undefined, quoteResponse: quote, - } + }; - const url = `${JUPITER_API_URL}swap` + const url = `${JUPITER_API_URL}swap`; let failed = false; let swap: JupiterSwapResponse; - const backoff = [0, 100, 500, 1000, 2_500, 5_000] - let backoffi = 0 - let errRef: undefined | { err: Error } + const backoff = [0, 100, 500, 1000, 2_500, 5_000]; + let backoffi = 0; + let errRef: undefined | { err: Error }; while (true) { if (signal?.aborted) { // Context aborted - throw signal.reason + throw signal.reason; } if (backoffi >= backoff.length) { // Failed after too many attempts - throw new Error(`Failed to get swap after ${backoffi} retries at url ${url}: ${String(errRef?.err ?? '???')}`) + throw new Error( + `Failed to get swap after ${backoffi} retries at url ${url}: ${String( + errRef?.err ?? "???" + )}` + ); } if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`) + console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`); await new Promise((res, rej) => { function onTimeout() { - cleanupTimeout() - res() + cleanupTimeout(); + res(); } function onAbortDuringSleep() { - cleanupTimeout() - rej(signal!.reason) + cleanupTimeout(); + rej(signal!.reason); } function cleanupTimeout() { - signal?.removeEventListener('abort', onAbortDuringSleep) - clearTimeout(timeout) + signal?.removeEventListener("abort", onAbortDuringSleep); + clearTimeout(timeout); } - signal?.addEventListener('abort', onAbortDuringSleep) - const timeout = setTimeout(onTimeout) - }) + signal?.addEventListener("abort", onAbortDuringSleep); + const timeout = setTimeout(onTimeout); + }); } /** Cancels the HTTP request */ - const aborter = new AbortController() + const aborter = new AbortController(); /** Cancel this request if the context cancels */ const onAbortDuringRequest = () => { - aborter.abort(signal!.reason) - } + aborter.abort(signal!.reason); + }; /** Times out the request */ const timeout = setTimeout(() => { - aborter.abort(new Error(`HTTP request timed out ${url}`)) + aborter.abort(new Error(`HTTP request timed out ${url}`)); }, 30_000); - signal?.addEventListener('abort', onAbortDuringRequest) + signal?.addEventListener("abort", onAbortDuringRequest); /** Cleanup timeouts and aborters */ const cleanupRequest = () => { - clearTimeout(timeout) - signal?.removeEventListener('abort', onAbortDuringRequest) - } + clearTimeout(timeout); + signal?.removeEventListener("abort", onAbortDuringRequest); + }; try { - console.debug(`Initiating HTTP request for Jupiter swap ${url}`) + console.debug(`Initiating HTTP request for Jupiter swap ${url}`); const res = await fetch(url, { signal: aborter.signal, - method: 'POST', + method: "POST", headers: [ ["Accept", "application/json"], ["Content-Type", "application/json"], ], body: JSON.stringify(swapParams), - redirect: 'follow', + redirect: "follow", keepalive: true, - }) + }); if (!res.ok) { - let msg = await res.text().catch((err) => `Failed to decode response text: ${String(err)}`) + let msg = await res + .text() + .catch((err) => `Failed to decode response text: ${String(err)}`); const msglen = msg.length; if (msglen > 512 + 7 + 3 + msglen.toString().length) { msg = `${msg.slice(0, 512)}... (512/${msglen})`; @@ -972,28 +1049,38 @@ async function getJupiterSwap( case 404: case 405: case 500: - failed = true + failed = true; break; default: /* noop */ } - throw new Error(`Failed to get swap, HTTP response returned not-ok status ${res.status} ${res.statusText || ''} at url ${url}: ${msg}`) + throw new Error( + `Failed to get swap, HTTP response returned not-ok status ${ + res.status + } ${res.statusText || ""} at url ${url}: ${msg}` + ); } - swap = await res.json() as JupiterSwapResponse + swap = (await res.json()) as JupiterSwapResponse; if (!quote) { - throw new Error(`Failed to get swap at url ${url}, something went wrong and result is falsy`) + throw new Error( + `Failed to get swap at url ${url}, something went wrong and result is falsy` + ); } - return swap + return swap; } catch (err) { - if (failed) throw err - console.debug(`Failed to get swap on attempt ${backoffi + 1}/${backoff.length}: ${String(err)}`) - errRef ??= { err: err as Error } + if (failed) throw err; + console.debug( + `Failed to get swap on attempt ${backoffi + 1}/${ + backoff.length + }: ${String(err)}` + ); + errRef ??= { err: err as Error }; } finally { - cleanupRequest() + cleanupRequest(); } - backoffi += 1 + backoffi += 1; } } @@ -1010,7 +1097,7 @@ async function getJupiterSwap( */ function getJupiterReferrerAssociatedTokenAccount( referrerPubkey: PublicKey, - mintPubkey: PublicKey, + mintPubkey: PublicKey ): PublicKey { /** `feeAccount` section of https://station.jup.ag/api-v6/post-swap */ const referrerAccountSeeds = [ @@ -1019,8 +1106,11 @@ function getJupiterReferrerAssociatedTokenAccount( referrerPubkey.toBuffer(), mintPubkey.toBuffer(), ]; - const [referrerATAPubkey] = PublicKey.findProgramAddressSync(referrerAccountSeeds, JUPITER_REFERRAL_PROGRAM_PUBKEY); - return referrerATAPubkey + const [referrerATAPubkey] = PublicKey.findProgramAddressSync( + referrerAccountSeeds, + JUPITER_REFERRAL_PROGRAM_PUBKEY + ); + return referrerATAPubkey; } /** @@ -1056,21 +1146,21 @@ function getJupiterReferrerAssociatedTokenAccount( */ function getJupiterInitialiseReferralTokenAccountInstruction(params: { /** Pubkey of the referrer program itself that instructions will be executed on */ - programId: PublicKey, + programId: PublicKey; /** Payer pubkey */ - payerPubkey: PublicKey, + payerPubkey: PublicKey; /** ? */ - vaultPubkey: PublicKey, + vaultPubkey: PublicKey; /** Referrer project pubkey (your referrer address in the Jupiter console) */ - referralAccountPubkey: PublicKey, + referralAccountPubkey: PublicKey; /** Jupiter ATA account for your referrer address with the SPL token address */ - referralATAPubkey: PublicKey, + referralATAPubkey: PublicKey; /** SPL token address */ - mintPubkey: PublicKey, + mintPubkey: PublicKey; /** Pubkey of the Solana SPL System Program */ - systemProgramId: PublicKey, + systemProgramId: PublicKey; /** Pubkey of the Solana SPL token program ?? TODO: WHICH ONE ?? */ - tokenProgramId: PublicKey, + tokenProgramId: PublicKey; }): TransactionInstruction { const { programId, @@ -1090,7 +1180,7 @@ function getJupiterInitialiseReferralTokenAccountInstruction(params: { // const discriminator = fullHash.slice(0, 8); // First 8 bytes of the hash // TODO: how do we calculate this? I got it from Solscan and it seems to work - const discriminator = Buffer.from('7d12465f56b3ddbe', 'hex') + const discriminator = Buffer.from("7d12465f56b3ddbe", "hex"); // No data is needed, only: // 1. The discriminator (similar to function selector in EVM) @@ -1099,17 +1189,17 @@ function getJupiterInitialiseReferralTokenAccountInstruction(params: { programId, data: discriminator, keys: [ - { pubkey: payerPubkey, isSigner: true, isWritable: true, }, - { pubkey: vaultPubkey, isSigner: false, isWritable: false, }, - { pubkey: referralAccountPubkey, isSigner: false, isWritable: false, }, - { pubkey: referralATAPubkey, isSigner: false, isWritable: true, }, - { pubkey: mintPubkey, isSigner: false, isWritable: false, }, - { pubkey: systemProgramId, isSigner: false, isWritable: false, }, - { pubkey: tokenProgramId, isSigner: false, isWritable: false, }, + { pubkey: payerPubkey, isSigner: true, isWritable: true }, + { pubkey: vaultPubkey, isSigner: false, isWritable: false }, + { pubkey: referralAccountPubkey, isSigner: false, isWritable: false }, + { pubkey: referralATAPubkey, isSigner: false, isWritable: true }, + { pubkey: mintPubkey, isSigner: false, isWritable: false }, + { pubkey: systemProgramId, isSigner: false, isWritable: false }, + { pubkey: tokenProgramId, isSigner: false, isWritable: false }, ], - }) + }); - return instruction + return instruction; } /** @@ -1122,16 +1212,16 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( tx: VersionedTransaction, params: { /** Pubkey paying for the transaction */ - payerPubkey: PublicKey, + payerPubkey: PublicKey; /** Pubkey of your Jupiter referral account, from the Jupiter dashboard */ - referrerPubkey: PublicKey, + referrerPubkey: PublicKey; /** Jupiter referrer ATA pubkey @see `getJupiterReferrerAssociatedTokenAccount` */ - referrerATAPubkey: PublicKey, + referrerATAPubkey: PublicKey; /** SPL token address */ - mintPubkey: PublicKey, + mintPubkey: PublicKey; /** The SPL token progam or the 2022 SPL token program */ - tokenProgramId: PublicKey, - }, + tokenProgramId: PublicKey; + } ) { const { payerPubkey, @@ -1151,7 +1241,7 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( mintPubkey, systemProgramId: SystemProgram.programId, tokenProgramId, - }) + }); // Now we need to: // 1. Decompile the transaction @@ -1167,37 +1257,52 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( // the addresses that our message needs. // // We can also use the lookup accounts when re-compiling the transaction. - const lookupAccountsCount = tx.message.addressTableLookups.length - const addressLookupTableAccounts: AddressLookupTableAccount[] = new Array(lookupAccountsCount) + const lookupAccountsCount = tx.message.addressTableLookups.length; + const addressLookupTableAccounts: AddressLookupTableAccount[] = new Array( + lookupAccountsCount + ); for (let i = 0; i < lookupAccountsCount; i++) { - const lookup = tx.message.addressTableLookups[i] - const result = await conn.getAddressLookupTable(lookup.accountKey) - const addressLookupTableAccount = result.value - if (addressLookupTableAccount == null) throw new Error(`Failed to get address lookup table for ${lookup.accountKey}`) - console.debug(`Fetching lookup account ${i + 1}. ${lookup.accountKey.toBase58()}`) - addressLookupTableAccounts[i] = addressLookupTableAccount + const lookup = tx.message.addressTableLookups[i]; + const result = await conn.getAddressLookupTable(lookup.accountKey); + const addressLookupTableAccount = result.value; + if (addressLookupTableAccount == null) + throw new Error( + `Failed to get address lookup table for ${lookup.accountKey}` + ); + console.debug( + `Fetching lookup account ${i + 1}. ${lookup.accountKey.toBase58()}` + ); + addressLookupTableAccounts[i] = addressLookupTableAccount; } // Decompile the transaction message so we can modify it - const decompiledTransactionMessage = TransactionMessage.decompile(tx.message, { addressLookupTableAccounts, }) + const decompiledTransactionMessage = TransactionMessage.decompile( + tx.message, + { addressLookupTableAccounts } + ); // Insert our instruction to create an account directly after compute budget // program instructions that compute limits and priority fees - const computeBudgetProgramAddr = ComputeBudgetProgram.programId.toBase58() - let inserted = false - instructionLoop: - for (let i = 0, len = decompiledTransactionMessage.instructions.length; i < len; i++) { + const computeBudgetProgramAddr = ComputeBudgetProgram.programId.toBase58(); + let inserted = false; + instructionLoop: for ( + let i = 0, len = decompiledTransactionMessage.instructions.length; + i < len; + i++ + ) { // As soon as we hit a non compute budget program, insert our instruction to create the account - const existingInstruction = decompiledTransactionMessage.instructions[i] + const existingInstruction = decompiledTransactionMessage.instructions[i]; switch (existingInstruction.programId.toBase58()) { case computeBudgetProgramAddr: // do nothing break; default: { // insert our instruction here & continue - console.debug(`Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}`) - inserted = true - decompiledTransactionMessage.instructions.splice(i, 0, instruction) + console.debug( + `Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` + ); + inserted = true; + decompiledTransactionMessage.instructions.splice(i, 0, instruction); break instructionLoop; } } @@ -1205,15 +1310,19 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( if (!inserted) { // If there were no compute budget instructions then just add it at the start - console.debug(`Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions`) - decompiledTransactionMessage.instructions.unshift(instruction) + console.debug( + `Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` + ); + decompiledTransactionMessage.instructions.unshift(instruction); } // Switch to using this modified transaction - console.debug(`Re-compiling transaction`) - const modifiedTx = new VersionedTransaction(decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts)) + console.debug(`Re-compiling transaction`); + const modifiedTx = new VersionedTransaction( + decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts) + ); - return modifiedTx + return modifiedTx; } /** @@ -1223,24 +1332,28 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( * @returns Pubkey of the SPL token token owner program * @throws If the account does not exist or if it's not owned by one of the SPL token programs */ -async function getTokenProgramOfMint(conn: Connection, mint: PublicKey): Promise { - console.debug(`Checking mint account of ${mint.toBase58()}`) - const srcMintAcc = await conn.getAccountInfo(mint) +async function getTokenProgramOfMint( + conn: Connection, + mint: PublicKey +): Promise { + console.debug(`Checking mint account of ${mint.toBase58()}`); + const srcMintAcc = await conn.getAccountInfo(mint); if (srcMintAcc == null) { - throw new Error(`There is no SPL token account at address ${mint.toBase58()}`) + throw new Error( + `There is no SPL token account at address ${mint.toBase58()}` + ); } switch (srcMintAcc.owner.toBase58()) { case TOKEN_PROGRAM_ID.toBase58(): case TOKEN_2022_PROGRAM_ID.toBase58(): - return srcMintAcc.owner + return srcMintAcc.owner; default: throw new Error( `Mint address is not a valid SPL token, must either have owner` + - ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + - ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` + ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + + ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` ); } } - diff --git a/packages/swap/src/providers/oneInch/index.ts b/packages/swap/src/providers/oneInch/index.ts index 6183db4c8..b49bc9fd4 100644 --- a/packages/swap/src/providers/oneInch/index.ts +++ b/packages/swap/src/providers/oneInch/index.ts @@ -178,7 +178,8 @@ class OneInch extends ProviderClass { disableEstimate: "true", }); return fetch( - `${BASE_URL}${supportedNetworks[this.network].chainId + `${BASE_URL}${ + supportedNetworks[this.network].chainId }/swap?${params.toString()}` ) .then((res) => res.json()) diff --git a/packages/swap/src/providers/paraswap/index.ts b/packages/swap/src/providers/paraswap/index.ts index 5f6076ee7..6c297836d 100644 --- a/packages/swap/src/providers/paraswap/index.ts +++ b/packages/swap/src/providers/paraswap/index.ts @@ -183,7 +183,8 @@ class ParaSwap extends ProviderClass { : "0", }); return fetch( - `${BASE_URL}transactions/${supportedNetworks[this.network].chainId + `${BASE_URL}transactions/${ + supportedNetworks[this.network].chainId }?${params.toString()}`, { method: "POST", diff --git a/packages/swap/src/providers/zerox/index.ts b/packages/swap/src/providers/zerox/index.ts index 949aa260c..0aa17e0df 100644 --- a/packages/swap/src/providers/zerox/index.ts +++ b/packages/swap/src/providers/zerox/index.ts @@ -166,7 +166,8 @@ class ZeroX extends ProviderClass { affiliateAddress: feeConfig ? feeConfig.referrer : "", }); return fetch( - `${BASE_URL}${supportedNetworks[this.network].chainId + `${BASE_URL}${ + supportedNetworks[this.network].chainId }/swap/v1/quote?${params.toString()}` ) .then((res) => res.json()) diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index 4c97a7f22..e50f0898c 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -256,10 +256,13 @@ export abstract class ProviderClass { abstract getQuote( options: getQuoteOptions, meta: QuoteMetaOptions, - context?: { signal?: AbortSignal, }, + context?: { signal?: AbortSignal } ): Promise; - abstract getSwap(quote: SwapQuote, context?: { signal?: AbortSignal }): Promise; + abstract getSwap( + quote: SwapQuote, + context?: { signal?: AbortSignal } + ): Promise; abstract getStatus(options: StatusOptions): Promise; } From 59e9c3809324be2e8fe85984f51604d431316d75 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 3 Sep 2024 11:09:22 -0700 Subject: [PATCH 296/375] devop: sol address change event --- .../extension/src/providers/solana/inject.ts | 5 ++--- .../solana/libs/accounts-state/index.ts | 2 -- .../providers/solana/libs/message-router.ts | 17 +++++++++------ .../solana/libs/wallet-standard/initialize.ts | 1 - .../solana/libs/wallet-standard/wallet.ts | 21 +++++++++---------- .../solana/libs/wallet-standard/window.ts | 2 +- packages/extension/src/types/provider.ts | 8 ++++++- packages/extension/src/ui/action/App.vue | 18 +++++++++------- 8 files changed, 41 insertions(+), 33 deletions(-) diff --git a/packages/extension/src/providers/solana/inject.ts b/packages/extension/src/providers/solana/inject.ts index 25a3022c4..342284a55 100644 --- a/packages/extension/src/providers/solana/inject.ts +++ b/packages/extension/src/providers/solana/inject.ts @@ -46,14 +46,13 @@ export class Provider }); } disconnect(): Promise { - console.log("disconnect"); - return Promise.reject("not implemented"); + this.accounts = []; + return Promise.resolve(); } signAndSendTransaction( transaction: SolSignTransactionRequest, options?: SendOptions | undefined ): Promise { - console.log("signAndSendTransaction"); return this.request({ method: "sol_signAndSendTransaction", params: [JSON.stringify(transaction), JSON.stringify(options)], diff --git a/packages/extension/src/providers/solana/libs/accounts-state/index.ts b/packages/extension/src/providers/solana/libs/accounts-state/index.ts index c757c8fd6..63426b0fd 100644 --- a/packages/extension/src/providers/solana/libs/accounts-state/index.ts +++ b/packages/extension/src/providers/solana/libs/accounts-state/index.ts @@ -9,7 +9,6 @@ class AccountState { ); } async addApprovedAddress(address: string, domain: string): Promise { - address = address.toLowerCase(); const state = await this.getStateByDomain(domain); if (state.approvedAccounts.includes(address)) state.approvedAccounts = state.approvedAccounts.filter( @@ -19,7 +18,6 @@ class AccountState { await this.setState(state, domain); } async removeApprovedAddress(address: string, domain: string): Promise { - address = address.toLowerCase(); const state = await this.getStateByDomain(domain); if (state.approvedAccounts.includes(address)) { state.approvedAccounts = state.approvedAccounts.filter( diff --git a/packages/extension/src/providers/solana/libs/message-router.ts b/packages/extension/src/providers/solana/libs/message-router.ts index a87a8b1a7..f699a2c83 100644 --- a/packages/extension/src/providers/solana/libs/message-router.ts +++ b/packages/extension/src/providers/solana/libs/message-router.ts @@ -4,17 +4,15 @@ import { EmitEvent, } from "@/providers/ethereum/types"; import { - BitcoinProvider, - EnkryptProviderEventMethods, + SolanaProvider, handleIncomingMessage as handleIncomingMessageType, } from "@/types/provider"; -import { NetworkNames } from "@enkryptcom/types"; const handleIncomingMessage: handleIncomingMessageType = ( provider, message ): void => { try { - const _provider = provider as BitcoinProvider; + const _provider = provider as SolanaProvider; const jsonMsg = JSON.parse(message) as ProviderMessage; if (jsonMsg.method === MessageMethod.changeConnected) { const isConnected = jsonMsg.params[0] as boolean; @@ -25,8 +23,15 @@ const handleIncomingMessage: handleIncomingMessageType = ( _provider.emit(EmitEvent.disconnect); } } else if (jsonMsg.method === MessageMethod.changeAddress) { - const address = jsonMsg.params[0] as string; - _provider.emit(EmitEvent.accountsChanged, [address]); + _provider + .request({ + method: "sol_connect", + params: [], + }) + .then((res: { address: string; pubkey: string }[]) => { + _provider.accounts = res; + _provider.emit(EmitEvent.accountsChanged); + }); } } catch (e) { console.error(e); diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts b/packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts index a361ca724..d217d7239 100644 --- a/packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts +++ b/packages/extension/src/providers/solana/libs/wallet-standard/initialize.ts @@ -3,6 +3,5 @@ import { EnkryptWallet } from "./wallet"; import type { Enkrypt } from "./window"; export function initialize(enkrypt: Enkrypt): void { - console.log(new EnkryptWallet(enkrypt)); registerWallet(new EnkryptWallet(enkrypt)); } diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts index 3941679c5..680b086da 100644 --- a/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts +++ b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts @@ -34,6 +34,7 @@ import { EnkryptWalletAccount } from "./account.js"; import { icon } from "./icon.js"; import { isSolanaChain, SOLANA_CHAINS } from "./solana.js"; import type { Enkrypt } from "./window.js"; +import { EmitEvent } from "@/providers/ethereum/types/index.js"; export const EnkryptNamespace = "enkrypt:"; @@ -134,9 +135,9 @@ export class EnkryptWallet implements Wallet { Object.freeze(this); } this.#enkrypt = enkrypt; - enkrypt.on("connect", this.#connected, this); - enkrypt.on("disconnect", this.#disconnected, this); - enkrypt.on("accountChanged", this.#reconnected, this); + enkrypt.on(EmitEvent.connect, this.#connected, this); + enkrypt.on(EmitEvent.disconnect, this.#disconnected, this); + enkrypt.on(EmitEvent.accountsChanged, this.#reconnected, this); this.#connected(); } @@ -165,15 +166,13 @@ export class EnkryptWallet implements Wallet { #connected = () => { if (this.#enkrypt.accounts.length) { - if (this.#accounts?.length !== this.#enkrypt.accounts.length) { - this.#accounts = this.#enkrypt.accounts.map((acc) => { - return new EnkryptWalletAccount({ - address: acc.address, - publicKey: hexToUint8Array(acc.pubkey), - }); + this.#accounts = this.#enkrypt.accounts.map((acc) => { + return new EnkryptWalletAccount({ + address: acc.address, + publicKey: hexToUint8Array(acc.pubkey), }); - this.#emit("change", { accounts: this.accounts }); - } + }); + this.#emit("change", { accounts: this.accounts }); } }; diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/window.ts b/packages/extension/src/providers/solana/libs/wallet-standard/window.ts index bb01a230d..97b5b6109 100644 --- a/packages/extension/src/providers/solana/libs/wallet-standard/window.ts +++ b/packages/extension/src/providers/solana/libs/wallet-standard/window.ts @@ -8,7 +8,7 @@ import { export interface EnkryptEvent { connect(...args: unknown[]): unknown; disconnect(...args: unknown[]): unknown; - accountChanged(...args: unknown[]): unknown; + accountsChanged(...args: unknown[]): unknown; } export interface EnkryptSolAccount { diff --git a/packages/extension/src/types/provider.ts b/packages/extension/src/types/provider.ts index 8bce232a5..7eca2fea1 100644 --- a/packages/extension/src/types/provider.ts +++ b/packages/extension/src/types/provider.ts @@ -146,7 +146,13 @@ export type handleOutgoingMessage = ( provider: Provider, message: string ) => Promise; -export { EthereumProvider, PolkadotProvider, BitcoinProvider, KadenaProvider }; +export { + EthereumProvider, + PolkadotProvider, + BitcoinProvider, + KadenaProvider, + SolanaProvider, +}; export type Provider = | EthereumProvider | PolkadotProvider diff --git a/packages/extension/src/ui/action/App.vue b/packages/extension/src/ui/action/App.vue index 330204969..ab6248aaf 100644 --- a/packages/extension/src/ui/action/App.vue +++ b/packages/extension/src/ui/action/App.vue @@ -111,6 +111,7 @@ import { import openOnboard from "@/libs/utils/open-onboard"; import BTCAccountState from "@/providers/bitcoin/libs/accounts-state"; import EVMAccountState from "@/providers/ethereum/libs/accounts-state"; +import SolAccountState from "@/providers/solana/libs/accounts-state"; import { MessageMethod } from "@/providers/ethereum/types"; import { EvmNetwork } from "@/providers/ethereum/types/evm-network"; import { MessageMethod as KadenaMessageMethod } from "@/providers/kadena/types"; @@ -395,14 +396,15 @@ const onSelectedSubnetworkChange = async (id: string) => { const onSelectedAddressChanged = async (newAccount: EnkryptAccount) => { accountHeaderData.value.selectedAccount = newAccount; - if ( - currentNetwork.value.provider === ProviderName.ethereum || - currentNetwork.value.provider === ProviderName.bitcoin - ) { - const AccountState = - currentNetwork.value.provider === ProviderName.ethereum - ? new EVMAccountState() - : new BTCAccountState(); + const accountStates = { + [ProviderName.ethereum]: EVMAccountState, + [ProviderName.bitcoin]: BTCAccountState, + [ProviderName.solana]: SolAccountState, + }; + if (Object.keys(accountStates).includes(currentNetwork.value.provider)) { + const AccountState = new accountStates[ + currentNetwork.value.provider as keyof typeof accountStates + ](); const domain = await domainState.getCurrentDomain(); AccountState.addApprovedAddress(newAccount.address, domain); } From 3824ce1f735546d902ee587b34a77d9d28b147b2 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 4 Sep 2024 12:51:51 -0700 Subject: [PATCH 297/375] fix: hw btc,ltc,doge accounts --- .../src/providers/bitcoin/ui/btc-connect-dapp.vue | 4 ++-- packages/extension/src/ui/action/views/swap/index.vue | 6 +++--- .../ui/onboard/hardware-wallet/views/select-account.vue | 8 +++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue b/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue index 0dd5ec9b8..7e4128281 100644 --- a/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue +++ b/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue @@ -80,6 +80,7 @@ import PublicKeyRing from "@/libs/keyring/public-keyring"; import { fromBase } from "@enkryptcom/utils"; import { getError } from "@/libs/error"; import { ErrorCodes } from "@/providers/ethereum/types"; +import { getAccountsByNetworkName } from "@/libs/utils/accounts"; import AccountState from "../libs/accounts-state"; const windowPromise = WindowPromiseHandler(1); @@ -109,9 +110,8 @@ onBeforeMount(async () => { network.value = (await getNetworkByName( Request.value.params![0] )) as BitcoinNetwork; - const keyring = new PublicKeyRing(); Options.value = options; - const accounts = await keyring.getAccounts(network.value.signer); + const accounts = await getAccountsByNetworkName(network.value.name); displayAddress.value = network.value.displayAddress(accounts[0].address); identicon.value = network.value.identicon(accounts[0].address); accountHeaderData.value = { diff --git a/packages/extension/src/ui/action/views/swap/index.vue b/packages/extension/src/ui/action/views/swap/index.vue index 0ed76f703..58b593236 100644 --- a/packages/extension/src/ui/action/views/swap/index.vue +++ b/packages/extension/src/ui/action/views/swap/index.vue @@ -134,6 +134,7 @@ import SwapLooking from "./components/swap-loading/index.vue"; import SwapErrorPopup from "./components/swap-error/index.vue"; import SendAddressInput from "./components/send-address-input.vue"; import SendContactsList from "./components/send-contacts-list.vue"; +import { getAccountsByNetworkName } from "@/libs/utils/accounts"; import { AccountsHeaderData } from "../../types/account"; import { getNetworkByName } from "@/libs/utils/networks"; import { BaseNetwork } from "@/types/base-network"; @@ -164,7 +165,6 @@ import { SWAP_LOADING, SwapData } from "./types"; import SwapNetworkSelect from "./components/swap-network-select/index.vue"; import { toBase } from "@enkryptcom/utils"; import { debounce } from "lodash"; -import PublicKeyRing from "@/libs/keyring/public-keyring"; import MarketData from "@/libs/market-data"; import { ProviderResponseWithStatus } from "./types"; import { GenericNameResolver, CoinType } from "@/libs/name-resolver"; @@ -245,7 +245,7 @@ const swap = new EnkryptSwap({ infiniteApproval: true, }, }); -const keyring = new PublicKeyRing(); + onMounted(async () => { trackSwapEvents(SwapEventType.SwapOpen, { network: props.network.name }); if ( @@ -368,7 +368,7 @@ const setToTokens = () => { ); }); if (toTokens.value.length === 1) toToken.value = toTokens.value[0]; - keyring.getAccounts(toNetwork.value?.signerType).then((accounts) => { + getAccountsByNetworkName(props.network.name).then((accounts) => { toAccounts.value = accounts; const currentAccount = accounts.find( (a) => a.address === props.accountInfo.selectedAccount!.address diff --git a/packages/extension/src/ui/onboard/hardware-wallet/views/select-account.vue b/packages/extension/src/ui/onboard/hardware-wallet/views/select-account.vue index 731cfbc61..4c90fa6ef 100644 --- a/packages/extension/src/ui/onboard/hardware-wallet/views/select-account.vue +++ b/packages/extension/src/ui/onboard/hardware-wallet/views/select-account.vue @@ -57,8 +57,10 @@ import { polkadotEncodeAddress } from "@enkryptcom/utils"; import { useHWStore } from "../store"; import { BaseNetwork } from "@/types/base-network"; import SubstrateAPI from "@/providers/polkadot/libs/api"; -import EvmAPI from "@/providers/ethereum/libs/api"; -import BtcApi from "@/providers/bitcoin/libs/api"; +import type EvmAPI from "@/providers/ethereum/libs/api"; +import type BtcApi from "@/providers/bitcoin/libs/api"; +import type SolApi from "@/providers/solana/libs/api"; +import type KdaApi from "@/providers/kadena/libs/api"; const store = useHWStore(); const router = useRouter(); @@ -78,7 +80,7 @@ const loading = ref(false); const currentAddressIndex = ref(0); const keyring = new PublicKeyRing(); const existingAccounts = ref([]); -const networkApi = ref(); +const networkApi = ref(); const accounts = ref([]); const visibleAccounts = computed(() => { return accounts.value.slice( From 86d0fd1af897f342a8913de030b899f170db25ca Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 4 Sep 2024 12:54:07 -0700 Subject: [PATCH 298/375] fix: hw btc,ltc,doge accounts --- .../extension/src/providers/bitcoin/ui/btc-connect-dapp.vue | 1 - packages/extension/src/providers/solana/libs/message-router.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue b/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue index 7e4128281..a9e670239 100644 --- a/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue +++ b/packages/extension/src/providers/bitcoin/ui/btc-connect-dapp.vue @@ -76,7 +76,6 @@ import { DEFAULT_BTC_NETWORK, getNetworkByName } from "@/libs/utils/networks"; import { WindowPromiseHandler } from "@/libs/window-promise"; import { BitcoinNetwork } from "../types/bitcoin-network"; import { ProviderRequestOptions } from "@/types/provider"; -import PublicKeyRing from "@/libs/keyring/public-keyring"; import { fromBase } from "@enkryptcom/utils"; import { getError } from "@/libs/error"; import { ErrorCodes } from "@/providers/ethereum/types"; diff --git a/packages/extension/src/providers/solana/libs/message-router.ts b/packages/extension/src/providers/solana/libs/message-router.ts index a87a8b1a7..6ac01d9a1 100644 --- a/packages/extension/src/providers/solana/libs/message-router.ts +++ b/packages/extension/src/providers/solana/libs/message-router.ts @@ -5,10 +5,8 @@ import { } from "@/providers/ethereum/types"; import { BitcoinProvider, - EnkryptProviderEventMethods, handleIncomingMessage as handleIncomingMessageType, } from "@/types/provider"; -import { NetworkNames } from "@enkryptcom/types"; const handleIncomingMessage: handleIncomingMessageType = ( provider, message From 0a671cc233fc4e81e9f9905efa8b0cd198a5aaa2 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 4 Sep 2024 13:45:14 -0700 Subject: [PATCH 299/375] fix: hw btc,ltc,doge accounts --- .../src/ui/action/views/swap/index.vue | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/extension/src/ui/action/views/swap/index.vue b/packages/extension/src/ui/action/views/swap/index.vue index 58b593236..e94a0d6ce 100644 --- a/packages/extension/src/ui/action/views/swap/index.vue +++ b/packages/extension/src/ui/action/views/swap/index.vue @@ -368,19 +368,22 @@ const setToTokens = () => { ); }); if (toTokens.value.length === 1) toToken.value = toTokens.value[0]; - getAccountsByNetworkName(props.network.name).then((accounts) => { - toAccounts.value = accounts; - const currentAccount = accounts.find( - (a) => a.address === props.accountInfo.selectedAccount!.address - ); - if (currentAccount) { - address.value = currentAccount.address; - isValidToAddress(); - } else if (accounts.length) { - address.value = accounts[0].address; - isValidToAddress(); + + getAccountsByNetworkName(toNetwork.value!.id as unknown as NetworkNames).then( + (accounts) => { + toAccounts.value = accounts; + const currentAccount = accounts.find( + (a) => a.address === props.accountInfo.selectedAccount!.address + ); + if (currentAccount) { + address.value = currentAccount.address; + isValidToAddress(); + } else if (accounts.length) { + address.value = accounts[0].address; + isValidToAddress(); + } } - }); + ); }; const setMax = () => { From 9e8b152ff3f5ce010c881b60f26c361da2fc43ab Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 4 Sep 2024 15:59:12 -0700 Subject: [PATCH 300/375] devop: properly calculate op chain tx fees --- .../ethereum/libs/transaction/index.ts | 52 +++++-- .../ethereum/libs/transaction/op-data.ts | 133 ++++++++++++++++++ 2 files changed, 176 insertions(+), 9 deletions(-) create mode 100644 packages/extension/src/providers/ethereum/libs/transaction/op-data.ts diff --git a/packages/extension/src/providers/ethereum/libs/transaction/index.ts b/packages/extension/src/providers/ethereum/libs/transaction/index.ts index dbd88a293..5756ee8a3 100644 --- a/packages/extension/src/providers/ethereum/libs/transaction/index.ts +++ b/packages/extension/src/providers/ethereum/libs/transaction/index.ts @@ -7,7 +7,7 @@ import { GasCosts, TransactionOptions, } from "./types"; -import { GasPriceTypes } from "@/providers/common/types"; +import { BNType, GasPriceTypes } from "@/providers/common/types"; import { numberToHex, toBN } from "web3-utils"; import { GAS_PERCENTILES, @@ -18,6 +18,8 @@ import { } from "./gas-utils"; import { Hardfork, Common } from "@ethereumjs/common"; import { FeeMarketEIP1559Transaction, LegacyTransaction } from "@ethereumjs/tx"; +import { OPTIMISM_PRICE_ORACLE, OPTIMISM_PRICE_ORACLE_ABI } from "./op-data"; +import { bufferToHex } from "@enkryptcom/utils"; class Transaction { tx: EthereumTransaction; @@ -35,6 +37,21 @@ class Transaction { value: this.tx.value || "0x0", }); } + async getOPfees(): Promise { + const OPContract = new this.web3.Contract( + OPTIMISM_PRICE_ORACLE_ABI as any, + OPTIMISM_PRICE_ORACLE + ); + const fTx = await this.getFinalizedTransaction({ + gasPriceType: GasPriceTypes.ECONOMY, + }); + const serializedTx = fTx.serialize(); + return OPContract.methods + .getL1Fee(bufferToHex(serializedTx)) + .call() + .then((val: string) => toBN(val)) + .catch(() => toBN(0)); + } private getFeeMarketGasInfo = ( baseFeePerGas: string, formattedFeeHistory: FormattedFeeHistory, @@ -184,19 +201,28 @@ class Transaction { await this.finalizeTransaction({ gasPriceType: GasPriceTypes.ECONOMY, }); + const opFee = await this.getOPfees(); if (gasPrice) { return { [GasPriceTypes.ECONOMY]: numberToHex( - getGasBasedOnType(gasPrice, GasPriceTypes.ECONOMY).mul(toBN(gasLimit)) + getGasBasedOnType(gasPrice, GasPriceTypes.ECONOMY) + .mul(toBN(gasLimit)) + .add(opFee) ), [GasPriceTypes.REGULAR]: numberToHex( - getGasBasedOnType(gasPrice, GasPriceTypes.REGULAR).mul(toBN(gasLimit)) + getGasBasedOnType(gasPrice, GasPriceTypes.REGULAR) + .mul(toBN(gasLimit)) + .add(opFee) ), [GasPriceTypes.FAST]: numberToHex( - getGasBasedOnType(gasPrice, GasPriceTypes.FAST).mul(toBN(gasLimit)) + getGasBasedOnType(gasPrice, GasPriceTypes.FAST) + .mul(toBN(gasLimit)) + .add(opFee) ), [GasPriceTypes.FASTEST]: numberToHex( - getGasBasedOnType(gasPrice, GasPriceTypes.FASTEST).mul(toBN(gasLimit)) + getGasBasedOnType(gasPrice, GasPriceTypes.FASTEST) + .mul(toBN(gasLimit)) + .add(opFee) ), }; } else { @@ -206,28 +232,36 @@ class Transaction { baseFeePerGas!, formattedFeeHistory!, GasPriceTypes.ECONOMY - ).maxFeePerGas.mul(toBN(gasLimit)) + ) + .maxFeePerGas.mul(toBN(gasLimit)) + .add(opFee) ), [GasPriceTypes.REGULAR]: numberToHex( this.getFeeMarketGasInfo( baseFeePerGas!, formattedFeeHistory!, GasPriceTypes.REGULAR - ).maxFeePerGas.mul(toBN(gasLimit)) + ) + .maxFeePerGas.mul(toBN(gasLimit)) + .add(opFee) ), [GasPriceTypes.FAST]: numberToHex( this.getFeeMarketGasInfo( baseFeePerGas!, formattedFeeHistory!, GasPriceTypes.FAST - ).maxFeePerGas.mul(toBN(gasLimit)) + ) + .maxFeePerGas.mul(toBN(gasLimit)) + .add(opFee) ), [GasPriceTypes.FASTEST]: numberToHex( this.getFeeMarketGasInfo( baseFeePerGas!, formattedFeeHistory!, GasPriceTypes.FASTEST - ).maxFeePerGas.mul(toBN(gasLimit)) + ) + .maxFeePerGas.mul(toBN(gasLimit)) + .add(opFee) ), }; } diff --git a/packages/extension/src/providers/ethereum/libs/transaction/op-data.ts b/packages/extension/src/providers/ethereum/libs/transaction/op-data.ts new file mode 100644 index 000000000..32cd8a3dd --- /dev/null +++ b/packages/extension/src/providers/ethereum/libs/transaction/op-data.ts @@ -0,0 +1,133 @@ +const OPTIMISM_PRICE_ORACLE = "0x420000000000000000000000000000000000000F"; +const OPTIMISM_PRICE_ORACLE_ABI = [ + { + inputs: [], + name: "DECIMALS", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseFee", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseFeeScalar", + outputs: [{ internalType: "uint32", name: "", type: "uint32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "blobBaseFee", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "blobBaseFeeScalar", + outputs: [{ internalType: "uint32", name: "", type: "uint32" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "gasPrice", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "bytes", name: "_data", type: "bytes" }], + name: "getL1Fee", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { internalType: "uint256", name: "_unsignedTxSize", type: "uint256" }, + ], + name: "getL1FeeUpperBound", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [{ internalType: "bytes", name: "_data", type: "bytes" }], + name: "getL1GasUsed", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isEcotone", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isFjord", + outputs: [{ internalType: "bool", name: "", type: "bool" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "l1BaseFee", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "overhead", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "scalar", + outputs: [{ internalType: "uint256", name: "", type: "uint256" }], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "setEcotone", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "setFjord", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "version", + outputs: [{ internalType: "string", name: "", type: "string" }], + stateMutability: "view", + type: "function", + }, +]; + +export { OPTIMISM_PRICE_ORACLE, OPTIMISM_PRICE_ORACLE_ABI }; From ab40f11d74b627f30e1cc80f94060d5640ece937 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:51:49 -0700 Subject: [PATCH 301/375] fix: paraswap --- packages/swap/package.json | 2 +- packages/swap/src/providers/paraswap/index.ts | 9 ++++++--- packages/swap/tests/paraswap.test.ts | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/swap/package.json b/packages/swap/package.json index ac953e7fc..19d15726f 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "tsup src/index.ts --format esm,cjs --dts --clean", "lint": "prettier --write .", - "test": "ts-mocha -p tsconfig.json tests/**/*.test.ts" + "test": "ts-mocha -p tsconfig.json tests/**/paraswap*.test.ts" }, "engines": { "node": ">=14.15.0" diff --git a/packages/swap/src/providers/paraswap/index.ts b/packages/swap/src/providers/paraswap/index.ts index 817c42f7c..0707b4570 100644 --- a/packages/swap/src/providers/paraswap/index.ts +++ b/packages/swap/src/providers/paraswap/index.ts @@ -39,7 +39,7 @@ import estimateGasList from "../../common/estimateGasList"; import { isEVMAddress } from "../../utils/common"; export const PARASWAP_APPROVAL_ADDRESS = - "0x216b4b4ba9f3e719726886d34a177484278bfcae"; + "0x6a000f20005980200259b80c5102003040001068"; const supportedNetworks: { [key in SupportedNetworkName]?: { approvalAddress: string; chainId: string }; @@ -69,11 +69,11 @@ const supportedNetworks: { chainId: "42161", }, [SupportedNetworkName.Base]: { - approvalAddress: "0x93aAAe79a53759cD164340E4C8766E4Db5331cD7", + approvalAddress: PARASWAP_APPROVAL_ADDRESS, chainId: "8453", }, [SupportedNetworkName.MaticZK]: { - approvalAddress: "0xc8a21fcd5a100c3ecc037c97e2f9c53a8d3a02a1", + approvalAddress: PARASWAP_APPROVAL_ADDRESS, chainId: "1101", }, }; @@ -181,6 +181,7 @@ class ParaSwap extends ProviderClass { partnerFeeBps: feeConfig ? parseInt((feeConfig.fee * 10000).toString(), 10).toString() : "0", + isDirectFeeTransfer: true, }); return fetch( `${BASE_URL}transactions/${ @@ -269,10 +270,12 @@ class ParaSwap extends ProviderClass { destDecimals: options.toToken.decimals.toString(), amount: options.amount.toString(), side: "SELL", + excludeDEXS: "ParaSwapPool,ParaSwapLimitOrders", network: supportedNetworks[this.network].chainId, userAddress: options.fromAddress, receiver: options.toAddress, partnerAddress: feeConfig ? feeConfig.referrer : "", + version: "6.2", partnerFeeBps: feeConfig ? parseInt((feeConfig.fee * 10000).toString(), 10).toString() : "0", diff --git a/packages/swap/tests/paraswap.test.ts b/packages/swap/tests/paraswap.test.ts index 14a80113b..43f9b5189 100644 --- a/packages/swap/tests/paraswap.test.ts +++ b/packages/swap/tests/paraswap.test.ts @@ -51,7 +51,7 @@ describe("Paraswap Provider", () => { )}${TOKEN_AMOUNT_INFINITY_AND_BEYOND.replace("0x", "")}` ); expect(swap?.transactions[1].to).to.be.eq( - "0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57" + "0x6a000f20005980200259b80c5102003040001068" ); }).timeout(10000); @@ -78,7 +78,7 @@ describe("Paraswap Provider", () => { ).replace("0x", "")}` ); expect(swap?.transactions[1].to).to.be.eq( - "0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57" + "0x6a000f20005980200259b80c5102003040001068" ); }).timeout(10000); }); From 760c39618cd36dab177653991bef66a348375f94 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:52:18 -0700 Subject: [PATCH 302/375] fix: paraswap --- packages/swap/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/swap/package.json b/packages/swap/package.json index 19d15726f..ac953e7fc 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -10,7 +10,7 @@ "scripts": { "build": "tsup src/index.ts --format esm,cjs --dts --clean", "lint": "prettier --write .", - "test": "ts-mocha -p tsconfig.json tests/**/paraswap*.test.ts" + "test": "ts-mocha -p tsconfig.json tests/**/*.test.ts" }, "engines": { "node": ">=14.15.0" From 4f82f969088061aa4e5669bee76892c520fdf5de Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Wed, 4 Sep 2024 21:28:04 -0500 Subject: [PATCH 303/375] fix: reconcile solana swap fees, chore: cleanup --- .../src/ui/action/views/swap/index.vue | 27 +- .../views/swap/libs/send-transactions.ts | 9 +- .../action/views/swap/libs/solana-gasvals.ts | 14 +- .../swap-best-offer-block/index.vue | 2 +- packages/swap/src/configs.ts | 12 +- packages/swap/src/providers/jupiter/index.ts | 307 ++++++++++++++---- packages/swap/src/types/index.ts | 5 +- 7 files changed, 288 insertions(+), 88 deletions(-) diff --git a/packages/extension/src/ui/action/views/swap/index.vue b/packages/extension/src/ui/action/views/swap/index.vue index 9e8573fe0..8d027f1ba 100644 --- a/packages/extension/src/ui/action/views/swap/index.vue +++ b/packages/extension/src/ui/action/views/swap/index.vue @@ -172,6 +172,11 @@ import { trackSwapEvents } from "@/libs/metrics"; import { SwapEventType } from "@/libs/metrics/types"; import { Connection } from "@solana/web3.js"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function +const debug = (..._args: any[]) => {}; +// Use this debug instead to enable debug logging +// const debug = console.debug.bind(console); + type BN = ReturnType; const router = useRouter(); @@ -464,8 +469,8 @@ const nativeSwapToken = computed(() => { */ const pickBestQuote = (fromAmountBN: BN, quotes: ProviderQuoteResponse[]) => { if (toToken.value == null) { - console.debug( - "Skipping quote picking: no destination token amount selected yet" + debug( + "[swap/index.vue] Skipping quote picking: no destination token amount selected yet" ); return; } @@ -581,7 +586,7 @@ const updateQuote = () => { const token = new SwapToken(fromToken.value!); if (fromAmount.value == null) { // User probably set a destination token before setting a "from" amount - console.debug("Skipping quote update: no source token amount set"); + debug("[swap/index.vue] Skipping quote update: no source token amount set"); return; } let fromRawAmount: BN; @@ -615,7 +620,7 @@ const updateQuote = () => { aborter: new AbortController(), }; updateQuoteContext.current = ctx; - console.debug(`Starting quote update id=${vid}:${ctx.id}`); + debug(`[swap/index.vue] Starting quote update id=${vid}:${ctx.id}`); swap .getQuotes( @@ -633,15 +638,19 @@ const updateQuote = () => { .then((quotes) => { // Overidden by new update, drop these quotes if (ctx.aborter.signal.aborted) { - console.debug(`Dropping quotes due to new update id=${vid}:${ctx.id}`); + debug( + `[swap/index.vue] Dropping quotes due to new update id=${vid}:${ctx.id}` + ); return; } if (quotes.length) { - console.debug(`Found ${quotes.length} quotes id=${vid}:${ctx.id}`); + debug( + `[swap/index.vue] Found ${quotes.length} quotes id=${vid}:${ctx.id}` + ); pickBestQuote(fromRawAmount, quotes); } else { - console.debug(`No quotes id=${vid}:${ctx.id}`); + debug(`[swap/index.vue] No quotes id=${vid}:${ctx.id}`); isFindingRate.value = false; errors.value.noProviders = true; } @@ -649,8 +658,8 @@ const updateQuote = () => { .catch((err) => { // Context aborted, just ignore the error if (err === ctx.aborter.signal.reason) { - console.debug( - `Ignoring error due to quote request context abort id=${vid}:${ctx.id}` + debug( + `[swap/index.vue] Ignoring error due to quote request context abort id=${vid}:${ctx.id}` ); return; } diff --git a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts index 5fbebd509..a1633c3bd 100644 --- a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts +++ b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts @@ -249,7 +249,14 @@ export const executeSwap = async ( }` ); } - throw err; + // Solana transactions can have big errors + // Trim the error so it doesn't break the UI by being too huge + let msg = (err as Error).message; + const len = msg.length; + if (len > 512 + 10 + len.toString().length) { + msg = `${msg.slice(0, 512)}... (${len.toString()}/512)`; + } + throw new Error(msg); } // Update transaction activity for the UI diff --git a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts index 9b4a92284..5b180f12c 100644 --- a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts +++ b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts @@ -4,6 +4,10 @@ import { SolanaNetwork } from "@/providers/solana/types/sol-network"; import { VersionedTransaction } from "@solana/web3.js"; import { toBN } from "web3-utils"; +/** + * Mutably updates transactions with the latest block hash + * (not nice but convenient) + */ export const getSolanaTransactionFees = async ( txs: VersionedTransaction[], network: SolanaNetwork, @@ -12,10 +16,13 @@ export const getSolanaTransactionFees = async ( ): Promise> => { let feesumlamp = additionalFee; const conn = ((await network.api()) as SolanaAPI).web3; + const latestBlockHash = await conn.getLatestBlockhash(); for (let i = 0, len = txs.length; i < len; i++) { const tx = txs[i]; - /** Base fee + priority fee */ - const fee = await conn.getFeeForMessage(tx.message, "processed"); + // Use the latest block hash in-case it's fallen too far behind + tx.message.recentBlockhash = latestBlockHash.blockhash; + /** Base fee + priority fee + rent fees (but the rent fees seem slightly higher than expected @ 2024-09-04) */ + const fee = await conn.getFeeForMessage(tx.message); if (fee.value == null) { // TODO: handle this throw new Error( @@ -32,8 +39,7 @@ export const getSolanaTransactionFees = async ( // TODO: give different fees for different priority levels return { [GasPriceTypes.REGULAR]: { - // Convert to string, cut off floating point rounding errors, trim - // redundant trailing 0's + // Convert to string, cut off floating point rounding errors, trim redundant trailing 0's nativeValue: feesumsol.toFixed(10).replace(/\.?0+$/, ""), fiatValue: (price * feesumsol).toFixed(10).replace(/\.?0+$/, ""), nativeSymbol: "SOL", diff --git a/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue b/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue index 543fd1d42..5c95fc009 100644 --- a/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue +++ b/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue @@ -67,7 +67,7 @@ Offer includes {{ $filters.formatFloatingPointValue(toReadableAdditionalFees).value }} {{ network?.currencyName.toUpperCase() }} - Bridging fee + {{ pickedTrade.additionalNativeFeesDescription || "Bridging fee" }}

diff --git a/packages/swap/src/configs.ts b/packages/swap/src/configs.ts index 351580cfe..12ed2ff90 100644 --- a/packages/swap/src/configs.ts +++ b/packages/swap/src/configs.ts @@ -58,14 +58,18 @@ const FEE_CONFIGS: Partial< [WalletIdentifier.enkrypt]: { // TODO: THIS IS NICK'S TESTING REFERRAL ADDRESS, NEEDS TO CHANGE BEFORE RELEASE // referrer: "78ZKhPea9sVW3jLsjvQov9jUooGe3qGnwauA1QoJFCq1", - referrer: "41gBjMVCQ4FD2GAsKdjVPEGLQc7K6AxoY8C7PJ7HDp6y", - fee: 0.00875, + // referrer: "41gBjMVCQ4FD2GAsKdjVPEGLQc7K6AxoY8C7PJ7HDp6y", + referrer: "EcrQ8iRSczuUq8YPBQKx1mWRuH8xxi3t9uwfenb6o9aW", + // Rounded because Jupiter API only accepts bps integers + fee: 0.01, }, [WalletIdentifier.mew]: { // TODO: THIS IS NICK'S TESTING REFERRAL ADDRESS, NEEDS TO CHANGE BEFORE RELEASE // referrer: "78ZKhPea9sVW3jLsjvQov9jUooGe3qGnwauA1QoJFCq1", - referrer: "41gBjMVCQ4FD2GAsKdjVPEGLQc7K6AxoY8C7PJ7HDp6y", - fee: 0.025, + // referrer: "41gBjMVCQ4FD2GAsKdjVPEGLQc7K6AxoY8C7PJ7HDp6y", + referrer: "EcrQ8iRSczuUq8YPBQKx1mWRuH8xxi3t9uwfenb6o9aW", + // Rounded because Jupiter API only accepts bps integers + fee: 0.030, }, }, }; diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 190543bd8..272ee8a0c 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -2,7 +2,9 @@ import { NetworkNames } from "@enkryptcom/types"; import { + AccountMeta, AddressLookupTableAccount, + ComputeBudgetInstruction, ComputeBudgetProgram, Connection, PublicKey, @@ -48,6 +50,7 @@ import { toBN } from "web3-utils"; * @see https://station.jup.ag/guides/jupiter-swap/how-referral-works * @see https://referral.jup.ag/ * @see https://referral.jup.ag/api + * @see https://github.com/TeamRaccoons/referral * * Jupiter requires you to create a referral account. You can do this by * visiting the Jupiter referral dashboard https://referral.jup.ag/dashboard @@ -128,6 +131,29 @@ export const TOKEN_2022_PROGRAM_ID = new PublicKey( "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" ); +/** + * Address of the SPL Associated Token Account program + * + * @see https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb + */ +export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey( + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" +); + +/** + * Storage of a token ATA + * + * Required to calculate the extra cost if the swap fee if the swap needs to create a referral fee account + */ +const JUPITER_REFERRAL_ATA_ACCOUNT_SIZE_BYTES = 165; + +const SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES = 165; + +// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function +const debug = (..._args: any[]) => { }; +// Use this debug instead to enable debug logging +// const debug = console.debug.bind(console); + // Jupiter API Tokens /** @@ -366,15 +392,23 @@ export class Jupiter extends ProviderClass { jupiterSwap: JupiterSwapResponse; base64SwapTransaction: string; feePercentage: number; + slippagePercentage: number; + computeBudget: number; + rentFees: number; }> { + const signal = context?.signal; + const feeConf = FEE_CONFIGS[this.name][meta.walletIdentifier]; + if (!feeConf) throw new Error("Something went wrong: no fee config for Jupiter swap"); + const referrerPubkey = new PublicKey(feeConf.referrer); + /** Jupiter API requires an integer for bps so we must round */ const feeBps = Math.round(100 * feeConf.fee); - const signal = context?.signal; + const fromPubkey = new PublicKey(options.fromAddress); /** * Source token. @@ -410,15 +444,17 @@ export class Jupiter extends ProviderClass { referrerATAPubkey ); + const slippageBps = Math.round( + 100 * parseFloat(meta.slippage || DEFAULT_SLIPPAGE) + ); + const quote = await getJupiterQuote( { srcMint, dstMint, amount: BigInt(options.amount.toString(10)), // Integer so must round - slippageBps: Math.round( - 100 * parseFloat(meta.slippage || DEFAULT_SLIPPAGE) - ), + slippageBps, referralFeeBps: feeBps, }, { signal } @@ -427,7 +463,7 @@ export class Jupiter extends ProviderClass { const swap = await getJupiterSwap( { quote, - signerPubkey: new PublicKey(options.fromAddress), + signerPubkey: fromPubkey, referrerATAPubkey, }, { signal } @@ -437,14 +473,22 @@ export class Jupiter extends ProviderClass { Buffer.from(swap.swapTransaction, "base64") ); + const tokenProgramId = await getTokenProgramOfMint(this.conn, srcMint); + + /** Rent from having to create ATA accounts for the wallet & mint and the referral fee holder & mint */ + let rentFees = 0; + if (!referrerATAExists) { - // Update the transaction so it creates a ATA account to receive referral fees in - // see `updateSwapTransactionToCreateJupiterReferrerATA` for more details - console.debug( - `Referrer ATA does not exist. Updating transaction with instruction to create it. Referral ATA pubkey: ${referrerATAPubkey.toBase58()}` + // The referral fee ATA account needs to be created or else we can't receive fees for this transaction + rentFees = await this.conn.getMinimumBalanceForRentExemption( + JUPITER_REFERRAL_ATA_ACCOUNT_SIZE_BYTES ); - const tokenProgramId = await getTokenProgramOfMint(this.conn, srcMint); + debug( + `[Jupiter.querySwapInfo] Referrer ATA does not exist. Updating transaction with instruction to create it.` + + ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + + ` Rent: ${rentFees} lamports` + ); tx = await updateSwapTransactionToCreateJupiterReferrerATA( this.conn, @@ -459,11 +503,46 @@ export class Jupiter extends ProviderClass { ); } + // Will the destination token ATA for the swapper need to be created? + const walletDstMintATAPubkey = + await getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( + fromPubkey, + dstMint, + tokenProgramId + ); + const walletDstMintATAExists = await solAccountExists( + this.conn, + walletDstMintATAPubkey + ); + if (walletDstMintATAExists) { + debug( + `[Jupiter.querySwapInfo] Wallet destination mint ATA already exists, no need to record additional rent fees.` + + ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + + ` Destination mint: ${dstMint.toBase58()}` + ); + } else { + rentFees += await this.conn.getMinimumBalanceForRentExemption( + SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES + ); + debug( + `[Jupiter.querySwapInfo] Wallet destination mint ATA does not exist, it will be created by the swap transaction.` + + ` Adding ATA rent to extra transaction fees.` + + ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + + ` Destination mint: ${dstMint.toBase58()},` + + ` Rent: ${rentFees} lamports` + ); + } + + const computeBudget = extractComputeBudget(tx); + return { feePercentage: feeBps / 100, + slippagePercentage: slippageBps / 100, jupiterSwap: swap, jupiterQuote: quote, base64SwapTransaction: Buffer.from(tx.serialize()).toString("base64"), + rentFees, + computeBudget, }; } @@ -472,26 +551,31 @@ export class Jupiter extends ProviderClass { meta: QuoteMetaOptions, context?: { signal?: AbortSignal } ): Promise { - const { jupiterQuote } = await this.querySwapInfo(options, meta, context); + const { jupiterQuote, rentFees, computeBudget, feePercentage } = + await this.querySwapInfo(options, meta, context); // Jupiter swaps have four different kinds of fees: // 1. Transaction base fees: number of signatures * lamports per signature // 2. Transaction priority fees (sometimes): set via the Compute Budget program's "SetComputeUnitPrice" - // 3. Transaction referral fees: fees p aid to MEW as the wa llet provider - // 4. The swap provider, Jupiter, probably takes a fee (I think 2.5%? IIRC documented somewhere) + // 3. Transaction referral fees: fees paid to MEW (97.5%) and Jupiter (2.5%) as the wallet provider + // 4. Rent for ATA accounts that may need to be created; the referral fee account and mint account + + debug( + `[Jupiter.getQuote] Quote inAmount: ${jupiterQuote.inAmount} ${options.fromToken.symbol}` + ); + debug( + `[Jupiter.getQuote] Quote outAmount: ${jupiterQuote.outAmount} ${options.toToken.symbol}` + ); const result: ProviderQuoteResponse = { fromTokenAmount: toBN(jupiterQuote.inAmount), - toTokenAmount: toBN(jupiterQuote.outAmount), - // Solana doesn't have the concept of a gas limit - // it does have something kind-of similar to gas though, but base fees aren't changed based - // on it, only priority fees - // Base fees are charged on signature count (number of accounts possibly touched in transaction, - // usually 5,000 Lamports per signature I think) - // (unitsConsumed is kind-of like gas) - totalGaslimit: 0, - // TODO: consider setting this to price we pay to create the referrer ATA account if it doesn't already exist - additionalNativeFees: toBN(0), + toTokenAmount: toBN( + Math.floor((1 - feePercentage) * Number(jupiterQuote.outAmount)) + .toFixed(10) + .replace(/\.?0+$/, "") + ), + totalGaslimit: computeBudget, + additionalNativeFees: toBN(rentFees), provider: this.name, quote: { options, @@ -499,7 +583,7 @@ export class Jupiter extends ProviderClass { provider: this.name, }, minMax: { - // TODO: how do I get these limits? + // TODO: how can I get these limits? minimumFrom: toBN("1"), maximumFrom: toBN(TOKEN_AMOUNT_INFINITY_AND_BEYOND), minimumTo: toBN("1"), @@ -514,7 +598,7 @@ export class Jupiter extends ProviderClass { quote: SwapQuote, context?: { signal?: AbortSignal } ): Promise { - const { feePercentage, jupiterQuote, base64SwapTransaction } = + const { feePercentage, jupiterQuote, base64SwapTransaction, rentFees } = await this.querySwapInfo(quote.options, quote.meta, context); const enkryptTransaction: SolanaTransaction = { @@ -524,15 +608,26 @@ export class Jupiter extends ProviderClass { type: TransactionType.solana, }; + debug( + `[Jupiter.getSwap] Quote inAmount: ${jupiterQuote.inAmount} ${quote.options.fromToken.symbol}` + ); + debug( + `[Jupiter.getSwap] Quote outAmount: ${jupiterQuote.outAmount} ${quote.options.toToken.symbol}` + ); + const result: ProviderSwapResponse = { transactions: [enkryptTransaction], fromTokenAmount: toBN(jupiterQuote.inAmount), - toTokenAmount: toBN(jupiterQuote.outAmount), - // TODO: consider setting this to price we pay to create the referrer ATA account if it doesn't already exist - additionalNativeFees: toBN(0), + toTokenAmount: toBN( + Math.floor((1 - feePercentage) * Number(jupiterQuote.outAmount)) + .toFixed(10) + .replace(/\.?0+$/, "") + ), + additionalNativeFees: toBN(rentFees), + additionalNativeFeesDescription: "Storage fee", provider: this.name, slippage: quote.meta.slippage, - fee: feePercentage, // feeConf.fee * 100, + fee: feePercentage, getStatusObject: async ( options: StatusOptions ): Promise => ({ @@ -635,7 +730,7 @@ async function getJupiterTokens(context?: { if (backoffi >= backoff.length) { // Failed after too many attempts throw new Error( - `Failed to get tokens after ${backoffi} retries: ${String( + `Failed to get Jupiter tokens after ${backoffi} retries: ${String( errRef?.err ?? "???" )}` ); @@ -643,7 +738,9 @@ async function getJupiterTokens(context?: { if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - console.debug(`Retrying after ${backoff[backoffi]}ms...`); + debug( + `[Jupiter.getJupiterTokens] Retrying after ${backoff[backoffi]}ms...` + ); await new Promise((res, rej) => { function onTimeout() { cleanupTimeout(); @@ -683,7 +780,9 @@ async function getJupiterTokens(context?: { }; try { - console.debug(`Initiating HTTP request for Jupiter tokens ${url}`); + debug( + `[getJupiterTokens] Initiating HTTP request for Jupiter tokens ${url}` + ); const res = await fetch(url, { signal: aborter.signal, headers: [["Accept", "application/json"]], @@ -711,8 +810,7 @@ async function getJupiterTokens(context?: { default: /* noop */ } throw new Error( - `Failed to get tokens, HTTP response returned not-ok status ${ - res.status + `Failed to get Jupiter tokens, HTTP response returned not-ok status ${res.status } ${res.statusText || ""}: ${msg}` ); } @@ -720,7 +818,7 @@ async function getJupiterTokens(context?: { if (!tokens) { throw new Error( - "Failed to get tokens: something went wrong and result is falsy" + "Failed to get Jupiter tokens: something went wrong and result is falsy" ); } @@ -728,10 +826,9 @@ async function getJupiterTokens(context?: { } catch (err) { if (signal?.aborted) throw signal.reason; if (failed) throw err; - console.debug( - `Failed to get tokens on attempt ${backoffi + 1}/${ - backoff.length - }: ${String(err)}` + debug( + `[getJupiterTokens] Failed to get Jupiter tokens on attempt ${backoffi + 1 + }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; } finally { @@ -822,7 +919,7 @@ async function getJupiterQuote( if (backoffi >= backoff.length) { // Failed after too many attempts throw new Error( - `Failed to get quote after ${backoffi} retries at url ${url}: ${String( + `Failed to get Jupiter quote after ${backoffi} retries at url ${url}: ${String( errRef?.err ?? "???" )}` ); @@ -830,7 +927,9 @@ async function getJupiterQuote( if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`); + debug( + `[getJupiterQuote] Retrying ${url} after ${backoff[backoffi]}ms...` + ); await new Promise((res, rej) => { function onTimeout() { cleanupTimeout(); @@ -870,7 +969,9 @@ async function getJupiterQuote( }; try { - console.debug(`Initiating HTTP request for Jupiter quote ${url}`); + debug( + `[getJupiterQuote] Initiating HTTP request for Jupiter quote ${url}` + ); const res = await fetch(url, { signal: aborter.signal, headers: [["Accept", "application/json"]], @@ -898,8 +999,7 @@ async function getJupiterQuote( default: /* noop */ } throw new Error( - `Failed to get quote, HTTP response returned not-ok status ${ - res.status + `Failed to get Jupiter quote, HTTP response returned not-ok status ${res.status } ${res.statusText || ""} at url ${url}: ${msg}` ); } @@ -907,7 +1007,7 @@ async function getJupiterQuote( if (!quote) { throw new Error( - `Failed to get quote at url ${url}, something went wrong and result is falsy` + `Failed to get Jupiter quote at url ${url}, something went wrong and result is falsy` ); } @@ -916,9 +1016,8 @@ async function getJupiterQuote( if (signal?.aborted) throw signal.reason; if (failed) throw err; console.warn( - `Failed to get quote on attempt ${backoffi + 1}/${ - backoff.length - }: ${String(err)}` + `[getJupiterQuote] Failed to get Jupiter quote on attempt ${backoffi + 1 + }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; } finally { @@ -973,7 +1072,7 @@ async function getJupiterSwap( if (backoffi >= backoff.length) { // Failed after too many attempts throw new Error( - `Failed to get swap after ${backoffi} retries at url ${url}: ${String( + `Failed to get Jupiter swap after ${backoffi} retries at url ${url}: ${String( errRef?.err ?? "???" )}` ); @@ -981,7 +1080,7 @@ async function getJupiterSwap( if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - console.debug(`Retrying ${url} after ${backoff[backoffi]}ms...`); + debug(`[getJupiterSwap] Retrying ${url} after ${backoff[backoffi]}ms...`); await new Promise((res, rej) => { function onTimeout() { cleanupTimeout(); @@ -1021,7 +1120,7 @@ async function getJupiterSwap( }; try { - console.debug(`Initiating HTTP request for Jupiter swap ${url}`); + debug(`[getJupiterSwap] Initiating HTTP request for Jupiter swap ${url}`); const res = await fetch(url, { signal: aborter.signal, method: "POST", @@ -1054,8 +1153,7 @@ async function getJupiterSwap( default: /* noop */ } throw new Error( - `Failed to get swap, HTTP response returned not-ok status ${ - res.status + `Failed to get Jupiter swap, HTTP response returned not-ok status ${res.status } ${res.statusText || ""} at url ${url}: ${msg}` ); } @@ -1064,17 +1162,16 @@ async function getJupiterSwap( if (!quote) { throw new Error( - `Failed to get swap at url ${url}, something went wrong and result is falsy` + `Failed to get Jupiter swap at url ${url}, something went wrong and result is falsy` ); } return swap; } catch (err) { if (failed) throw err; - console.debug( - `Failed to get swap on attempt ${backoffi + 1}/${ - backoff.length - }: ${String(err)}` + debug( + `[getJupiterSwap] Failed to get Jupiter swap on attempt ${backoffi + 1 + }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; } finally { @@ -1269,8 +1366,9 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( throw new Error( `Failed to get address lookup table for ${lookup.accountKey}` ); - console.debug( - `Fetching lookup account ${i + 1}. ${lookup.accountKey.toBase58()}` + debug( + `[updateSwapTransactionToCreateJupiterReferrerATA] Fetching lookup account ${i + 1 + }. ${lookup.accountKey.toBase58()}` ); addressLookupTableAccounts[i] = addressLookupTableAccount; } @@ -1298,8 +1396,8 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( break; default: { // insert our instruction here & continue - console.debug( - `Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` + debug( + `[updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` ); inserted = true; decompiledTransactionMessage.instructions.splice(i, 0, instruction); @@ -1310,14 +1408,14 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( if (!inserted) { // If there were no compute budget instructions then just add it at the start - console.debug( - `Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` + debug( + `[updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` ); decompiledTransactionMessage.instructions.unshift(instruction); } // Switch to using this modified transaction - console.debug(`Re-compiling transaction`); + debug(`Re-compiling transaction`); const modifiedTx = new VersionedTransaction( decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts) ); @@ -1336,7 +1434,7 @@ async function getTokenProgramOfMint( conn: Connection, mint: PublicKey ): Promise { - console.debug(`Checking mint account of ${mint.toBase58()}`); + debug(`[getTokenProgramOfMint] Checking mint account of ${mint.toBase58()}`); const srcMintAcc = await conn.getAccountInfo(mint); if (srcMintAcc == null) { @@ -1352,8 +1450,81 @@ async function getTokenProgramOfMint( default: throw new Error( `Mint address is not a valid SPL token, must either have owner` + - ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + - ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` + ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + + ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` ); } } + +/** + * Get the SPL token ATA pubkey for a wallet with a mint + */ +async function getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( + wallet: PublicKey, + mint: PublicKey, + /** Either the SPL token program or the 2022 SPL token program */ + tokenProgramId: PublicKey +): Promise { + const SEED = [wallet.toBuffer(), tokenProgramId.toBuffer(), mint.toBuffer()]; + const [associatedTokenAddress] = await PublicKey.findProgramAddress( + SEED, + ASSOCIATED_TOKEN_PROGRAM_ID + ); + return associatedTokenAddress; +} + +/** + * @see https://solana.com/docs/core/fees#prioritization-fees + * + * > Transactions can only contain one of each type of compute budget + * instruction. Duplicate instruction types will result in an + * TransactionError::DuplicateInstruction error, and ultimately + * transaction failure. + */ +function extractComputeBudget(tx: VersionedTransaction): undefined | number { + // extract the compute budget + let computeBudget: undefined | number; + + instructionLoop: for ( + let i = 0, len = tx.message.compiledInstructions.length; + i < len; + i++ + ) { + const instr = tx.message.compiledInstructions[i]; + const program = tx.message.staticAccountKeys[instr.programIdIndex]; + if (!ComputeBudgetProgram.programId.equals(program)) continue; + + const keys = instr.accountKeyIndexes.map( + (accountKeyIndex): AccountMeta => ({ + pubkey: tx.message.staticAccountKeys[accountKeyIndex], + isSigner: tx.message.isAccountSigner(accountKeyIndex), + isWritable: tx.message.isAccountWritable(accountKeyIndex), + }) + ); + + // Decompile the instruction + const instruction = new TransactionInstruction({ + keys, + programId: program, + data: Buffer.from(instr.data), + }); + + const type = ComputeBudgetInstruction.decodeInstructionType(instruction); + switch (type) { + case "SetComputeUnitLimit": { + // Compute limit + const command = + ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction); + computeBudget = command.units; + break instructionLoop; + } + // You can use this to get the priorty fee + // case "SetComputeUnitPrice": + default: /** noop */ + break; + } + } + + // (default of 200_000 from Google) + return computeBudget ?? 200_000; +} diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index e50f0898c..75dff5af6 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -215,8 +215,11 @@ export interface ProviderSwapResponse { transactions: SwapTransaction[]; toTokenAmount: BN; fromTokenAmount: BN; - // ? Is this priority fees ? + // Additional native currency that has to be paid for the transaction + // For example Changelly bridging fees, Solana rent fees additionalNativeFees: BN; + /** Description of `additionalNativeFees` for the swap UI. default: "Bridging fee" */ + additionalNativeFeesDescription?: string, provider: ProviderName; slippage: string; /** Percentage fee 0-1 (100 * basis points) */ From f24b36971fcd7dced5f02140e2a3f4681baa88a1 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Wed, 4 Sep 2024 21:28:54 -0500 Subject: [PATCH 304/375] chore: lint --- packages/swap/src/configs.ts | 2 +- packages/swap/src/providers/jupiter/index.ts | 43 ++++++++++++-------- packages/swap/src/types/index.ts | 2 +- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/packages/swap/src/configs.ts b/packages/swap/src/configs.ts index 12ed2ff90..b9cc17eed 100644 --- a/packages/swap/src/configs.ts +++ b/packages/swap/src/configs.ts @@ -69,7 +69,7 @@ const FEE_CONFIGS: Partial< // referrer: "41gBjMVCQ4FD2GAsKdjVPEGLQc7K6AxoY8C7PJ7HDp6y", referrer: "EcrQ8iRSczuUq8YPBQKx1mWRuH8xxi3t9uwfenb6o9aW", // Rounded because Jupiter API only accepts bps integers - fee: 0.030, + fee: 0.03, }, }, }; diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 272ee8a0c..04a14a896 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -150,7 +150,7 @@ const JUPITER_REFERRAL_ATA_ACCOUNT_SIZE_BYTES = 165; const SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES = 165; // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function -const debug = (..._args: any[]) => { }; +const debug = (..._args: any[]) => {}; // Use this debug instead to enable debug logging // const debug = console.debug.bind(console); @@ -486,8 +486,8 @@ export class Jupiter extends ProviderClass { debug( `[Jupiter.querySwapInfo] Referrer ATA does not exist. Updating transaction with instruction to create it.` + - ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + - ` Rent: ${rentFees} lamports` + ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + + ` Rent: ${rentFees} lamports` ); tx = await updateSwapTransactionToCreateJupiterReferrerATA( @@ -517,8 +517,8 @@ export class Jupiter extends ProviderClass { if (walletDstMintATAExists) { debug( `[Jupiter.querySwapInfo] Wallet destination mint ATA already exists, no need to record additional rent fees.` + - ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + - ` Destination mint: ${dstMint.toBase58()}` + ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + + ` Destination mint: ${dstMint.toBase58()}` ); } else { rentFees += await this.conn.getMinimumBalanceForRentExemption( @@ -526,10 +526,10 @@ export class Jupiter extends ProviderClass { ); debug( `[Jupiter.querySwapInfo] Wallet destination mint ATA does not exist, it will be created by the swap transaction.` + - ` Adding ATA rent to extra transaction fees.` + - ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + - ` Destination mint: ${dstMint.toBase58()},` + - ` Rent: ${rentFees} lamports` + ` Adding ATA rent to extra transaction fees.` + + ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + + ` Destination mint: ${dstMint.toBase58()},` + + ` Rent: ${rentFees} lamports` ); } @@ -810,7 +810,8 @@ async function getJupiterTokens(context?: { default: /* noop */ } throw new Error( - `Failed to get Jupiter tokens, HTTP response returned not-ok status ${res.status + `Failed to get Jupiter tokens, HTTP response returned not-ok status ${ + res.status } ${res.statusText || ""}: ${msg}` ); } @@ -827,7 +828,8 @@ async function getJupiterTokens(context?: { if (signal?.aborted) throw signal.reason; if (failed) throw err; debug( - `[getJupiterTokens] Failed to get Jupiter tokens on attempt ${backoffi + 1 + `[getJupiterTokens] Failed to get Jupiter tokens on attempt ${ + backoffi + 1 }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; @@ -999,7 +1001,8 @@ async function getJupiterQuote( default: /* noop */ } throw new Error( - `Failed to get Jupiter quote, HTTP response returned not-ok status ${res.status + `Failed to get Jupiter quote, HTTP response returned not-ok status ${ + res.status } ${res.statusText || ""} at url ${url}: ${msg}` ); } @@ -1016,7 +1019,8 @@ async function getJupiterQuote( if (signal?.aborted) throw signal.reason; if (failed) throw err; console.warn( - `[getJupiterQuote] Failed to get Jupiter quote on attempt ${backoffi + 1 + `[getJupiterQuote] Failed to get Jupiter quote on attempt ${ + backoffi + 1 }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; @@ -1153,7 +1157,8 @@ async function getJupiterSwap( default: /* noop */ } throw new Error( - `Failed to get Jupiter swap, HTTP response returned not-ok status ${res.status + `Failed to get Jupiter swap, HTTP response returned not-ok status ${ + res.status } ${res.statusText || ""} at url ${url}: ${msg}` ); } @@ -1170,7 +1175,8 @@ async function getJupiterSwap( } catch (err) { if (failed) throw err; debug( - `[getJupiterSwap] Failed to get Jupiter swap on attempt ${backoffi + 1 + `[getJupiterSwap] Failed to get Jupiter swap on attempt ${ + backoffi + 1 }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; @@ -1367,7 +1373,8 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( `Failed to get address lookup table for ${lookup.accountKey}` ); debug( - `[updateSwapTransactionToCreateJupiterReferrerATA] Fetching lookup account ${i + 1 + `[updateSwapTransactionToCreateJupiterReferrerATA] Fetching lookup account ${ + i + 1 }. ${lookup.accountKey.toBase58()}` ); addressLookupTableAccounts[i] = addressLookupTableAccount; @@ -1450,8 +1457,8 @@ async function getTokenProgramOfMint( default: throw new Error( `Mint address is not a valid SPL token, must either have owner` + - ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + - ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` + ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + + ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` ); } } diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index 75dff5af6..e4e3b75eb 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -219,7 +219,7 @@ export interface ProviderSwapResponse { // For example Changelly bridging fees, Solana rent fees additionalNativeFees: BN; /** Description of `additionalNativeFees` for the swap UI. default: "Bridging fee" */ - additionalNativeFeesDescription?: string, + additionalNativeFeesDescription?: string; provider: ProviderName; slippage: string; /** Percentage fee 0-1 (100 * basis points) */ From 4d5e716be9fdbc6e646f9bbfca8cc997fa916e21 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Wed, 4 Sep 2024 21:32:19 -0500 Subject: [PATCH 305/375] chore: cleanup --- packages/swap/src/providers/jupiter/index.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 04a14a896..657d28d35 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -743,14 +743,14 @@ async function getJupiterTokens(context?: { ); await new Promise((res, rej) => { function onTimeout() { - cleanupTimeout(); + cleanupSleep(); res(); } function onAbortDuringSleep() { - cleanupTimeout(); + cleanupSleep(); rej(signal!.reason); } - function cleanupTimeout() { + function cleanupSleep() { signal?.removeEventListener("abort", onAbortDuringSleep); clearTimeout(timeout); } @@ -934,14 +934,14 @@ async function getJupiterQuote( ); await new Promise((res, rej) => { function onTimeout() { - cleanupTimeout(); + cleanupSleep(); res(); } function onAbortDuringSleep() { - cleanupTimeout(); + cleanupSleep(); rej(signal!.reason); } - function cleanupTimeout() { + function cleanupSleep() { signal?.removeEventListener("abort", onAbortDuringSleep); clearTimeout(timeout); } @@ -1087,14 +1087,14 @@ async function getJupiterSwap( debug(`[getJupiterSwap] Retrying ${url} after ${backoff[backoffi]}ms...`); await new Promise((res, rej) => { function onTimeout() { - cleanupTimeout(); + cleanupSleep(); res(); } function onAbortDuringSleep() { - cleanupTimeout(); + cleanupSleep(); rej(signal!.reason); } - function cleanupTimeout() { + function cleanupSleep() { signal?.removeEventListener("abort", onAbortDuringSleep); clearTimeout(timeout); } From 7517c260b9baeae8ab6b3172e926256707c16ca8 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Wed, 4 Sep 2024 21:42:27 -0500 Subject: [PATCH 306/375] chore: cleanup --- .../src/ui/action/views/swap/index.vue | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/packages/extension/src/ui/action/views/swap/index.vue b/packages/extension/src/ui/action/views/swap/index.vue index 8d027f1ba..a3897e6cc 100644 --- a/packages/extension/src/ui/action/views/swap/index.vue +++ b/packages/extension/src/ui/action/views/swap/index.vue @@ -548,10 +548,8 @@ const pickBestQuote = (fromAmountBN: BN, quotes: ProviderQuoteResponse[]) => { isFindingRate.value = false; }; -/** Used to cancel avoid race conditions */ +/** Used to cancel the request to avoid race conditions */ const updateQuoteContext = { - /** view id */ - id: Math.random().toString().substring(2).slice(0, 3).padStart(3, "0"), current: { /** context id */ id: 0, @@ -608,19 +606,18 @@ const updateQuote = () => { console.warn("No destination token selected yet, yet requesting a quote??"); } - // Avoid race conditions - // Abort the previous execution (doesn't actually cancel anything - // since nothing is listening to the abort signal but once the quotes - // are ready they'll just be dropped) + // Abort the previous execution. Used to avoid race conditions in the UI and + // rapid pointless updates in succession when multiple requests are in-flight. + // AbortSignal gives the swap provider the abiltiy to cancel network requests + // and exit early when we call the context's abort controllers' abort() method. updateQuoteContext.current.aborter.abort(); - const vid = updateQuoteContext.id; // Setup a new abortable context const ctx = { id: updateQuoteContext.current.id + 1, aborter: new AbortController(), }; updateQuoteContext.current = ctx; - debug(`[swap/index.vue] Starting quote update id=${vid}:${ctx.id}`); + debug(`[swap/index.vue] Starting quote update id=${ctx.id}`); swap .getQuotes( @@ -639,18 +636,16 @@ const updateQuote = () => { // Overidden by new update, drop these quotes if (ctx.aborter.signal.aborted) { debug( - `[swap/index.vue] Dropping quotes due to new update id=${vid}:${ctx.id}` + `[swap/index.vue] Dropping quotes due to new update id=${ctx.id}` ); return; } if (quotes.length) { - debug( - `[swap/index.vue] Found ${quotes.length} quotes id=${vid}:${ctx.id}` - ); + debug(`[swap/index.vue] Found ${quotes.length} quotes id=${ctx.id}`); pickBestQuote(fromRawAmount, quotes); } else { - debug(`[swap/index.vue] No quotes id=${vid}:${ctx.id}`); + debug(`[swap/index.vue] No quotes id=${ctx.id}`); isFindingRate.value = false; errors.value.noProviders = true; } @@ -659,7 +654,7 @@ const updateQuote = () => { // Context aborted, just ignore the error if (err === ctx.aborter.signal.reason) { debug( - `[swap/index.vue] Ignoring error due to quote request context abort id=${vid}:${ctx.id}` + `[swap/index.vue] Ignoring error due to quote request context abort id=${ctx.id}` ); return; } From f77d9a11faf396827c8909417d08d7f8aab028e9 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Wed, 4 Sep 2024 21:43:21 -0500 Subject: [PATCH 307/375] chore: cleanup --- packages/extension/src/ui/action/views/swap/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/src/ui/action/views/swap/index.vue b/packages/extension/src/ui/action/views/swap/index.vue index a3897e6cc..cac46d9e7 100644 --- a/packages/extension/src/ui/action/views/swap/index.vue +++ b/packages/extension/src/ui/action/views/swap/index.vue @@ -609,7 +609,7 @@ const updateQuote = () => { // Abort the previous execution. Used to avoid race conditions in the UI and // rapid pointless updates in succession when multiple requests are in-flight. // AbortSignal gives the swap provider the abiltiy to cancel network requests - // and exit early when we call the context's abort controllers' abort() method. + // and exit early. updateQuoteContext.current.aborter.abort(); // Setup a new abortable context const ctx = { From 4c6aa8893283af4496ba369f840959b0e9293163 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Wed, 4 Sep 2024 22:50:21 -0500 Subject: [PATCH 308/375] fix: error message typo --- .../src/ui/action/views/swap/libs/send-transactions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts index a1633c3bd..d82cfdd6b 100644 --- a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts +++ b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts @@ -254,7 +254,7 @@ export const executeSwap = async ( let msg = (err as Error).message; const len = msg.length; if (len > 512 + 10 + len.toString().length) { - msg = `${msg.slice(0, 512)}... (${len.toString()}/512)`; + msg = `${msg.slice(0, 512)}... (512/${len.toString()})`; } throw new Error(msg); } From 6f7c81bcce19088047aea647e3f37f02370447b5 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Wed, 4 Sep 2024 23:15:27 -0500 Subject: [PATCH 309/375] chore: comments --- packages/swap/src/providers/jupiter/index.ts | 39 +++++++++++--------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 657d28d35..b0e0f6652 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -52,31 +52,35 @@ import { toBN } from "web3-utils"; * @see https://referral.jup.ag/api * @see https://github.com/TeamRaccoons/referral * - * Jupiter requires you to create a referral account. You can do this by - * visiting the Jupiter referral dashboard https://referral.jup.ag/dashboard - * and selecting "create account". + * Jupiter requires referral account. A rferral account can be created on the + * Jupiter referral dashboard https://referral.jup.ag/dashboard * * After you have a referral account (associated with your Solana address) you - * need to create token accounts for it so that it can receive referral fees - * for those tokens. This is also done via the Jupiter referral dashboard - * https://referral.jup.ag/dashboard. + * can create token accounts (ATA's) so that it can receive referral fees. + * We inject an instruction in swap transactions to create a referral fee ATA + * if the user tries to swap a token that doesn't one yet. * - * ## Steps + * ## Swap flow * * 1. Request a quote from the Jupiter swap API * 2. Request a swap transaction from the Jupiter swap API with the quote provided - * 2.5. Modify the transaction to create the referrer ATA to receive platform fees, if required - * 3. Deserialize and signt the transaction - * 4. Execute the transaction + * 3. Decompile, modify and recompile the transaction to add an instruction that + * creates the referrer ATA to receive platform fees, if required + * 4. Sign the transaction + * 5. Execute the transaction * * ## Terminology * - * - Mint: is the address of a token. - * - SPL: Solana Program Library, a collection of on-chain programs that - * - SPL Token: a token that uses the SPL program (an in-built standard Solana - * token program) to manage its state. Similar to an ERC20 token. - * - ATA: Associated Token Account, an SPL token account that is associated with - * a Solana address. In EVM this would just be your own account. + * - Mint: a mint is a unique identifier for an SPL token, typically represented by a public key. + * - SPL (Solana Program Library): A collection of on-chain programs designed to support the Solana ecosystem. + * - SPL Token: A type of token on the Solana blockchain that adheres to the standards set by SPL Token + * programs, analogous to ERC20 tokens on Ethereum. There are two main SPL Token programs: + * the original "SPL Token Program" and the updated "2022 SPL Token Program." + * - ATA (Associated Token Account): An account that holds token balances and other program-associated data + * for a specific address on Solana. ATAs are necessary to link an address with its assets, such as + * tokens. The maintenance of an ATA involves a periodic rent, deducted from its balance, which varies + * based on the data storage required. For instance, token programs typically require 165 bytes per ATA. + * An ATA that maintains at least two years' worth of rent in its balance qualifies as rent-exempt. * * [Solana 101](https://2501babe.github.io/posts/solana101.html) */ @@ -381,7 +385,8 @@ export class Jupiter extends ProviderClass { } /** - * Get a quote and swap prepare a swap transactin for the assets + * Query the Jupiter Swap API for a quote, a swap transaction, transform the swap transaction if needed + * and extract additional information like rent fees and compute budget */ private async querySwapInfo( options: getQuoteOptions, From 6007c38e90710914d102f1ec3d243059ba62fd81 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 5 Sep 2024 11:36:13 -0700 Subject: [PATCH 310/375] fix: build --- .../src/providers/solana/types/sol-network.ts | 13 ++++++------- .../src/providers/solana/ui/libs/decode-tx.ts | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/extension/src/providers/solana/types/sol-network.ts b/packages/extension/src/providers/solana/types/sol-network.ts index 8b732d2dc..6c4300f5f 100644 --- a/packages/extension/src/providers/solana/types/sol-network.ts +++ b/packages/extension/src/providers/solana/types/sol-network.ts @@ -116,10 +116,11 @@ export class SolanaNetwork extends BaseNetwork { const market = new MarketData(); marketData = await market.getMarketData([this.coingeckoID]); } + const currentPrice = marketData.length + ? marketData[0]!.current_price || 0 + : 0; const userBalance = fromBase(balance, this.decimals); - const usdBalance = new BigNumber(userBalance).times( - marketData.length ? marketData[0]!.current_price : 0 - ); + const usdBalance = new BigNumber(userBalance).times(currentPrice); const nativeAsset: AssetsType = { balance: balance, balancef: formatFloatingPointValue(userBalance).value, @@ -128,11 +129,9 @@ export class SolanaNetwork extends BaseNetwork { icon: this.icon, name: this.name_long, symbol: this.currencyName, - value: marketData.length - ? marketData[0]!.current_price.toString() - : "0", + value: marketData.length ? currentPrice.toString() : "0", valuef: formatFiatValue( - marketData.length ? marketData[0]!.current_price.toString() : "0" + marketData.length ? currentPrice.toString() : "0" ).value, contract: "", decimals: this.decimals, diff --git a/packages/extension/src/providers/solana/ui/libs/decode-tx.ts b/packages/extension/src/providers/solana/ui/libs/decode-tx.ts index 03b0d4051..8c8c8f513 100644 --- a/packages/extension/src/providers/solana/ui/libs/decode-tx.ts +++ b/packages/extension/src/providers/solana/ui/libs/decode-tx.ts @@ -130,10 +130,10 @@ const decodeTransaction = async ( res.isNegative = false; if (token.cgId) { const val = await marketData.getMarketData([token.cgId]); - res.USDval = new BigNumber(val[0]!.current_price) + res.USDval = new BigNumber(val[0]!.current_price ?? 0) .times(fromBase(res.change.toString(), res.decimals)) .toString(); - res.price = val[0]!.current_price.toString(); + res.price = (val[0]!.current_price ?? 0).toString(); } } if (token.decimals === 0) { From 34625e7f2836a4aca76e60d28dec4e7aefa7a211 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 5 Sep 2024 14:06:10 -0500 Subject: [PATCH 311/375] devop: pr review fixes --- .../ui/action/views/swap/libs/send-transactions.ts | 7 +------ .../src/ui/action/views/swap/libs/solana-gasvals.ts | 11 +++++------ .../components/swap-best-offer-block/index.vue | 2 +- packages/swap/src/common/supportedNetworks.ts | 2 +- packages/swap/src/providers/jupiter/index.ts | 1 - packages/swap/src/types/index.ts | 13 ++++++++----- 6 files changed, 16 insertions(+), 20 deletions(-) diff --git a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts index d82cfdd6b..16245db2e 100644 --- a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts +++ b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts @@ -42,7 +42,6 @@ import { } from "@solana/web3.js"; import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; import { InternalMethods } from "@/types/messenger"; -import bs58 from "bs58"; /** * Create an Activity model that can be displayed in the UI to represent @@ -212,12 +211,8 @@ export const executeSwap = async ( } // Add signature to the transaction - // (For some reason the address is hex encoded instead of base58 - // encoded so we need to transform it) tx.addSignature( - new PublicKey( - bs58.encode(Buffer.from(options.from.address.slice(2), "hex")) - ), + new PublicKey(options.network.displayAddress(options.from.address)), hexToBuffer(JSON.parse(sigRes.result!)) ); diff --git a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts index 5b180f12c..b1605bffe 100644 --- a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts +++ b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts @@ -1,7 +1,9 @@ import { GasFeeType, GasPriceTypes } from "@/providers/common/types"; import SolanaAPI from "@/providers/solana/libs/api"; import { SolanaNetwork } from "@/providers/solana/types/sol-network"; +import { fromBase } from "@enkryptcom/utils"; import { VersionedTransaction } from "@solana/web3.js"; +import BigNumber from "bignumber.js"; import { toBN } from "web3-utils"; /** @@ -24,7 +26,6 @@ export const getSolanaTransactionFees = async ( /** Base fee + priority fee + rent fees (but the rent fees seem slightly higher than expected @ 2024-09-04) */ const fee = await conn.getFeeForMessage(tx.message); if (fee.value == null) { - // TODO: handle this throw new Error( `Failed to get fee for Solana VersionedTransaction ${i}. Transaction block hash possibly expired.` ); @@ -33,15 +34,13 @@ export const getSolanaTransactionFees = async ( } // Convert from lamports to SOL - // Hope that we'll never get 64 bit floating point overflow in BN.toNumber()... - const feesumsol = feesumlamp.toNumber() * 1e-9; + const feesumsol = fromBase(feesumlamp.toString(), network.decimals); // TODO: give different fees for different priority levels return { [GasPriceTypes.REGULAR]: { - // Convert to string, cut off floating point rounding errors, trim redundant trailing 0's - nativeValue: feesumsol.toFixed(10).replace(/\.?0+$/, ""), - fiatValue: (price * feesumsol).toFixed(10).replace(/\.?0+$/, ""), + nativeValue: feesumsol, + fiatValue: new BigNumber(feesumsol).times(price).toString(), nativeSymbol: "SOL", fiatSymbol: "USD", }, diff --git a/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue b/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue index 5c95fc009..1ab72c2f9 100644 --- a/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue +++ b/packages/extension/src/ui/action/views/swap/views/swap-best-offer/components/swap-best-offer-block/index.vue @@ -67,7 +67,7 @@ Offer includes {{ $filters.formatFloatingPointValue(toReadableAdditionalFees).value }} {{ network?.currencyName.toUpperCase() }} - {{ pickedTrade.additionalNativeFeesDescription || "Bridging fee" }} + {{ "Additional native fees" }}

diff --git a/packages/swap/src/common/supportedNetworks.ts b/packages/swap/src/common/supportedNetworks.ts index 48b749c73..f1e9c6995 100644 --- a/packages/swap/src/common/supportedNetworks.ts +++ b/packages/swap/src/common/supportedNetworks.ts @@ -241,7 +241,7 @@ const NetworkDetails: Record = { }, [SupportedNetworkName.Solana]: { id: SupportedNetworkName.Solana, - decimals: 8, + decimals: 9, logoURI: "https://assets.coingecko.com/coins/images/4128/standard/solana.png", name: "Solana", diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index b0e0f6652..016fa6e11 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -629,7 +629,6 @@ export class Jupiter extends ProviderClass { .replace(/\.?0+$/, "") ), additionalNativeFees: toBN(rentFees), - additionalNativeFeesDescription: "Storage fee", provider: this.name, slippage: quote.meta.slippage, fee: feePercentage, diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index e4e3b75eb..5c02e3397 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -195,7 +195,10 @@ export interface ProviderQuoteResponse { toTokenAmount: BN; fromTokenAmount: BN; totalGaslimit: number; - // ? What is this ? + /** + * Additional native currency that has to be paid for the transaction + * For example Changelly bridging fees, Solana rent fees + */ additionalNativeFees: BN; provider: ProviderName; quote: SwapQuote; @@ -215,11 +218,11 @@ export interface ProviderSwapResponse { transactions: SwapTransaction[]; toTokenAmount: BN; fromTokenAmount: BN; - // Additional native currency that has to be paid for the transaction - // For example Changelly bridging fees, Solana rent fees + /** + * Additional native currency that has to be paid for the transaction + * For example Changelly bridging fees, Solana rent fees + */ additionalNativeFees: BN; - /** Description of `additionalNativeFees` for the swap UI. default: "Bridging fee" */ - additionalNativeFeesDescription?: string; provider: ProviderName; slippage: string; /** Percentage fee 0-1 (100 * basis points) */ From b81f6ba0cfadae56d8a76f8d6cd998ff10fcea12 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 5 Sep 2024 12:18:25 -0700 Subject: [PATCH 312/375] devop: lets wait a day --- packages/extension/src/providers/ethereum/networks/matic.ts | 6 +++--- .../extension/src/providers/ethereum/networks/maticzk.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/extension/src/providers/ethereum/networks/matic.ts b/packages/extension/src/providers/ethereum/networks/matic.ts index 9335d4b26..40a53734d 100644 --- a/packages/extension/src/providers/ethereum/networks/matic.ts +++ b/packages/extension/src/providers/ethereum/networks/matic.ts @@ -13,11 +13,11 @@ const maticOptions: EvmNetworkOptions = { blockExplorerAddr: "https://polygonscan.com/address/[[address]]", chainID: "0x89", isTestNetwork: false, - currencyName: "MATIC", - currencyNameLong: "Polygon Matic", + currencyName: "POL", + currencyNameLong: "Polygon POL", node: "wss://nodes.mewapi.io/ws/matic", icon: require("./icons/matic.svg"), - coingeckoID: "matic-network", + coingeckoID: "polygon-ecosystem-token", coingeckoPlatform: CoingeckoPlatform.Matic, NFTHandler: shNFTHandler, assetsInfoHandler, diff --git a/packages/extension/src/providers/ethereum/networks/maticzk.ts b/packages/extension/src/providers/ethereum/networks/maticzk.ts index 07a6e45db..e250b1178 100644 --- a/packages/extension/src/providers/ethereum/networks/maticzk.ts +++ b/packages/extension/src/providers/ethereum/networks/maticzk.ts @@ -13,11 +13,11 @@ const maticOptions: EvmNetworkOptions = { blockExplorerAddr: "https://zkevm.polygonscan.com/address/[[address]]", chainID: "0x44d", isTestNetwork: false, - currencyName: "MATIC", - currencyNameLong: "Polygon Matic", + currencyName: "POL", + currencyNameLong: "Polygon POL", node: "wss://nodes.mewapi.io/ws/maticzk", icon: require("./icons/matic.svg"), - coingeckoID: "matic-network", + coingeckoID: "polygon-ecosystem-token", coingeckoPlatform: CoingeckoPlatform.MaticZK, NFTHandler: shNFTHandler, assetsInfoHandler, From 372735435cf250020dd8638d6132a42012fadde5 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 5 Sep 2024 21:51:53 -0500 Subject: [PATCH 313/375] feat: add support for changelly on solana --- .../src/ui/action/views/swap/index.vue | 22 +++---- .../views/swap/libs/send-transactions.ts | 4 +- packages/swap/src/index.ts | 5 +- .../swap/src/providers/changelly/index.ts | 10 +++- .../swap/src/providers/changelly/supported.ts | 20 +++++++ packages/swap/src/providers/jupiter/index.ts | 59 ++++++++++++------- 6 files changed, 84 insertions(+), 36 deletions(-) diff --git a/packages/extension/src/ui/action/views/swap/index.vue b/packages/extension/src/ui/action/views/swap/index.vue index cac46d9e7..6bb673301 100644 --- a/packages/extension/src/ui/action/views/swap/index.vue +++ b/packages/extension/src/ui/action/views/swap/index.vue @@ -612,12 +612,12 @@ const updateQuote = () => { // and exit early. updateQuoteContext.current.aborter.abort(); // Setup a new abortable context - const ctx = { + const context = { id: updateQuoteContext.current.id + 1, aborter: new AbortController(), }; - updateQuoteContext.current = ctx; - debug(`[swap/index.vue] Starting quote update id=${ctx.id}`); + updateQuoteContext.current = context; + debug(`[swap/index.vue] Starting quote update id=${context.id}`); swap .getQuotes( @@ -630,31 +630,33 @@ const updateQuote = () => { toToken: toToken.value!, toAddress: toAddressInputMeta.value.displayAddress(address.value), }, - { signal: ctx.aborter.signal } + { signal: context.aborter.signal } ) .then((quotes) => { // Overidden by new update, drop these quotes - if (ctx.aborter.signal.aborted) { + if (context.aborter.signal.aborted) { debug( - `[swap/index.vue] Dropping quotes due to new update id=${ctx.id}` + `[swap/index.vue] Dropping quotes due to new update id=${context.id}` ); return; } if (quotes.length) { - debug(`[swap/index.vue] Found ${quotes.length} quotes id=${ctx.id}`); + debug( + `[swap/index.vue] Found ${quotes.length} quotes id=${context.id}` + ); pickBestQuote(fromRawAmount, quotes); } else { - debug(`[swap/index.vue] No quotes id=${ctx.id}`); + debug(`[swap/index.vue] No quotes id=${context.id}`); isFindingRate.value = false; errors.value.noProviders = true; } }) .catch((err) => { // Context aborted, just ignore the error - if (err === ctx.aborter.signal.reason) { + if (err === context.aborter.signal.reason) { debug( - `[swap/index.vue] Ignoring error due to quote request context abort id=${ctx.id}` + `[swap/index.vue] Ignoring error due to quote request context abort id=${context.id}` ); return; } diff --git a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts index 16245db2e..dab3fa3a2 100644 --- a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts +++ b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts @@ -248,8 +248,8 @@ export const executeSwap = async ( // Trim the error so it doesn't break the UI by being too huge let msg = (err as Error).message; const len = msg.length; - if (len > 512 + 10 + len.toString().length) { - msg = `${msg.slice(0, 512)}... (512/${len.toString()})`; + if (len > 128 + 10 + len.toString().length) { + msg = `${msg.slice(0, 128)}... (128/${len.toString()})`; } throw new Error(msg); } diff --git a/packages/swap/src/index.ts b/packages/swap/src/index.ts index d9b165204..9b7d508ff 100644 --- a/packages/swap/src/index.ts +++ b/packages/swap/src/index.ts @@ -114,7 +114,10 @@ class Swap extends EventEmitter { switch (this.network) { case SupportedNetworkName.Solana: // Solana - this.providers = [new Jupiter(this.api as Web3Solana, this.network)]; + this.providers = [ + new Jupiter(this.api as Web3Solana, this.network), + new Changelly(this.network), + ]; break; default: // EVM diff --git a/packages/swap/src/providers/changelly/index.ts b/packages/swap/src/providers/changelly/index.ts index 91f39e2de..7973e99ab 100644 --- a/packages/swap/src/providers/changelly/index.ts +++ b/packages/swap/src/providers/changelly/index.ts @@ -65,16 +65,23 @@ class Changelly extends ProviderClass { async init(): Promise { if (!Changelly.isSupported(this.network)) return; this.changellyList = await fetch(CHANGELLY_LIST).then((res) => res.json()); + + /** Mapping of changelly network name -> enkrypt network name */ const changellyToNetwork: Record = {}; Object.keys(supportedNetworks).forEach((net) => { changellyToNetwork[supportedNetworks[net].changellyName] = net as unknown as SupportedNetworkName; }); + const supportedChangellyNames = Object.values(supportedNetworks).map( (s) => s.changellyName ); + this.changellyList.forEach((cur) => { - if (!supportedChangellyNames.includes(cur.blockchain)) return; + // Must be a supported token + if (!supportedChangellyNames.includes(cur.blockchain)) { + return; + } if ( cur.enabledFrom && cur.fixRateEnabled && @@ -125,6 +132,7 @@ class Changelly extends ProviderClass { } private changellyRequest(method: string, params: any): Promise { + // TODO: timeoutes & retries? return fetch(`${BASE_URL}`, { method: "POST", body: JSON.stringify({ diff --git a/packages/swap/src/providers/changelly/supported.ts b/packages/swap/src/providers/changelly/supported.ts index ac8d7fe4d..69b5099e3 100644 --- a/packages/swap/src/providers/changelly/supported.ts +++ b/packages/swap/src/providers/changelly/supported.ts @@ -1,6 +1,14 @@ +import { PublicKey } from "@solana/web3.js"; import { isPolkadotAddress, isEVMAddress } from "../../utils/common"; import { SupportedNetworkName } from "../../types"; +/** + * Blockchain names: + * + * ```sh + * curl -sL https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/changelly.json | jq --raw-output '.[].blockchain' | sort | uniq -c | sort -nr + * ``` + */ const supportedNetworks: { [key in SupportedNetworkName]?: { changellyName: string; @@ -50,6 +58,18 @@ const supportedNetworks: { [SupportedNetworkName.Dogecoin]: { changellyName: "doge", }, + [SupportedNetworkName.Solana]: { + changellyName: "solana", + isAddress: (address: string) => { + try { + // eslint-disable-next-line no-new + new PublicKey(address); + return Promise.resolve(true); + } catch (err) { + return Promise.resolve(false); + } + }, + }, }; export default supportedNetworks; diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 016fa6e11..e71032bf1 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -410,7 +410,7 @@ export class Jupiter extends ProviderClass { const referrerPubkey = new PublicKey(feeConf.referrer); - /** Jupiter API requires an integer for bps so we must round */ + /** Jupiter API requires an integer for fee bps so we must round */ const feeBps = Math.round(100 * feeConf.fee); const fromPubkey = new PublicKey(options.fromAddress); @@ -449,6 +449,7 @@ export class Jupiter extends ProviderClass { referrerATAPubkey ); + /** Jupiter API requires an integer for slippage bps so we must round */ const slippageBps = Math.round( 100 * parseFloat(meta.slippage || DEFAULT_SLIPPAGE) ); @@ -458,7 +459,6 @@ export class Jupiter extends ProviderClass { srcMint, dstMint, amount: BigInt(options.amount.toString(10)), - // Integer so must round slippageBps, referralFeeBps: feeBps, }, @@ -490,7 +490,7 @@ export class Jupiter extends ProviderClass { ); debug( - `[Jupiter.querySwapInfo] Referrer ATA does not exist. Updating transaction with instruction to create it.` + + `[JupiterSwapProvider.querySwapInfo] Referrer ATA does not exist. Updating transaction with instruction to create it.` + ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + ` Rent: ${rentFees} lamports` ); @@ -521,7 +521,7 @@ export class Jupiter extends ProviderClass { ); if (walletDstMintATAExists) { debug( - `[Jupiter.querySwapInfo] Wallet destination mint ATA already exists, no need to record additional rent fees.` + + `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA already exists, no need to record additional rent fees.` + ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + ` Destination mint: ${dstMint.toBase58()}` ); @@ -530,7 +530,7 @@ export class Jupiter extends ProviderClass { SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES ); debug( - `[Jupiter.querySwapInfo] Wallet destination mint ATA does not exist, it will be created by the swap transaction.` + + `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA does not exist, it will be created by the swap transaction.` + ` Adding ATA rent to extra transaction fees.` + ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + ` Destination mint: ${dstMint.toBase58()},` + @@ -556,6 +556,13 @@ export class Jupiter extends ProviderClass { meta: QuoteMetaOptions, context?: { signal?: AbortSignal } ): Promise { + if (options.toToken.networkInfo.name !== SupportedNetworkName.Solana) { + debug( + `[JupiterSwapProvider.getQuote] ignoring quote request to network ${options.toToken.networkInfo.name}, cross network swaps not supported` + ); + return null; + } + const { jupiterQuote, rentFees, computeBudget, feePercentage } = await this.querySwapInfo(options, meta, context); @@ -566,10 +573,10 @@ export class Jupiter extends ProviderClass { // 4. Rent for ATA accounts that may need to be created; the referral fee account and mint account debug( - `[Jupiter.getQuote] Quote inAmount: ${jupiterQuote.inAmount} ${options.fromToken.symbol}` + `[JupiterSwapProvider.getQuote] Quote inAmount: ${jupiterQuote.inAmount} ${options.fromToken.symbol}` ); debug( - `[Jupiter.getQuote] Quote outAmount: ${jupiterQuote.outAmount} ${options.toToken.symbol}` + `[JupiterSwapProvider.getQuote] Quote outAmount: ${jupiterQuote.outAmount} ${options.toToken.symbol}` ); const result: ProviderQuoteResponse = { @@ -614,10 +621,10 @@ export class Jupiter extends ProviderClass { }; debug( - `[Jupiter.getSwap] Quote inAmount: ${jupiterQuote.inAmount} ${quote.options.fromToken.symbol}` + `[JupiterSwapProvider.getSwap] Quote inAmount: ${jupiterQuote.inAmount} ${quote.options.fromToken.symbol}` ); debug( - `[Jupiter.getSwap] Quote outAmount: ${jupiterQuote.outAmount} ${quote.options.toToken.symbol}` + `[JupiterSwapProvider.getSwap] Quote outAmount: ${jupiterQuote.outAmount} ${quote.options.toToken.symbol}` ); const result: ProviderSwapResponse = { @@ -743,7 +750,7 @@ async function getJupiterTokens(context?: { if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying debug( - `[Jupiter.getJupiterTokens] Retrying after ${backoff[backoffi]}ms...` + `[JupiterSwapProvider.getJupiterTokens] Retrying after ${backoff[backoffi]}ms...` ); await new Promise((res, rej) => { function onTimeout() { @@ -785,7 +792,7 @@ async function getJupiterTokens(context?: { try { debug( - `[getJupiterTokens] Initiating HTTP request for Jupiter tokens ${url}` + `[JupiterSwapProvider.getJupiterTokens] Initiating HTTP request for Jupiter tokens ${url}` ); const res = await fetch(url, { signal: aborter.signal, @@ -832,7 +839,7 @@ async function getJupiterTokens(context?: { if (signal?.aborted) throw signal.reason; if (failed) throw err; debug( - `[getJupiterTokens] Failed to get Jupiter tokens on attempt ${ + `[JupiterSwapProvider.getJupiterTokens] Failed to get Jupiter tokens on attempt ${ backoffi + 1 }/${backoff.length}: ${String(err)}` ); @@ -934,7 +941,7 @@ async function getJupiterQuote( if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying debug( - `[getJupiterQuote] Retrying ${url} after ${backoff[backoffi]}ms...` + `[JupiterSwapProvider.getJupiterQuote] Retrying ${url} after ${backoff[backoffi]}ms...` ); await new Promise((res, rej) => { function onTimeout() { @@ -976,7 +983,7 @@ async function getJupiterQuote( try { debug( - `[getJupiterQuote] Initiating HTTP request for Jupiter quote ${url}` + `[JupiterSwapProvider.getJupiterQuote] Initiating HTTP request for Jupiter quote ${url}` ); const res = await fetch(url, { signal: aborter.signal, @@ -1088,7 +1095,9 @@ async function getJupiterSwap( if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - debug(`[getJupiterSwap] Retrying ${url} after ${backoff[backoffi]}ms...`); + debug( + `[JupiterSwapProvider.getJupiterSwap] Retrying ${url} after ${backoff[backoffi]}ms...` + ); await new Promise((res, rej) => { function onTimeout() { cleanupSleep(); @@ -1128,7 +1137,9 @@ async function getJupiterSwap( }; try { - debug(`[getJupiterSwap] Initiating HTTP request for Jupiter swap ${url}`); + debug( + `[JupiterSwapProvider.getJupiterSwap] Initiating HTTP request for Jupiter swap ${url}` + ); const res = await fetch(url, { signal: aborter.signal, method: "POST", @@ -1179,7 +1190,7 @@ async function getJupiterSwap( } catch (err) { if (failed) throw err; debug( - `[getJupiterSwap] Failed to get Jupiter swap on attempt ${ + `[JupiterSwapProvider.getJupiterSwap] Failed to get Jupiter swap on attempt ${ backoffi + 1 }/${backoff.length}: ${String(err)}` ); @@ -1377,7 +1388,7 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( `Failed to get address lookup table for ${lookup.accountKey}` ); debug( - `[updateSwapTransactionToCreateJupiterReferrerATA] Fetching lookup account ${ + `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Fetching lookup account ${ i + 1 }. ${lookup.accountKey.toBase58()}` ); @@ -1408,7 +1419,7 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( default: { // insert our instruction here & continue debug( - `[updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` + `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` ); inserted = true; decompiledTransactionMessage.instructions.splice(i, 0, instruction); @@ -1420,13 +1431,15 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( if (!inserted) { // If there were no compute budget instructions then just add it at the start debug( - `[updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` + `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` ); decompiledTransactionMessage.instructions.unshift(instruction); } // Switch to using this modified transaction - debug(`Re-compiling transaction`); + debug( + `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Re-compiling transaction` + ); const modifiedTx = new VersionedTransaction( decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts) ); @@ -1445,7 +1458,9 @@ async function getTokenProgramOfMint( conn: Connection, mint: PublicKey ): Promise { - debug(`[getTokenProgramOfMint] Checking mint account of ${mint.toBase58()}`); + debug( + `[JupiterSwapProvider.getTokenProgramOfMint] Checking mint account of ${mint.toBase58()}` + ); const srcMintAcc = await conn.getAccountInfo(mint); if (srcMintAcc == null) { From 296fd35f8d129c7aa05aadb5d62a6eca36a21aa6 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Fri, 6 Sep 2024 14:07:38 -0500 Subject: [PATCH 314/375] wip: adding rango swap to solana --- packages/swap/src/common/estimateGasList.ts | 4 +- packages/swap/src/index.ts | 1 + .../swap/src/providers/changelly/index.ts | 4 +- packages/swap/src/providers/jupiter/index.ts | 67 +-- packages/swap/src/providers/oneInch/index.ts | 4 +- packages/swap/src/providers/paraswap/index.ts | 4 +- packages/swap/src/providers/rango/index.ts | 542 +++++++++++++----- packages/swap/src/providers/rango/types.ts | 23 +- packages/swap/src/providers/zerox/index.ts | 4 +- packages/swap/src/types/index.ts | 1 + packages/swap/src/utils/solana.ts | 67 +++ 11 files changed, 488 insertions(+), 233 deletions(-) create mode 100644 packages/swap/src/utils/solana.ts diff --git a/packages/swap/src/common/estimateGasList.ts b/packages/swap/src/common/estimateGasList.ts index 23512576c..237a4c7d4 100644 --- a/packages/swap/src/common/estimateGasList.ts +++ b/packages/swap/src/common/estimateGasList.ts @@ -100,7 +100,7 @@ const useStandardEstimate = ( }) .catch(() => null); -const estimateGasList = ( +const estimateEVMGasList = ( transactions: EVMTransaction[], network: SupportedNetworkName ): Promise<{ @@ -155,4 +155,4 @@ const estimateGasList = ( .catch(() => null); }; -export default estimateGasList; +export default estimateEVMGasList; diff --git a/packages/swap/src/index.ts b/packages/swap/src/index.ts index 9b7d508ff..b1191c22b 100644 --- a/packages/swap/src/index.ts +++ b/packages/swap/src/index.ts @@ -116,6 +116,7 @@ class Swap extends EventEmitter { // Solana this.providers = [ new Jupiter(this.api as Web3Solana, this.network), + new Rango(this.api as Web3Solana, this.network), new Changelly(this.network), ]; break; diff --git a/packages/swap/src/providers/changelly/index.ts b/packages/swap/src/providers/changelly/index.ts index 7973e99ab..ee782fc6a 100644 --- a/packages/swap/src/providers/changelly/index.ts +++ b/packages/swap/src/providers/changelly/index.ts @@ -33,7 +33,7 @@ import { import { getTransfer } from "../../utils/approvals"; import supportedNetworks from "./supported"; import { ChangellyCurrency } from "./types"; -import estimateGasList from "../../common/estimateGasList"; +import estimateEVMGasList from "../../common/estimateGasList"; const BASE_URL = "https://partners.mewapi.io/changelly-v2"; @@ -316,7 +316,7 @@ class Changelly extends ProviderClass { to: result.payinAddress, value: quote.options.amount.toString(), }); - const accurateGasEstimate = await estimateGasList( + const accurateGasEstimate = await estimateEVMGasList( [transaction], this.network ); diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index e71032bf1..6071a6166 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -2,9 +2,7 @@ import { NetworkNames } from "@enkryptcom/types"; import { - AccountMeta, AddressLookupTableAccount, - ComputeBudgetInstruction, ComputeBudgetProgram, Connection, PublicKey, @@ -38,6 +36,7 @@ import { TokenNetworkType, } from "@src/types"; import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "@src/utils/approvals"; +import { extractComputeBudget } from "@src/utils/solana"; import { toBN } from "web3-utils"; /** @@ -510,7 +509,7 @@ export class Jupiter extends ProviderClass { // Will the destination token ATA for the swapper need to be created? const walletDstMintATAPubkey = - await getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( + getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( fromPubkey, dstMint, tokenProgramId @@ -1485,72 +1484,16 @@ async function getTokenProgramOfMint( /** * Get the SPL token ATA pubkey for a wallet with a mint */ -async function getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( +function getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( wallet: PublicKey, mint: PublicKey, /** Either the SPL token program or the 2022 SPL token program */ tokenProgramId: PublicKey -): Promise { +): PublicKey { const SEED = [wallet.toBuffer(), tokenProgramId.toBuffer(), mint.toBuffer()]; - const [associatedTokenAddress] = await PublicKey.findProgramAddress( + const [associatedTokenAddress] = PublicKey.findProgramAddressSync( SEED, ASSOCIATED_TOKEN_PROGRAM_ID ); return associatedTokenAddress; } - -/** - * @see https://solana.com/docs/core/fees#prioritization-fees - * - * > Transactions can only contain one of each type of compute budget - * instruction. Duplicate instruction types will result in an - * TransactionError::DuplicateInstruction error, and ultimately - * transaction failure. - */ -function extractComputeBudget(tx: VersionedTransaction): undefined | number { - // extract the compute budget - let computeBudget: undefined | number; - - instructionLoop: for ( - let i = 0, len = tx.message.compiledInstructions.length; - i < len; - i++ - ) { - const instr = tx.message.compiledInstructions[i]; - const program = tx.message.staticAccountKeys[instr.programIdIndex]; - if (!ComputeBudgetProgram.programId.equals(program)) continue; - - const keys = instr.accountKeyIndexes.map( - (accountKeyIndex): AccountMeta => ({ - pubkey: tx.message.staticAccountKeys[accountKeyIndex], - isSigner: tx.message.isAccountSigner(accountKeyIndex), - isWritable: tx.message.isAccountWritable(accountKeyIndex), - }) - ); - - // Decompile the instruction - const instruction = new TransactionInstruction({ - keys, - programId: program, - data: Buffer.from(instr.data), - }); - - const type = ComputeBudgetInstruction.decodeInstructionType(instruction); - switch (type) { - case "SetComputeUnitLimit": { - // Compute limit - const command = - ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction); - computeBudget = command.units; - break instructionLoop; - } - // You can use this to get the priorty fee - // case "SetComputeUnitPrice": - default: /** noop */ - break; - } - } - - // (default of 200_000 from Google) - return computeBudget ?? 200_000; -} diff --git a/packages/swap/src/providers/oneInch/index.ts b/packages/swap/src/providers/oneInch/index.ts index b49bc9fd4..6f0709e83 100644 --- a/packages/swap/src/providers/oneInch/index.ts +++ b/packages/swap/src/providers/oneInch/index.ts @@ -31,7 +31,7 @@ import { getAllowanceTransactions, TOKEN_AMOUNT_INFINITY_AND_BEYOND, } from "../../utils/approvals"; -import estimateGasList from "../../common/estimateGasList"; +import estimateEVMGasList from "../../common/estimateGasList"; import { isEVMAddress } from "../../utils/common"; export const ONEINCH_APPROVAL_ADDRESS = @@ -221,7 +221,7 @@ class OneInch extends ProviderClass { }); if (accurateEstimate) { - const accurateGasEstimate = await estimateGasList( + const accurateGasEstimate = await estimateEVMGasList( transactions, this.network ); diff --git a/packages/swap/src/providers/paraswap/index.ts b/packages/swap/src/providers/paraswap/index.ts index 6c297836d..cc9cd808a 100644 --- a/packages/swap/src/providers/paraswap/index.ts +++ b/packages/swap/src/providers/paraswap/index.ts @@ -35,7 +35,7 @@ import { getAllowanceTransactions, TOKEN_AMOUNT_INFINITY_AND_BEYOND, } from "../../utils/approvals"; -import estimateGasList from "../../common/estimateGasList"; +import estimateEVMGasList from "../../common/estimateGasList"; import { isEVMAddress } from "../../utils/common"; export const PARASWAP_APPROVAL_ADDRESS = @@ -223,7 +223,7 @@ class ParaSwap extends ProviderClass { type: TransactionType.evm, }); if (accurateEstimate) { - const accurateGasEstimate = await estimateGasList( + const accurateGasEstimate = await estimateEVMGasList( transactions, this.network ); diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index 1bfa34105..6b7d7a1de 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -10,6 +10,8 @@ import { RoutingResultType, TransactionType as RangoTransactionType, } from "rango-sdk-basic"; +import { Connection, VersionedTransaction } from "@solana/web3.js"; +import { extractComputeBudget } from "@src/utils/solana"; import { EVMTransaction, getQuoteOptions, @@ -36,9 +38,9 @@ import { GAS_LIMITS, NATIVE_TOKEN_ADDRESS, } from "../../configs"; -import { RangoSwapResponse } from "./types"; +import { RangoNetworkedTransactions, RangoSwapResponse } from "./types"; import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "../../utils/approvals"; -import estimateGasList from "../../common/estimateGasList"; +import estimateEVMGasList from "../../common/estimateGasList"; import { isEVMAddress } from "../../utils/common"; const RANGO_PUBLIC_API_KEY = "ee7da377-0ed8-4d42-aaf9-fa978a32b18d"; @@ -86,6 +88,10 @@ const supportedNetworks: { chainId: "1284", name: "MOONBEAM", }, + [SupportedNetworkName.Solana]: { + chainId: "900", // Doesn't match with Rango, their chainId value for this is "mainnet-beta" + name: "SOLANA", + }, }; class Rango extends ProviderClass { @@ -93,7 +99,7 @@ class Rango extends ProviderClass { network: SupportedNetworkName; - web3eth: Web3Eth; + web3: Web3Eth | Connection; name: ProviderName; @@ -105,11 +111,11 @@ class Rango extends ProviderClass { transactionsStatus: { hash: string; status: RangoTransactionStatus }[]; - constructor(web3eth: Web3Eth, network: SupportedNetworkName) { + constructor(web3: Web3Eth | Connection, network: SupportedNetworkName) { super(); this.network = network; this.tokenList = []; - this.web3eth = web3eth; + this.web3 = web3; this.name = ProviderName.rango; this.fromTokens = {}; this.toTokens = {}; @@ -117,40 +123,50 @@ class Rango extends ProviderClass { this.transactionsStatus = []; } - init(tokenList?: TokenType[]): Promise { - return rangoClient - .meta({ - excludeNonPopulars: true, - transactionTypes: [RangoTransactionType.EVM], - }) - .then((resMeta) => { - this.rangoMeta = resMeta; - const { blockchains, tokens } = resMeta; - if (!Rango.isSupported(this.network, blockchains)) return; - tokenList?.forEach((t) => { - const tokenSupport = tokens.find( - (token) => token.address === t.address - ); - if (this.isNativeToken(t.address) || tokenSupport) { - this.fromTokens[t.address] = t; - } - }); - }); + async init(tokenList?: TokenType[]): Promise { + (window as any).rango = this; + const resMeta = await rangoClient.meta({ + excludeNonPopulars: true, + transactionTypes: [RangoTransactionType.EVM, RangoTransactionType.SOLANA], + }); + this.rangoMeta = resMeta; + const { blockchains, tokens } = resMeta; + if (!Rango.isSupported(this.network, blockchains)) { + return; + } + tokenList?.forEach((t) => { + const tokenSupport = tokens.find((token) => token.address === t.address); + if (this.isNativeToken(t.address) || tokenSupport) { + this.fromTokens[t.address] = t; + } + }); } static isSupported( network: SupportedNetworkName, blockchains: BlockchainMeta[] ) { - if (!Object.keys(supportedNetworks).includes(network as unknown as string)) + if ( + !Object.keys(supportedNetworks).includes(network as unknown as string) + ) { return false; + } if (blockchains.length) { const { chainId } = Object.entries(supportedNetworks).find( (chain) => chain[0] === (network as unknown as string) )[1]; - return !!blockchains.find( - (chain: BlockchainMeta) => Number(chain.chainId) === Number(chainId) + const enabled = !!blockchains.find( + // Sometimes Rango chainId will be a number, sometimes it'll be something else + // for example they use "mainnet-beta" for Solana but for most (all?) EVM it + // has an 0x prefixed hex number + (chain: BlockchainMeta) => { + if (Number(chain.chainId) === Number(chainId)) return true; + if (chain.name === "SOLANA" && chain.chainId === "mainnet-beta") + return true; + return false; + } )?.enabled; + return enabled; } return true; } @@ -197,7 +213,6 @@ class Rango extends ProviderClass { * For cross-chain tokens like Ethereum (ETH) on the Binance Smart Chain (BSC) network, * it returns the corresponding symbol like WETH. */ - private getSymbol(token: TokenType) { const { tokens } = this.rangoMeta; if (this.isNativeToken(token.address)) return token.symbol; @@ -219,12 +234,16 @@ class Rango extends ProviderClass { }); } - private getRangoSwap( + private async getRangoSwap( options: getQuoteOptions, meta: QuoteMetaOptions, accurateEstimate: boolean ): Promise { const { blockchains } = this.rangoMeta; + + // Determine whether Enkrypt + Rango supports this swap + + // Do we support Rango on this network? if ( !Rango.isSupported( options.toToken.networkInfo.name as SupportedNetworkName, @@ -233,22 +252,63 @@ class Rango extends ProviderClass { !Rango.isSupported(this.network, blockchains) ) return Promise.resolve(null); + + // Does Rango support these tokens? const feeConfig = FEE_CONFIGS[this.name][meta.walletIdentifier]; - const fromBlockchain = blockchains.find( - (chain) => + + /** Source token Rango blockchain name */ + const fromBlockchain = blockchains.find((chain) => { + // Chain id matches + if ( Number(chain.chainId) === Number(supportedNetworks[this.network].chainId) - )?.name; - const toBlockchain = blockchains.find( - (chain) => + ) + return true; + // It's Solana + if ( + this.network === SupportedNetworkName.Solana && + chain.name === "SOLANA" && + chain.chainId === "mainnet-beta" + ) + return true; + // No match + return false; + })?.name; + + /** Destination token Rango blockchain name */ + const toBlockchain = blockchains.find((chain) => { + // Chain id matchecs + if ( Number(chain.chainId) === Number(supportedNetworks[options.toToken.networkInfo.name].chainId) - )?.name; + ) + return true; + // It's Solana + if ( + options.toToken.networkInfo.name === SupportedNetworkName.Solana && + chain.name === "SOLANA" && + chain.chainId === "mainnet-beta" + ) + return true; + // No match + return false; + })?.name; + const fromTokenAddress = options.fromToken.address; const toTokenAddress = options.toToken.address; + + /** Source token symbol */ const fromSymbol = this.getSymbol(options.fromToken); + + /** Destination token symbol */ const toSymbol = this.getSymbol(options.toToken); + + // If we can't get symbols for the tokens then we don't support them if (!fromSymbol || !toSymbol) return Promise.resolve(null); + + // Enkrypt & Rango both likely support this swap (pair & networks) + + // Request a swap transaction from Rango for the pair & networks const params: SwapRequest = { from: { address: !this.isNativeToken(fromTokenAddress) @@ -270,171 +330,335 @@ class Rango extends ProviderClass { referrerAddress: feeConfig?.referrer || undefined, disableEstimate: true, }; - return rangoClient.swap(params).then(async (response) => { - if (response.error || response.resultType !== RoutingResultType.OK) { - console.error(response.error); - return Promise.resolve(null); + + const rangoSwapResponse = await rangoClient.swap(params); + + if ( + rangoSwapResponse.error || + rangoSwapResponse.resultType !== RoutingResultType.OK + ) { + // Rango experienced some kind of error or is unable to route the swap + console.error(rangoSwapResponse.error); + return Promise.resolve(null); + } + + // We have a swap transaction provided by Rango that can be executed + + // Note additional routing fees + let additionalNativeFees = toBN(0); + rangoSwapResponse.route.fee.forEach((f) => { + if ( + !f.token.address && + f.expenseType === "FROM_SOURCE_WALLET" && + f.name !== "Network Fee" + ) { + additionalNativeFees = additionalNativeFees.add(toBN(f.amount)); } - const tx = response.tx as RangoEvmTransaction; - const transactions: EVMTransaction[] = []; - if (!this.isNativeToken(options.fromToken.address) && tx.approveTo) { - const approvalTxs: EVMTransaction[] = [ - { + }); + + // Fill in gas values, add approval transactions, etc + let networkTransactions: RangoNetworkedTransactions; + + switch (rangoSwapResponse.tx?.type) { + // Process Rango swap Solana transaction + case RangoTransactionType.SOLANA: { + let versionedTransaction: VersionedTransaction; + if (rangoSwapResponse.tx.serializedMessage == null) { + // TODO: when and why does this happen? + throw new Error( + `Rango did not return a serialized message for the Solana transaction` + ); + } + switch (rangoSwapResponse.tx.txType) { + case "VERSIONED": { + versionedTransaction = VersionedTransaction.deserialize( + new Uint8Array(rangoSwapResponse.tx.serializedMessage) + ); + break; + } + case "LEGACY": { + // TODO: does this work? versionedTransaction.version has type `'legacy' | 0` so maybe? + versionedTransaction = VersionedTransaction.deserialize( + new Uint8Array(rangoSwapResponse.tx.serializedMessage) + ); + break; + } + default: + rangoSwapResponse.tx.txType satisfies never; + throw new Error( + `Unhandled Rango Solana transaction type: ${rangoSwapResponse.tx.txType}` + ); + } + + networkTransactions = { + type: NetworkType.Solana, + transactions: [ + { + type: TransactionType.solana, + from: rangoSwapResponse.tx.from, + // TODO: is this right? + to: options.toToken.address, + serialized: Buffer.from( + versionedTransaction.serialize() + ).toString("base64"), + }, + ], + }; + break; + } + + // Process Rango swap EVM transaction + case RangoTransactionType.EVM: { + const transactions: EVMTransaction[] = []; + + // TODO: handle Solana transactions + const tx = rangoSwapResponse.tx as RangoEvmTransaction; + if (!this.isNativeToken(options.fromToken.address) && tx.approveTo) { + // The user needss to approve Rango to swap tokens on their behalf + const approvalTx: EVMTransaction = { from: tx.from, data: tx.approveData, gasLimit: GAS_LIMITS.approval, to: tx.approveTo, value: tx.value || "0x0", type: TransactionType.evm, - }, - ]; - transactions.push(...approvalTxs); + }; + transactions.push(approvalTx); + } + + // Stage the swap transaction + transactions.push({ + from: options.fromAddress, + gasLimit: tx.gasLimit || GAS_LIMITS.swap, + to: tx.txTo, + value: numberToHex(tx.value), + data: tx.txData, + type: TransactionType.evm, + }); + + if (accurateEstimate) { + // Get accurate gas limits for each transactions + const accurateGasEstimate = await estimateEVMGasList( + transactions, + this.network + ); + if (accurateGasEstimate) { + // Something went wrong estimating gas value, bail on the swap request + if (accurateGasEstimate.isError) return null; + // Update each transaction with their accurate gas limit + transactions.forEach((transaction, idx) => { + transaction.gasLimit = accurateGasEstimate.result[idx]; + }); + } + } + + networkTransactions = { type: NetworkType.EVM, transactions }; + break; } - transactions.push({ - from: options.fromAddress, - gasLimit: tx.gasLimit || GAS_LIMITS.swap, - to: tx.txTo, - value: numberToHex(tx.value), - data: tx.txData, - type: TransactionType.evm, - }); - if (accurateEstimate) { - const accurateGasEstimate = await estimateGasList( - transactions, - this.network + case undefined: + case null: { + throw new Error(`Rango did not return a transaction type`); + } + + default: { + throw new Error( + `Unhandled Rango transaction type: ${rangoSwapResponse.tx.type}` ); - if (accurateGasEstimate) { - if (accurateGasEstimate.isError) return null; - transactions.forEach((transaction, idx) => { - transaction.gasLimit = accurateGasEstimate.result[idx]; - }); - } } - let additionalNativeFees = toBN(0); - response.route.fee.forEach((f) => { - if ( - !f.token.address && - f.expenseType === "FROM_SOURCE_WALLET" && - f.name !== "Network Fee" - ) { - additionalNativeFees = additionalNativeFees.add(toBN(f.amount)); - } - }); - return { - transactions, - toTokenAmount: toBN(response.route.outputAmount), - fromTokenAmount: toBN(options.amount.toString()), - additionalNativeFees, - requestId: response.requestId, - }; - }); + } + + const result: RangoSwapResponse = { + networkTransactions, + toTokenAmount: toBN(rangoSwapResponse.route.outputAmount), + fromTokenAmount: toBN(options.amount.toString()), + additionalNativeFees, + requestId: rangoSwapResponse.requestId, + }; + + return result; } - getQuote( + async getQuote( options: getQuoteOptions, meta: QuoteMetaOptions ): Promise { - return this.getRangoSwap(options, meta, false).then(async (res) => { - if (!res) return null; - const response: ProviderQuoteResponse = { - fromTokenAmount: res.fromTokenAmount, - toTokenAmount: res.toTokenAmount, - additionalNativeFees: res.additionalNativeFees, - provider: this.name, - quote: { - meta, - options, - provider: this.name, - }, - totalGaslimit: res.transactions.reduce( + const res = await this.getRangoSwap(options, meta, false); + if (!res) return null; + + let totalGaslimit: number; + switch (res.networkTransactions.type) { + case NetworkType.EVM: { + totalGaslimit = res.networkTransactions.transactions.reduce( (total: number, curVal: EVMTransaction) => total + toBN(curVal.gasLimit).toNumber(), 0 - ), - minMax: await this.getMinMaxAmount(), - }; - return response; - }); + ); + break; + } + case NetworkType.Solana: { + for ( + let i = 0, len = res.networkTransactions.transactions.length; + i < len; + i++ + ) { + const tx = res.networkTransactions.transactions[i]; + totalGaslimit += extractComputeBudget( + VersionedTransaction.deserialize( + Buffer.from(tx.serialized, "base64") + ) + ); + } + break; + } + default: { + res.networkTransactions satisfies never; + totalGaslimit = 0; + break; + } + } + + const response: ProviderQuoteResponse = { + fromTokenAmount: res.fromTokenAmount, + toTokenAmount: res.toTokenAmount, + additionalNativeFees: res.additionalNativeFees, + provider: this.name, + quote: { + meta, + options, + provider: this.name, + }, + totalGaslimit, + minMax: await this.getMinMaxAmount(), + }; + + return response; } - getSwap(quote: SwapQuote): Promise { - return this.getRangoSwap(quote.options, quote.meta, true).then((res) => { - if (!res) return null; - const feeConfig = - FEE_CONFIGS[this.name][quote.meta.walletIdentifier].fee || 0; - const response: ProviderSwapResponse = { - fromTokenAmount: res.fromTokenAmount, + async getSwap(quote: SwapQuote): Promise { + const res = await this.getRangoSwap(quote.options, quote.meta, true); + if (!res) return null; + const feeConfig = + FEE_CONFIGS[this.name][quote.meta.walletIdentifier].fee || 0; + const response: ProviderSwapResponse = { + fromTokenAmount: res.fromTokenAmount, + provider: this.name, + toTokenAmount: res.toTokenAmount, + additionalNativeFees: res.additionalNativeFees, + transactions: res.networkTransactions.transactions, + slippage: quote.meta.slippage || DEFAULT_SLIPPAGE, + fee: feeConfig * 100, + getStatusObject: async ( + options: StatusOptions + ): Promise => ({ + options: { + ...options, + requestId: res.requestId, + }, provider: this.name, - toTokenAmount: res.toTokenAmount, - additionalNativeFees: res.additionalNativeFees, - transactions: res.transactions, - slippage: quote.meta.slippage || DEFAULT_SLIPPAGE, - fee: feeConfig * 100, - getStatusObject: async ( - options: StatusOptions - ): Promise => ({ - options: { - ...options, - requestId: res.requestId, - }, - provider: this.name, - }), - }; + }), + }; - return response; - }); + return response; } - getStatus(options: StatusOptions): Promise { + async getStatus(options: StatusOptions): Promise { const { requestId, transactionHashes } = options; + const transactionHash = transactionHashes.length > 0 ? transactionHashes[transactionHashes.length - 1] : transactionHashes[0]; + const isAlreadySuccessOrFailed = [ RangoTransactionStatus.FAILED, RangoTransactionStatus.SUCCESS, ].includes( this.transactionsStatus.find((t) => t.hash === transactionHash)?.status ); + if (requestId && !isAlreadySuccessOrFailed) { - return rangoClient - .status({ - txId: transactionHash, - requestId, - }) - .then((res) => { - if (res.error || res.status === RangoTransactionStatus.FAILED) { - this.transactionsStatus.push({ - status: RangoTransactionStatus.FAILED, - hash: transactionHash, - }); - return TransactionStatus.failed; - } - if (!res.status || res.status === RangoTransactionStatus.RUNNING) { - return TransactionStatus.pending; - } - this.transactionsStatus.push({ - status: RangoTransactionStatus.SUCCESS, - hash: transactionHash, - }); - return TransactionStatus.success; + const res = await rangoClient.status({ + txId: transactionHash, + requestId, + }); + + if (res.error || res.status === RangoTransactionStatus.FAILED) { + this.transactionsStatus.push({ + status: RangoTransactionStatus.FAILED, + hash: transactionHash, }); + return TransactionStatus.failed; + } + if (!res.status || res.status === RangoTransactionStatus.RUNNING) { + return TransactionStatus.pending; + } + this.transactionsStatus.push({ + status: RangoTransactionStatus.SUCCESS, + hash: transactionHash, + }); + return TransactionStatus.success; } - const promises = transactionHashes.map((hash) => - this.web3eth.getTransactionReceipt(hash) - ); - return Promise.all(promises).then((receipts) => { - // eslint-disable-next-line no-restricted-syntax - for (const receipt of receipts) { - if (!receipt || (receipt && !receipt.blockNumber)) { - return TransactionStatus.pending; + + const statuses: TransactionStatus[] = []; + switch (this.network) { + case SupportedNetworkName.Solana: { + // Get status of Solana transactions + const sigStatuses = await ( + this.web3 as Connection + ).getSignatureStatuses(transactionHashes); + for (let i = 0, len = sigStatuses.value.length; i < len; i++) { + const sigStatus = sigStatuses.value[i]; + if (sigStatus == null) { + statuses.push(TransactionStatus.pending); + } else if (sigStatus.err != null) { + statuses.push(TransactionStatus.failed); + } else { + statuses.push(TransactionStatus.success); + } } - if (receipt && !receipt.status) return TransactionStatus.failed; + break; } - return TransactionStatus.success; - }); + // Assume EVM + default: { + // Get status of EVM transactions + const receipts = await Promise.all( + transactionHashes.map((hash) => + (this.web3 as Web3Eth).getTransactionReceipt(hash) + ) + ); + + for (let i = 0, len = receipts.length; i < len; i++) { + const receipt = receipts[i]; + let status: TransactionStatus; + if (!receipt || (receipt && !receipt.blockNumber)) { + status = TransactionStatus.pending; + } else if (receipt && !receipt.status) { + status = TransactionStatus.failed; + } else { + status = TransactionStatus.success; + } + statuses.push(status); + } + break; + } + } + + // If any failed or are still pending, return their status + for (let i = 0, len = statuses.length; i < len; i++) { + const status = statuses[i]; + switch (status) { + case TransactionStatus.failed: + return status; + case TransactionStatus.pending: + return status; + case TransactionStatus.success: /* noop */ + default: /* noop */ + } + } + + // no failed or pending, assume success + return TransactionStatus.success; } } diff --git a/packages/swap/src/providers/rango/types.ts b/packages/swap/src/providers/rango/types.ts index 046dec9e9..b43641b4a 100644 --- a/packages/swap/src/providers/rango/types.ts +++ b/packages/swap/src/providers/rango/types.ts @@ -1,7 +1,26 @@ -import { BN, EVMTransaction } from "../../types"; +import { + BN, + EVMTransaction, + NetworkType, + SolanaTransaction, +} from "../../types"; -export interface RangoSwapResponse { +export type RangoEVMTransactions = { + type: NetworkType.EVM; transactions: EVMTransaction[]; +}; + +export type RangoSolanaTransactions = { + type: NetworkType.Solana; + transactions: SolanaTransaction[]; +}; + +export type RangoNetworkedTransactions = + | RangoEVMTransactions + | RangoSolanaTransactions; + +export interface RangoSwapResponse { + networkTransactions: RangoNetworkedTransactions; additionalNativeFees: BN; toTokenAmount: BN; fromTokenAmount: BN; diff --git a/packages/swap/src/providers/zerox/index.ts b/packages/swap/src/providers/zerox/index.ts index 0aa17e0df..6ab516b07 100644 --- a/packages/swap/src/providers/zerox/index.ts +++ b/packages/swap/src/providers/zerox/index.ts @@ -31,7 +31,7 @@ import { getAllowanceTransactions, TOKEN_AMOUNT_INFINITY_AND_BEYOND, } from "../../utils/approvals"; -import estimateGasList from "../../common/estimateGasList"; +import estimateEVMGasList from "../../common/estimateGasList"; import { isEVMAddress } from "../../utils/common"; const supportedNetworks: { @@ -198,7 +198,7 @@ class ZeroX extends ProviderClass { type: TransactionType.evm, }); if (accurateEstimate) { - const accurateGasEstimate = await estimateGasList( + const accurateGasEstimate = await estimateEVMGasList( transactions, this.network ); diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index 5c02e3397..f6fb0cba6 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -160,6 +160,7 @@ export interface EVMTransaction { export interface SolanaTransaction { from: string; + /** TODO: document what this is for, I think it's just for UI */ to: string; /** base64 serialized unsigned solana transaction */ serialized: string; diff --git a/packages/swap/src/utils/solana.ts b/packages/swap/src/utils/solana.ts new file mode 100644 index 000000000..0dc8d6b7c --- /dev/null +++ b/packages/swap/src/utils/solana.ts @@ -0,0 +1,67 @@ +import { + AccountMeta, + ComputeBudgetInstruction, + ComputeBudgetProgram, + TransactionInstruction, + VersionedTransaction, +} from "@solana/web3.js"; + +/** + * @see https://solana.com/docs/core/fees#prioritization-fees + * + * > Transactions can only contain one of each type of compute budget + * instruction. Duplicate instruction types will result in an + * TransactionError::DuplicateInstruction error, and ultimately + * transaction failure. + */ +export function extractComputeBudget( + tx: VersionedTransaction +): undefined | number { + // extract the compute budget + let computeBudget: undefined | number; + + // eslint-disable-next-line no-restricted-syntax, no-labels + instructionLoop: for ( + let i = 0, len = tx.message.compiledInstructions.length; + i < len; + i++ + ) { + const instr = tx.message.compiledInstructions[i]; + const program = tx.message.staticAccountKeys[instr.programIdIndex]; + if (!ComputeBudgetProgram.programId.equals(program)) continue; + + const keys = instr.accountKeyIndexes.map( + (accountKeyIndex): AccountMeta => ({ + pubkey: tx.message.staticAccountKeys[accountKeyIndex], + isSigner: tx.message.isAccountSigner(accountKeyIndex), + isWritable: tx.message.isAccountWritable(accountKeyIndex), + }) + ); + + // Decompile the instruction + const instruction = new TransactionInstruction({ + keys, + programId: program, + data: Buffer.from(instr.data), + }); + + const type = ComputeBudgetInstruction.decodeInstructionType(instruction); + switch (type) { + case "SetComputeUnitLimit": { + // Compute limit + const command = + ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction); + computeBudget = command.units; + // eslint-disable-next-line no-labels + break instructionLoop; + } + // You can use this to get the priorty fee + // case "SetComputeUnitPrice": + default: /** noop */ + break; + } + } + + // (default of 200_000 from Google) + return computeBudget ?? 200_000; +} From a6f8b7b5efdeb4e84709cc21c8f9c43cfed7cfe7 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Fri, 6 Sep 2024 14:14:52 -0500 Subject: [PATCH 315/375] fix: rango swap solana issue --- packages/swap/src/providers/rango/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index 6b7d7a1de..b0d52d379 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -161,7 +161,11 @@ class Rango extends ProviderClass { // has an 0x prefixed hex number (chain: BlockchainMeta) => { if (Number(chain.chainId) === Number(chainId)) return true; - if (chain.name === "SOLANA" && chain.chainId === "mainnet-beta") + if ( + network === SupportedNetworkName.Solana && + chain.name === "SOLANA" && + chain.chainId === "mainnet-beta" + ) return true; return false; } From a36a6b18cb3a22ec4705620607e42da55c575e74 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:00:53 -0700 Subject: [PATCH 316/375] devop: package updates --- package.json | 8 +- packages/extension-bridge/package.json | 10 +- packages/extension/package.json | 56 +- .../src/providers/common/libs/new-features.ts | 2 +- .../src/providers/ethereum/ui/libs/signer.ts | 2 +- packages/hw-wallets/package.json | 20 +- packages/keyring/package.json | 8 +- packages/name-resolution/package.json | 8 +- packages/request/package.json | 8 +- packages/signers/bitcoin/package.json | 8 +- packages/signers/ethereum/package.json | 10 +- packages/signers/ethereum/src/index.ts | 2 +- packages/signers/kadena/package.json | 8 +- packages/signers/polkadot/package.json | 10 +- packages/storage/package.json | 8 +- packages/swap/package.json | 12 +- packages/types/package.json | 4 +- packages/utils/package.json | 10 +- yarn.lock | 2541 +++++++++-------- 19 files changed, 1521 insertions(+), 1214 deletions(-) diff --git a/package.json b/package.json index 5dd4a0e4f..74bc0f3a8 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,11 @@ "prepare": "husky" }, "devDependencies": { - "@commitlint/cli": "^19.3.0", - "@commitlint/config-conventional": "^19.2.2", - "@swc/core": "^1.7.6", + "@commitlint/cli": "^19.4.1", + "@commitlint/config-conventional": "^19.4.1", + "@swc/core": "^1.7.24", "concurrently": "^8.2.2", - "husky": "^9.1.4", + "husky": "^9.1.5", "node-notifier": "^10.0.1", "nodemon": "^3.1.4", "ultra-runner": "^3.10.5" diff --git a/packages/extension-bridge/package.json b/packages/extension-bridge/package.json index 679264670..37d91971b 100644 --- a/packages/extension-bridge/package.json +++ b/packages/extension-bridge/package.json @@ -39,24 +39,24 @@ "webextension-polyfill": "^0.12.0" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@types/webextension-polyfill": "^0.10.7", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", - "bumpp": "^9.4.2", + "bumpp": "^9.5.2", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", "prettier": "^2.8.8", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "tsup": "^8.2.4", - "type-fest": "^4.23.0", + "type-fest": "^4.26.1", "typescript": "^4.9.5", "typescript-eslint": "0.0.1-alpha.0" } diff --git a/packages/extension/package.json b/packages/extension/package.json index d8316f87a..29df81c98 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/extension", - "version": "1.43.0", + "version": "1.44.0", "private": true, "scripts": { "zip": "cd dist; zip -r release.zip *;", @@ -21,8 +21,8 @@ "watch-vue-firefox": "cross-env BROWSER='firefox' vue-cli-service build --watch --no-clean" }, "dependencies": { - "@amplitude/analytics-browser": "^2.10.0", - "@babel/runtime": "^7.25.0", + "@amplitude/analytics-browser": "^2.11.2", + "@babel/runtime": "^7.25.6", "@enkryptcom/extension-bridge": "workspace:^", "@enkryptcom/hw-wallets": "workspace:^", "@enkryptcom/keyring": "workspace:^", @@ -31,26 +31,26 @@ "@enkryptcom/swap": "workspace:^", "@enkryptcom/types": "workspace:^", "@enkryptcom/utils": "workspace:^", - "@ethereumjs/common": "^4.3.0", - "@ethereumjs/tx": "^5.3.0", - "@ethereumjs/util": "^9.0.3", + "@ethereumjs/common": "^4.4.0", + "@ethereumjs/tx": "^5.4.0", + "@ethereumjs/util": "^9.1.0", "@kadena/client": "^1.13.0", "@ledgerhq/hw-transport-webusb": "^6.29.2", "@metamask/eth-sig-util": "^7.0.3", - "@metaplex-foundation/mpl-bubblegum": "^4.2.0", + "@metaplex-foundation/mpl-bubblegum": "^4.2.1", "@metaplex-foundation/umi": "^0.9.2", "@metaplex-foundation/umi-bundle-defaults": "^0.9.2", "@rollup/plugin-replace": "^5.0.7", - "@solana-developers/helpers": "^2.4.0", + "@solana-developers/helpers": "^2.5.4", "@solana/spl-token": "^0.4.8", "@solana/wallet-standard-features": "^1.2.0", - "@solana/web3.js": "^1.95.2", - "@types/chrome": "^0.0.269", + "@solana/web3.js": "^1.95.3", + "@types/chrome": "^0.0.270", "@types/events": "^3.0.3", "@types/less": "^3.0.6", "@types/lodash": "^4.17.7", "@types/utf-8-validate": "^5.0.2", - "@vueuse/core": "^10.11.0", + "@vueuse/core": "^10.11.1", "@wallet-standard/base": "^0.0.0-20240703212708", "add": "^2.0.6", "bignumber.js": "^9.1.2", @@ -59,7 +59,7 @@ "bs58": "^6.0.0", "chai": "^4.5.0", "concurrently": "^8.2.2", - "core-js": "^3.38.0", + "core-js": "^3.38.1", "echarts": "^5.5.1", "ethereum-cryptography": "^2.2.1", "ethereumjs-abi": "^0.6.8", @@ -70,15 +70,15 @@ "moment": "^2.30.1", "nanoevents": "^9.0.0", "pact-lang-api": "^4.3.6", - "pinia": "^2.2.0", + "pinia": "^2.2.2", "qrcode.vue": "^3.4.1", "switch-ts": "^1.1.1", "url-parse": "^1.5.10", "uuid": "^10.0.0", - "vue": "^3.4.35", - "vue-echarts": "7.0.1", - "vue-router": "4.4.2", - "vue3-lottie": "^3.3.0", + "vue": "^3.5.3", + "vue-echarts": "7.0.3", + "vue-router": "4.4.3", + "vue3-lottie": "^3.3.1", "vuedraggable": "^4.1.0", "web3-eth": "^1.10.4", "web3-utils": "^1.10.4", @@ -88,13 +88,13 @@ "devDependencies": { "@babel/plugin-transform-class-static-block": "^7.24.7", "@kadena/pactjs-cli": "^1.13.0", - "@polkadot/api": "^12.2.3", - "@polkadot/extension-inject": "^0.50.1", + "@polkadot/api": "^12.4.2", + "@polkadot/extension-inject": "^0.52.3", "@polkadot/keyring": "^13.0.2", - "@polkadot/rpc-provider": "^12.2.3", - "@polkadot/types": "^12.2.3", - "@polkadot/types-known": "^12.2.3", - "@polkadot/ui-shared": "^3.8.3", + "@polkadot/rpc-provider": "^12.4.2", + "@polkadot/types": "^12.4.2", + "@polkadot/types-known": "^12.4.2", + "@polkadot/ui-shared": "^3.9.1", "@polkadot/util": "^13.0.2", "@polkadot/wasm-crypto": "^7.3.2", "@rollup/plugin-commonjs": "^26.0.1", @@ -108,7 +108,7 @@ "@types/url-parse": "^1.4.11", "@types/uuid": "^10.0.0", "@types/wif": "^2.0.5", - "@types/zxcvbn": "^4.4.4", + "@types/zxcvbn": "^4.4.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@vue/cli-plugin-babel": "~5.0.8", @@ -126,19 +126,19 @@ "https-browserify": "^1.0.0", "less": "^4.2.0", "less-loader": "^12.2.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "path-browserify": "^1.0.1", "prettier": "^2.8.8", "rimraf": "^6.0.1", - "rollup": "^4.20.0", + "rollup": "^4.21.2", "rollup-plugin-uglify": "^6.0.4", "semver": "^7.6.3", "stream-browserify": "^3.0.0", "stream-http": "^3.2.0", - "systeminformation": "^5.23.3", + "systeminformation": "^5.23.5", "ts-mocha": "^10.0.0", "tsconfig-paths": "^4.2.0", - "typescript": "^5.5.4", + "typescript": "^5.6.2", "url": "^0.11.4", "webextension-polyfill": "^0.12.0" }, diff --git a/packages/extension/src/providers/common/libs/new-features.ts b/packages/extension/src/providers/common/libs/new-features.ts index 04a059ecb..df9d62d46 100644 --- a/packages/extension/src/providers/common/libs/new-features.ts +++ b/packages/extension/src/providers/common/libs/new-features.ts @@ -1,6 +1,6 @@ import { NetworkNames } from "@enkryptcom/types"; -const newNetworks = [NetworkNames.MantaPacific]; +const newNetworks = [NetworkNames.Solana]; const newSwaps: NetworkNames[] = []; export { newNetworks, newSwaps }; diff --git a/packages/extension/src/providers/ethereum/ui/libs/signer.ts b/packages/extension/src/providers/ethereum/ui/libs/signer.ts index a417e4cdc..895c425dc 100644 --- a/packages/extension/src/providers/ethereum/ui/libs/signer.ts +++ b/packages/extension/src/providers/ethereum/ui/libs/signer.ts @@ -29,7 +29,7 @@ const TransactionSigner = ( wallet: account.walletType as unknown as HWwalletType, }) .then((rpcsig: string) => { - const rpcSig = fromRpcSig(rpcsig); + const rpcSig = fromRpcSig(rpcsig as `0x${string}`); const signedTx = payload.addSignature( BigInt(rpcSig.v), rpcSig.r, diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 9e85883ad..273f39dbe 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -16,9 +16,9 @@ "node": ">=14.15.0" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -26,9 +26,9 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", @@ -48,18 +48,18 @@ "@enkryptcom/types": "workspace:^", "@enkryptcom/utils": "workspace:^", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/tx": "^5.3.0", - "@ethereumjs/util": "^9.0.3", + "@ethereumjs/tx": "^5.4.0", + "@ethereumjs/util": "^9.1.0", "@ledgerhq/hw-app-btc": "^10.4.1", - "@ledgerhq/hw-app-eth": "^6.37.3", + "@ledgerhq/hw-app-eth": "^6.38.0", "@ledgerhq/hw-transport": "^6.31.2", "@ledgerhq/hw-transport-webusb": "^6.29.2", "@ledgerhq/live-common": "^34.1.0", - "@polkadot/types": "^12.2.3", + "@polkadot/types": "^12.4.2", "@polkadot/util": "^13.0.2", "@trezor/connect": "^9.4.0", - "@trezor/connect-web": "^9.3.0", - "@zondax/ledger-substrate": "^0.44.7", + "@trezor/connect-web": "^9.4.0", + "@zondax/ledger-substrate": "^1.0.0", "bitcoinjs-lib": "^6.1.6", "hdkey": "^2.1.0", "webextension-polyfill": "^0.12.0" diff --git a/packages/keyring/package.json b/packages/keyring/package.json index 55097b817..aeab274be 100644 --- a/packages/keyring/package.json +++ b/packages/keyring/package.json @@ -29,9 +29,9 @@ "bip39": "^3.1.0" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -39,9 +39,9 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/packages/name-resolution/package.json b/packages/name-resolution/package.json index c1deb7cf6..ea4dc5a92 100644 --- a/packages/name-resolution/package.json +++ b/packages/name-resolution/package.json @@ -16,9 +16,9 @@ "node": ">=14.15.0" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -26,9 +26,9 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/packages/request/package.json b/packages/request/package.json index 5566eb09b..527bd35b6 100644 --- a/packages/request/package.json +++ b/packages/request/package.json @@ -26,9 +26,9 @@ "ws": "^8.18.0" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -36,9 +36,9 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/packages/signers/bitcoin/package.json b/packages/signers/bitcoin/package.json index 897a37433..cf26e7a55 100644 --- a/packages/signers/bitcoin/package.json +++ b/packages/signers/bitcoin/package.json @@ -27,19 +27,19 @@ }, "devDependencies": { "@enkryptcom/types": "workspace:^", - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/hdkey": "^2.0.3", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^9.0.2", "ts-node": "^10.9.2", diff --git a/packages/signers/ethereum/package.json b/packages/signers/ethereum/package.json index 86d8a9c18..37ac9d829 100644 --- a/packages/signers/ethereum/package.json +++ b/packages/signers/ethereum/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@enkryptcom/utils": "workspace:^", - "@ethereumjs/util": "^9.0.3", + "@ethereumjs/util": "^9.1.0", "bip39": "^3.1.0", "chai": "^4.5.0", "hdkey": "^2.1.0", @@ -27,19 +27,19 @@ }, "devDependencies": { "@enkryptcom/types": "workspace:^", - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/hdkey": "^2.0.3", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/packages/signers/ethereum/src/index.ts b/packages/signers/ethereum/src/index.ts index 5a30c95dc..d7f48aeea 100644 --- a/packages/signers/ethereum/src/index.ts +++ b/packages/signers/ethereum/src/index.ts @@ -31,7 +31,7 @@ class Signer implements SignerInterface { sig: string, publicKey: string ): Promise { - const sigdecoded = fromRpcSig(sig); + const sigdecoded = fromRpcSig(sig as `0x${string}`); const rpubkey = ecrecover( hexToBuffer(msgHash), sigdecoded.v, diff --git a/packages/signers/kadena/package.json b/packages/signers/kadena/package.json index 216187460..5788d7b3d 100644 --- a/packages/signers/kadena/package.json +++ b/packages/signers/kadena/package.json @@ -25,19 +25,19 @@ "devDependencies": { "@enkryptcom/types": "workspace:^", "@polkadot/util-crypto": "^13.0.2", - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/hdkey": "^2.0.3", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^9.0.2", "ts-node": "^10.9.2", diff --git a/packages/signers/polkadot/package.json b/packages/signers/polkadot/package.json index 41a3dba08..09b3f8083 100644 --- a/packages/signers/polkadot/package.json +++ b/packages/signers/polkadot/package.json @@ -17,7 +17,7 @@ "node": ">=14.15.0" }, "dependencies": { - "@commitlint/cli": "^19.3.0", + "@commitlint/cli": "^19.4.1", "@enkryptcom/utils": "workspace:^", "@polkadot/util": "^13.0.2", "@polkadot/util-crypto": "^13.0.2", @@ -27,18 +27,18 @@ }, "devDependencies": { "@enkryptcom/types": "workspace:^", - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/packages/storage/package.json b/packages/storage/package.json index 9ea1d4846..e897271ab 100644 --- a/packages/storage/package.json +++ b/packages/storage/package.json @@ -22,18 +22,18 @@ "localforage": "^1.10.0" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/packages/swap/package.json b/packages/swap/package.json index 0695f2401..bc44610d3 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -18,14 +18,14 @@ "dependencies": { "@enkryptcom/types": "workspace:^", "@enkryptcom/utils": "workspace:^", - "@solana/web3.js": "^1.95.2", + "@solana/web3.js": "^1.95.3", "bignumber.js": "^9.1.2", "eventemitter3": "^5.0.1", "isomorphic-ws": "^5.0.0", "json-rpc-2.0": "^1.7.0", "lodash": "^4.17.21", "node-fetch": "^2.7.0", - "rango-sdk-basic": "^0.1.52", + "rango-sdk-basic": "^0.1.56", "reconnecting-websocket": "^4.4.0", "uuid": "^10.0.0", "web3-eth": "^1.10.4", @@ -33,9 +33,9 @@ "ws": "^8.18.0" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "chai": "^4.5.0", @@ -43,9 +43,9 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/packages/types/package.json b/packages/types/package.json index 837d0e162..2f74b5667 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -18,14 +18,14 @@ "node": ">=14.15.0" }, "devDependencies": { - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", "prettier": "^2.8.8", "ts-node": "^10.9.2", diff --git a/packages/utils/package.json b/packages/utils/package.json index 84a2e2693..7a9f41ed9 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -18,7 +18,7 @@ }, "dependencies": { "@enkryptcom/types": "workspace:^", - "@ethereumjs/util": "^9.0.3", + "@ethereumjs/util": "^9.1.0", "@polkadot/util-crypto": "^13.0.2", "bip39": "^3.1.0", "chai": "^4.5.0", @@ -26,18 +26,18 @@ "web3-utils": "^1.10.4" }, "devDependencies": { - "@types/chai": "^4.3.17", + "@types/chai": "^4.3.19", "@types/mocha": "^10.0.7", - "@types/node": "^20.14.14", + "@types/node": "^20.16.5", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.10.0", "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-import": "^2.29.1", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-module-resolver": "^1.5.0", - "mocha": "^10.7.0", + "mocha": "^10.7.3", "prettier": "^2.8.8", "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", diff --git a/yarn.lock b/yarn.lock index 62ebe59a0..72cdbd5c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,22 +30,22 @@ __metadata: languageName: node linkType: hard -"@amplitude/analytics-browser@npm:^2.10.0": - version: 2.10.0 - resolution: "@amplitude/analytics-browser@npm:2.10.0" - dependencies: - "@amplitude/analytics-client-common": ^2.3.0 - "@amplitude/analytics-core": ^2.4.0 - "@amplitude/analytics-remote-config": ^0.3.0 - "@amplitude/analytics-types": ^2.7.0 - "@amplitude/plugin-autocapture-browser": ^1.0.0 - "@amplitude/plugin-page-view-tracking-browser": ^2.2.18 +"@amplitude/analytics-browser@npm:^2.11.2": + version: 2.11.2 + resolution: "@amplitude/analytics-browser@npm:2.11.2" + dependencies: + "@amplitude/analytics-client-common": ^2.3.1 + "@amplitude/analytics-core": ^2.5.0 + "@amplitude/analytics-remote-config": ^0.4.0 + "@amplitude/analytics-types": ^2.8.0 + "@amplitude/plugin-autocapture-browser": ^1.0.1 + "@amplitude/plugin-page-view-tracking-browser": ^2.2.21 tslib: ^2.4.1 - checksum: 0cf359745dc1b500b0eb6b5d2e1c917eb227e8d2d3506534670b3d3204735fd126783627f5c8dacbc0856aa1d4ea3b30aea448e226252f101c5c1b4705567237 + checksum: 751ef567c4de43d6f241bc7db04f704de31c0788519657ce80a38e1e48a97ca9a674ddc64a9478d083852eb47491ef6f9273c8cf357a0e61025ce80264313d26 languageName: node linkType: hard -"@amplitude/analytics-client-common@npm:>=1 <3, @amplitude/analytics-client-common@npm:^2.3.0": +"@amplitude/analytics-client-common@npm:>=1 <3": version: 2.3.0 resolution: "@amplitude/analytics-client-common@npm:2.3.0" dependencies: @@ -57,6 +57,18 @@ __metadata: languageName: node linkType: hard +"@amplitude/analytics-client-common@npm:^2.3.1": + version: 2.3.1 + resolution: "@amplitude/analytics-client-common@npm:2.3.1" + dependencies: + "@amplitude/analytics-connector": ^1.4.8 + "@amplitude/analytics-core": ^2.5.0 + "@amplitude/analytics-types": ^2.8.0 + tslib: ^2.4.1 + checksum: 4dadc8cce9542cec5a67ea4de34adaea86b5ebb4e870285914e4f460c99193c0294b2defc4972977abc1ef8a1ccd05cbf1355c0eabead96997612c1c66daf0a4 + languageName: node + linkType: hard + "@amplitude/analytics-connector@npm:^1.4.8": version: 1.5.0 resolution: "@amplitude/analytics-connector@npm:1.5.0" @@ -74,16 +86,25 @@ __metadata: languageName: node linkType: hard -"@amplitude/analytics-remote-config@npm:^0.3.0": - version: 0.3.4 - resolution: "@amplitude/analytics-remote-config@npm:0.3.4" +"@amplitude/analytics-core@npm:^2.5.0": + version: 2.5.0 + resolution: "@amplitude/analytics-core@npm:2.5.0" + dependencies: + "@amplitude/analytics-types": ^2.8.0 + tslib: ^2.4.1 + checksum: 48cdcf4fbc3e13c79231160e3d783c451f501c2bcd6029fb6532c49f51594e425f7ba82711d2ae0fc952b338f9056ec8e70ad482314c40f0d2bc7e93df3213ee + languageName: node + linkType: hard + +"@amplitude/analytics-remote-config@npm:^0.4.0": + version: 0.4.0 + resolution: "@amplitude/analytics-remote-config@npm:0.4.0" dependencies: "@amplitude/analytics-client-common": ">=1 <3" "@amplitude/analytics-core": ">=1 <3" "@amplitude/analytics-types": ">=1 <3" - idb: ^8.0.0 tslib: ^2.4.1 - checksum: 6a8ebd447c23d21c7edb0d58326dad8fea5fc4ea0029ae464685b5a5c0988cc4969f4bbd649681ba3c007ba0eddfdaf26d801b8d3ed40000f7477955be8ee3a7 + checksum: 9cf47734c4977e6b43dc7e98e7a19a2e21a4b8abe964aa07c9cd9667a4796a54917f8e0e77ee1414b5ba7ace8a7025f94ad98e4a0df4ddd783390e0bac7b5447 languageName: node linkType: hard @@ -94,26 +115,33 @@ __metadata: languageName: node linkType: hard -"@amplitude/plugin-autocapture-browser@npm:^1.0.0": - version: 1.0.0 - resolution: "@amplitude/plugin-autocapture-browser@npm:1.0.0" +"@amplitude/analytics-types@npm:^2.8.0": + version: 2.8.0 + resolution: "@amplitude/analytics-types@npm:2.8.0" + checksum: e702be55dcbbf6dbbf02e3e6ce19eb11642820f511fc27980de4a55d74d4976e170cea5adca9eb468c766fefd7c1f99705eece27d1bbc8de0d8fe9f1f75e191d + languageName: node + linkType: hard + +"@amplitude/plugin-autocapture-browser@npm:^1.0.1": + version: 1.0.1 + resolution: "@amplitude/plugin-autocapture-browser@npm:1.0.1" dependencies: "@amplitude/analytics-client-common": ">=1 <3" "@amplitude/analytics-types": ">=1 <3" rxjs: ^7.8.1 tslib: ^2.4.1 - checksum: 4c37ee21f93520fb8adc79b9b2de57e612c23af2e1c7e3c5fca0ae03a71bcdf447a103daf656e626e8899963d1dadfa307807f4abe240d52a0a0dd589710eed1 + checksum: 7997772ff3a559a886822329b3d53d597f03f747e8593998fde1a4294767acea53281fcbdb3d228d0d2ad66825dd25d7fbcf90cd28a10e5932b2052e09cdd560 languageName: node linkType: hard -"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.18": - version: 2.2.18 - resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.18" +"@amplitude/plugin-page-view-tracking-browser@npm:^2.2.21": + version: 2.2.21 + resolution: "@amplitude/plugin-page-view-tracking-browser@npm:2.2.21" dependencies: - "@amplitude/analytics-client-common": ^2.3.0 - "@amplitude/analytics-types": ^2.7.0 + "@amplitude/analytics-client-common": ^2.3.1 + "@amplitude/analytics-types": ^2.8.0 tslib: ^2.4.1 - checksum: ab0d8a1a400ee1377a8b1d53bd8fe9e45de113596b9dacb3d92c23f7f137bce98b63f930dfedc70bcce0c2f239582c644ff930cd6cc87af912e0c4096368cf13 + checksum: 0f465136a3a9abb29194cd98f7a8b30df3bf1e160d5b4ffe961cf208b5b41fd3c97cfb9d18b333a004839de16240e9f0dced90b217281a92750890bfc0900842 languageName: node linkType: hard @@ -590,6 +618,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.24.8": + version: 7.24.8 + resolution: "@babel/helper-string-parser@npm:7.24.8" + checksum: 39b03c5119216883878655b149148dc4d2e284791e969b19467a9411fccaa33f7a713add98f4db5ed519535f70ad273cdadfd2eb54d47ebbdeac5083351328ce + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.22.5": version: 7.22.15 resolution: "@babel/helper-validator-identifier@npm:7.22.15" @@ -709,6 +744,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.25.3": + version: 7.25.6 + resolution: "@babel/parser@npm:7.25.6" + dependencies: + "@babel/types": ^7.25.6 + bin: + parser: ./bin/babel-parser.js + checksum: 85b237ded09ee43cc984493c35f3b1ff8a83e8dbbb8026b8132e692db6567acc5a1659ec928e4baa25499ddd840d7dae9dee3062be7108fe23ec5f94a8066b1e + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.16.7": version: 7.16.7 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.16.7" @@ -1668,7 +1714,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.23.3, @babel/preset-typescript@npm:^7.24.7": +"@babel/preset-typescript@npm:^7.24.7": version: 7.24.7 resolution: "@babel/preset-typescript@npm:7.24.7" dependencies: @@ -1692,21 +1738,21 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/runtime@npm:7.24.7" +"@babel/runtime@npm:^7.24.8, @babel/runtime@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/runtime@npm:7.25.0" dependencies: regenerator-runtime: ^0.14.0 - checksum: d17f29eed6f848ac15cdf4202a910b741facfb0419a9d79e5c7fa37df6362fc3227f1cc2e248cc6db5e53ddffb4caa6686c488e6e80ce3d29c36a4e74c8734ea + checksum: 4a2a374a58eb01aaa65c5762606e90b3a1f448e0c637d42278b6cc0b42a9f5399b5f381ba9f237ee087da2860d14dd2d1de7bddcbe18be6a3cafba97e44bed64 languageName: node linkType: hard -"@babel/runtime@npm:^7.24.8, @babel/runtime@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/runtime@npm:7.25.0" +"@babel/runtime@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/runtime@npm:7.25.6" dependencies: regenerator-runtime: ^0.14.0 - checksum: 4a2a374a58eb01aaa65c5762606e90b3a1f448e0c637d42278b6cc0b42a9f5399b5f381ba9f237ee087da2860d14dd2d1de7bddcbe18be6a3cafba97e44bed64 + checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 languageName: node linkType: hard @@ -1790,6 +1836,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.25.6": + version: 7.25.6 + resolution: "@babel/types@npm:7.25.6" + dependencies: + "@babel/helper-string-parser": ^7.24.8 + "@babel/helper-validator-identifier": ^7.24.7 + to-fast-properties: ^2.0.0 + checksum: 9b2f84ff3f874ad05b0b9bf06862c56f478b65781801f82296b4cc01bee39e79c20a7c0a06959fed0ee582c8267e1cb21638318655c5e070b0287242a844d1c9 + languageName: node + linkType: hard + "@cardano-foundation/ledgerjs-hw-app-cardano@npm:^6.0.1": version: 6.0.1 resolution: "@cardano-foundation/ledgerjs-hw-app-cardano@npm:6.0.1" @@ -1937,30 +1994,30 @@ __metadata: languageName: node linkType: hard -"@commitlint/cli@npm:^19.3.0": - version: 19.3.0 - resolution: "@commitlint/cli@npm:19.3.0" +"@commitlint/cli@npm:^19.4.1": + version: 19.4.1 + resolution: "@commitlint/cli@npm:19.4.1" dependencies: "@commitlint/format": ^19.3.0 - "@commitlint/lint": ^19.2.2 - "@commitlint/load": ^19.2.0 - "@commitlint/read": ^19.2.1 + "@commitlint/lint": ^19.4.1 + "@commitlint/load": ^19.4.0 + "@commitlint/read": ^19.4.0 "@commitlint/types": ^19.0.3 execa: ^8.0.1 yargs: ^17.0.0 bin: commitlint: cli.js - checksum: 2329756f6e3313948aafac378b2cf2fe3b436c8dd0260e517b68dd7e7c52e944d280e562f93c91308c13d60461af469641c031bae09131aa34a953e2f7074c29 + checksum: 3712016a46f6f3d2ce6b6fa935f4d6e82c58d569b1b1b147dc61bb61f75a4209540e79a2a734ddc41e7c781683133b4f017794720f031f0136d3bb32752e7c32 languageName: node linkType: hard -"@commitlint/config-conventional@npm:^19.2.2": - version: 19.2.2 - resolution: "@commitlint/config-conventional@npm:19.2.2" +"@commitlint/config-conventional@npm:^19.4.1": + version: 19.4.1 + resolution: "@commitlint/config-conventional@npm:19.4.1" dependencies: "@commitlint/types": ^19.0.3 conventional-changelog-conventionalcommits: ^7.0.2 - checksum: fa6b5f763ff1e6c118e4d8434db81058a88afb622a76e6df13956d6b14b9462fd02b81160db5325895165ef0dd18641f6d762a2f1858f0b4fc70fae9720b5b15 + checksum: f672b8ad332ab8cc8ebefbaac1b8f8164864b969745f701982ed526a153127a507d9feb38722e15ba8eae1ad959b1ae29fe615e51f695d8120b5c455883653a3 languageName: node linkType: hard @@ -2015,21 +2072,21 @@ __metadata: languageName: node linkType: hard -"@commitlint/lint@npm:^19.2.2": - version: 19.2.2 - resolution: "@commitlint/lint@npm:19.2.2" +"@commitlint/lint@npm:^19.4.1": + version: 19.4.1 + resolution: "@commitlint/lint@npm:19.4.1" dependencies: "@commitlint/is-ignored": ^19.2.2 "@commitlint/parse": ^19.0.3 - "@commitlint/rules": ^19.0.3 + "@commitlint/rules": ^19.4.1 "@commitlint/types": ^19.0.3 - checksum: 45563692499ca0ca6d0c11f57402ada53de0008524435b1ef097f11d149c8d58ba9081b35b91cbd46788b4b0564faca132daa16c71b025a39af0542b30ee587a + checksum: 9c6ada4892a1841a317bb7938ae1187a254535dd03455d8c630944451bdf01717eccc6cfc19b3a516db06074883eb154fbf76c6146cf2c57ba7f9a9f07107eec languageName: node linkType: hard -"@commitlint/load@npm:^19.2.0": - version: 19.2.0 - resolution: "@commitlint/load@npm:19.2.0" +"@commitlint/load@npm:^19.4.0": + version: 19.4.0 + resolution: "@commitlint/load@npm:19.4.0" dependencies: "@commitlint/config-validator": ^19.0.3 "@commitlint/execute-rule": ^19.0.0 @@ -2041,7 +2098,7 @@ __metadata: lodash.isplainobject: ^4.0.6 lodash.merge: ^4.6.2 lodash.uniq: ^4.5.0 - checksum: 5cd35a0a60064c70c06ab6bd8b1ae02cf6ecc1d0520b76c68cdc7c12094338f04c19e2df5d7ae30d681e858871c4f1963ae39e4969ed61139959cf4b300030fc + checksum: ebf3c8f4567cef9b4099d740f145eea6dc8335059ebfbda18d9c65701b810c46634aeeea721a6c7ebbef6cf8d11ccf1402891fee89ca90652f723987ee5c410c languageName: node linkType: hard @@ -2063,16 +2120,16 @@ __metadata: languageName: node linkType: hard -"@commitlint/read@npm:^19.2.1": - version: 19.2.1 - resolution: "@commitlint/read@npm:19.2.1" +"@commitlint/read@npm:^19.4.0": + version: 19.4.0 + resolution: "@commitlint/read@npm:19.4.0" dependencies: "@commitlint/top-level": ^19.0.0 "@commitlint/types": ^19.0.3 execa: ^8.0.1 git-raw-commits: ^4.0.0 minimist: ^1.2.8 - checksum: 840ebd183b2fe36dea03701552d825a9a1770d300b9416ab2a731fdeed66cf8c9dd8be133d92ac017cb9bf29e2ef5aee91a641f2b643bb5b33005f7b392ec953 + checksum: 732ab482c3acc7cf00d28db02d45701f38c381712a46e2d5f5f7faabc14b87d849c64184df80b7d197083a71fbd7ec05cc5ae6a1814c1590543f9489e46f9d28 languageName: node linkType: hard @@ -2090,16 +2147,16 @@ __metadata: languageName: node linkType: hard -"@commitlint/rules@npm:^19.0.3": - version: 19.0.3 - resolution: "@commitlint/rules@npm:19.0.3" +"@commitlint/rules@npm:^19.4.1": + version: 19.4.1 + resolution: "@commitlint/rules@npm:19.4.1" dependencies: "@commitlint/ensure": ^19.0.3 "@commitlint/message": ^19.0.0 "@commitlint/to-lines": ^19.0.0 "@commitlint/types": ^19.0.3 execa: ^8.0.1 - checksum: 218033d96b0bae7dbea0e46483f8af823c17b492e4b0c4dca93a6312876d051cc88f4272d009e7eb06ff05585ec511aedd703132be17c7248698a4eac909986b + checksum: c5626278aa6ee08194f1b7880345fcbc64b19a2f7ca52f54cd027fb19337fb60008b55a2fe7a4159dd227d41ffb48b30e51347101a58f842d37991a416a678a7 languageName: node linkType: hard @@ -2756,18 +2813,18 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/extension-bridge@workspace:packages/extension-bridge" dependencies: - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@types/webextension-polyfill": ^0.10.7 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 - bumpp: ^9.4.2 + bumpp: ^9.5.2 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 nanoevents: ^9.0.0 prettier: ^2.8.8 @@ -2776,7 +2833,7 @@ __metadata: ts-node: ^10.9.2 tsconfig-paths: ^4.2.0 tsup: ^8.2.4 - type-fest: ^4.23.0 + type-fest: ^4.26.1 typescript: ^4.9.5 typescript-eslint: 0.0.1-alpha.0 webextension-polyfill: ^0.12.0 @@ -2787,9 +2844,9 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/extension@workspace:packages/extension" dependencies: - "@amplitude/analytics-browser": ^2.10.0 + "@amplitude/analytics-browser": ^2.11.2 "@babel/plugin-transform-class-static-block": ^7.24.7 - "@babel/runtime": ^7.25.0 + "@babel/runtime": ^7.25.6 "@enkryptcom/extension-bridge": "workspace:^" "@enkryptcom/hw-wallets": "workspace:^" "@enkryptcom/keyring": "workspace:^" @@ -2798,23 +2855,23 @@ __metadata: "@enkryptcom/swap": "workspace:^" "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@ethereumjs/common": ^4.3.0 - "@ethereumjs/tx": ^5.3.0 - "@ethereumjs/util": ^9.0.3 + "@ethereumjs/common": ^4.4.0 + "@ethereumjs/tx": ^5.4.0 + "@ethereumjs/util": ^9.1.0 "@kadena/client": ^1.13.0 "@kadena/pactjs-cli": ^1.13.0 "@ledgerhq/hw-transport-webusb": ^6.29.2 "@metamask/eth-sig-util": ^7.0.3 - "@metaplex-foundation/mpl-bubblegum": ^4.2.0 + "@metaplex-foundation/mpl-bubblegum": ^4.2.1 "@metaplex-foundation/umi": ^0.9.2 "@metaplex-foundation/umi-bundle-defaults": ^0.9.2 - "@polkadot/api": ^12.2.3 - "@polkadot/extension-inject": ^0.50.1 + "@polkadot/api": ^12.4.2 + "@polkadot/extension-inject": ^0.52.3 "@polkadot/keyring": ^13.0.2 - "@polkadot/rpc-provider": ^12.2.3 - "@polkadot/types": ^12.2.3 - "@polkadot/types-known": ^12.2.3 - "@polkadot/ui-shared": ^3.8.3 + "@polkadot/rpc-provider": ^12.4.2 + "@polkadot/types": ^12.4.2 + "@polkadot/types-known": ^12.4.2 + "@polkadot/ui-shared": ^3.9.1 "@polkadot/util": ^13.0.2 "@polkadot/wasm-crypto": ^7.3.2 "@rollup/plugin-commonjs": ^26.0.1 @@ -2823,12 +2880,12 @@ __metadata: "@rollup/plugin-node-resolve": ^15.2.3 "@rollup/plugin-replace": ^5.0.7 "@rollup/plugin-typescript": ^11.1.6 - "@solana-developers/helpers": ^2.4.0 + "@solana-developers/helpers": ^2.5.4 "@solana/spl-token": ^0.4.8 "@solana/wallet-standard-features": ^1.2.0 - "@solana/web3.js": ^1.95.2 + "@solana/web3.js": ^1.95.3 "@types/bs58": ^4.0.4 - "@types/chrome": ^0.0.269 + "@types/chrome": ^0.0.270 "@types/ethereumjs-abi": ^0.6.5 "@types/events": ^3.0.3 "@types/less": ^3.0.6 @@ -2838,7 +2895,7 @@ __metadata: "@types/utf-8-validate": ^5.0.2 "@types/uuid": ^10.0.0 "@types/wif": ^2.0.5 - "@types/zxcvbn": ^4.4.4 + "@types/zxcvbn": ^4.4.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 "@vue/cli-plugin-babel": ~5.0.8 @@ -2846,7 +2903,7 @@ __metadata: "@vue/cli-plugin-typescript": ~5.0.8 "@vue/cli-service": ~5.0.8 "@vue/eslint-config-typescript": ^11.0.3 - "@vueuse/core": ^10.11.0 + "@vueuse/core": ^10.11.1 "@wallet-standard/base": ^0.0.0-20240703212708 add: ^2.0.6 bignumber.js: ^9.1.2 @@ -2856,7 +2913,7 @@ __metadata: buffer: ^6.0.3 chai: ^4.5.0 concurrently: ^8.2.2 - core-js: ^3.38.0 + core-js: ^3.38.1 cross-env: ^7.0.3 crypto-browserify: ^3.12.0 echarts: ^5.5.1 @@ -2873,32 +2930,32 @@ __metadata: less-loader: ^12.2.0 lodash: ^4.17.21 memoize-one: ^6.0.0 - mocha: ^10.7.0 + mocha: ^10.7.3 moment: ^2.30.1 nanoevents: ^9.0.0 pact-lang-api: ^4.3.6 path-browserify: ^1.0.1 - pinia: ^2.2.0 + pinia: ^2.2.2 prettier: ^2.8.8 qrcode.vue: ^3.4.1 rimraf: ^6.0.1 - rollup: ^4.20.0 + rollup: ^4.21.2 rollup-plugin-uglify: ^6.0.4 semver: ^7.6.3 stream-browserify: ^3.0.0 stream-http: ^3.2.0 switch-ts: ^1.1.1 - systeminformation: ^5.23.3 + systeminformation: ^5.23.5 ts-mocha: ^10.0.0 tsconfig-paths: ^4.2.0 - typescript: ^5.5.4 + typescript: ^5.6.2 url: ^0.11.4 url-parse: ^1.5.10 uuid: ^10.0.0 - vue: ^3.4.35 - vue-echarts: 7.0.1 - vue-router: 4.4.2 - vue3-lottie: ^3.3.0 + vue: ^3.5.3 + vue-echarts: 7.0.3 + vue-router: 4.4.3 + vue3-lottie: ^3.3.1 vuedraggable: ^4.1.0 web3-eth: ^1.10.4 web3-utils: ^1.10.4 @@ -2915,33 +2972,33 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@ethereumjs/rlp": ^5.0.2 - "@ethereumjs/tx": ^5.3.0 - "@ethereumjs/util": ^9.0.3 + "@ethereumjs/tx": ^5.4.0 + "@ethereumjs/util": ^9.1.0 "@ledgerhq/hw-app-btc": ^10.4.1 - "@ledgerhq/hw-app-eth": ^6.37.3 + "@ledgerhq/hw-app-eth": ^6.38.0 "@ledgerhq/hw-transport": ^6.31.2 "@ledgerhq/hw-transport-webusb": ^6.29.2 "@ledgerhq/live-common": ^34.1.0 - "@polkadot/types": ^12.2.3 + "@polkadot/types": ^12.4.2 "@polkadot/util": ^13.0.2 "@trezor/connect": ^9.4.0 - "@trezor/connect-web": ^9.3.0 - "@types/chai": ^4.3.17 + "@trezor/connect-web": ^9.4.0 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 - "@zondax/ledger-substrate": ^0.44.7 + "@zondax/ledger-substrate": ^1.0.0 bitcoinjs-lib: ^6.1.6 chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 hdkey: ^2.1.0 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -2965,9 +3022,9 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@polkadot/util": ^13.0.2 - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 assert: ^2.1.0 @@ -2977,9 +3034,9 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -2996,9 +3053,9 @@ __metadata: dependencies: "@ensdomains/address-encoder": ^1.1.2 "@siddomains/sidjs": 0.1.29 - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 "@unstoppabledomains/resolution": ^9.2.2 @@ -3007,10 +3064,10 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 ethers: ^5.7.2 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -3026,9 +3083,9 @@ __metadata: resolution: "@enkryptcom/request@workspace:packages/request" dependencies: "@enkryptcom/types": "workspace:^" - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 chai: ^4.5.0 @@ -3036,12 +3093,12 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 eventemitter3: ^5.0.1 isomorphic-ws: ^5.0.0 json-rpc-2.0: ^1.7.0 - mocha: ^10.7.0 + mocha: ^10.7.3 node-fetch: ^2.7.0 prettier: ^2.8.8 reconnecting-websocket: ^4.4.0 @@ -3063,10 +3120,10 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@noble/secp256k1": 1.7.1 - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/hdkey": ^2.0.3 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3075,10 +3132,10 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 hdkey: ^2.1.0 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^9.0.2 ts-node: ^10.9.2 @@ -3097,11 +3154,11 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@ethereumjs/util": ^9.0.3 - "@types/chai": ^4.3.17 + "@ethereumjs/util": ^9.1.0 + "@types/chai": ^4.3.19 "@types/hdkey": ^2.0.3 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3110,10 +3167,10 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 hdkey: ^2.1.0 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -3133,10 +3190,10 @@ __metadata: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@polkadot/util-crypto": ^13.0.2 - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/hdkey": ^2.0.3 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3145,9 +3202,9 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^9.0.2 ts-node: ^10.9.2 @@ -3163,15 +3220,15 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/signer-polkadot@workspace:packages/signers/polkadot" dependencies: - "@commitlint/cli": ^19.3.0 + "@commitlint/cli": ^19.4.1 "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" "@polkadot/util": ^13.0.2 "@polkadot/util-crypto": ^13.0.2 "@polkadot/wasm-crypto": ^7.3.2 - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 assert: ^2.1.0 @@ -3180,9 +3237,9 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -3199,9 +3256,9 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 chai: ^4.5.0 @@ -3209,10 +3266,10 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 localforage: ^1.10.0 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -3229,10 +3286,10 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" - "@solana/web3.js": ^1.95.2 - "@types/chai": ^4.3.17 + "@solana/web3.js": ^1.95.3 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bignumber.js: ^9.1.2 @@ -3241,16 +3298,16 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 eventemitter3: ^5.0.1 isomorphic-ws: ^5.0.0 json-rpc-2.0: ^1.7.0 lodash: ^4.17.21 - mocha: ^10.7.0 + mocha: ^10.7.3 node-fetch: ^2.7.0 prettier: ^2.8.8 - rango-sdk-basic: ^0.1.52 + rango-sdk-basic: ^0.1.56 reconnecting-websocket: ^4.4.0 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -3269,14 +3326,14 @@ __metadata: version: 0.0.0-use.local resolution: "@enkryptcom/types@workspace:packages/types" dependencies: - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 prettier: ^2.8.8 ts-node: ^10.9.2 @@ -3292,11 +3349,11 @@ __metadata: resolution: "@enkryptcom/utils@workspace:packages/utils" dependencies: "@enkryptcom/types": "workspace:^" - "@ethereumjs/util": ^9.0.3 + "@ethereumjs/util": ^9.1.0 "@polkadot/util-crypto": ^13.0.2 - "@types/chai": ^4.3.17 + "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 - "@types/node": ^20.14.14 + "@types/node": ^20.16.5 "@typescript-eslint/eslint-plugin": ^5.62.0 "@typescript-eslint/parser": ^5.62.0 bip39: ^3.1.0 @@ -3305,10 +3362,10 @@ __metadata: eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.10.0 eslint-import-resolver-alias: ^1.1.2 - eslint-plugin-import: ^2.29.1 + eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 ethereum-cryptography: ^2.2.1 - mocha: ^10.7.0 + mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 ts-node: ^10.9.2 @@ -3834,15 +3891,6 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/common@npm:^4.2.0": - version: 4.2.0 - resolution: "@ethereumjs/common@npm:4.2.0" - dependencies: - "@ethereumjs/util": ^9.0.2 - checksum: ef97c688d2e9618bb1328d32f5f2f1a9e73b7b896ba5ca83d474d25f1b1b7411276c3448f594639af99fc9b07c8f840be21cbd04e3052324ce81f5014820d392 - languageName: node - linkType: hard - "@ethereumjs/common@npm:^4.3.0": version: 4.3.0 resolution: "@ethereumjs/common@npm:4.3.0" @@ -3852,6 +3900,15 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/common@npm:^4.4.0": + version: 4.4.0 + resolution: "@ethereumjs/common@npm:4.4.0" + dependencies: + "@ethereumjs/util": ^9.1.0 + checksum: 6b8cbfcfb5bdde839545c89dce3665706733260e26455d0eb3bcbc3c09e371ae629d51032b95d86f2aeeb15325244a6622171f9005165266fefd923eaa99f1c5 + languageName: node + linkType: hard + "@ethereumjs/rlp@npm:^4.0.1": version: 4.0.1 resolution: "@ethereumjs/rlp@npm:4.0.1" @@ -3902,23 +3959,6 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/tx@npm:^5.2.1": - version: 5.2.1 - resolution: "@ethereumjs/tx@npm:5.2.1" - dependencies: - "@ethereumjs/common": ^4.2.0 - "@ethereumjs/rlp": ^5.0.2 - "@ethereumjs/util": ^9.0.2 - ethereum-cryptography: ^2.1.3 - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - checksum: 851aafd64d094f6773c407c604697c3683ae9470dd79c427a3fda933bd9dbc247ca65f443bf0297aa546536fed8abf97d29a8a8d433bb2297529fd618e9ba81d - languageName: node - linkType: hard - "@ethereumjs/tx@npm:^5.3.0": version: 5.3.0 resolution: "@ethereumjs/tx@npm:5.3.0" @@ -3931,6 +3971,18 @@ __metadata: languageName: node linkType: hard +"@ethereumjs/tx@npm:^5.4.0": + version: 5.4.0 + resolution: "@ethereumjs/tx@npm:5.4.0" + dependencies: + "@ethereumjs/common": ^4.4.0 + "@ethereumjs/rlp": ^5.0.2 + "@ethereumjs/util": ^9.1.0 + ethereum-cryptography: ^2.2.1 + checksum: 72882a977dee4a15b5216ccdee906b6d9488e3ab93cadc1d6639a841e81b91c71d01221c56ac541026d592b8b33345cdc5468e711013e8fa33ac6da18089cf2c + languageName: node + linkType: hard + "@ethereumjs/util@npm:^8.1.0": version: 8.1.0 resolution: "@ethereumjs/util@npm:8.1.0" @@ -3942,28 +3994,23 @@ __metadata: languageName: node linkType: hard -"@ethereumjs/util@npm:^9.0.2": - version: 9.0.2 - resolution: "@ethereumjs/util@npm:9.0.2" +"@ethereumjs/util@npm:^9.0.3": + version: 9.0.3 + resolution: "@ethereumjs/util@npm:9.0.3" dependencies: "@ethereumjs/rlp": ^5.0.2 ethereum-cryptography: ^2.1.3 - peerDependencies: - c-kzg: ^2.1.2 - peerDependenciesMeta: - c-kzg: - optional: true - checksum: cfac8c92beafc3ad1e7d7bce59027cde1f3cfd32623dea57c2295afbc1e33549799d39f92bdcf3cb7a8626b4620b0ba90af945534773fc9480c59def0e25e07d + checksum: 231dae61268c84d514a6c992a770559bb94a21c753c02287d08781cbeae01a6e5b5479af9f0d3d412d532fda6e9b1eeb746e617a68b738907a4a8ee4e24d79a6 languageName: node linkType: hard -"@ethereumjs/util@npm:^9.0.3": - version: 9.0.3 - resolution: "@ethereumjs/util@npm:9.0.3" +"@ethereumjs/util@npm:^9.1.0": + version: 9.1.0 + resolution: "@ethereumjs/util@npm:9.1.0" dependencies: "@ethereumjs/rlp": ^5.0.2 - ethereum-cryptography: ^2.1.3 - checksum: 231dae61268c84d514a6c992a770559bb94a21c753c02287d08781cbeae01a6e5b5479af9f0d3d412d532fda6e9b1eeb746e617a68b738907a4a8ee4e24d79a6 + ethereum-cryptography: ^2.2.1 + checksum: 594e009c3001ca1ca658b4ded01b38e72f5dd5dd76389efd90cb020de099176a3327685557df268161ac3144333cfe8abaae68cda8ae035d9cc82409d386d79a languageName: node linkType: hard @@ -4671,6 +4718,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:0.3.9, @jridgewell/trace-mapping@npm:^0.3.0": version: 0.3.9 resolution: "@jridgewell/trace-mapping@npm:0.3.9" @@ -5047,14 +5101,14 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/cryptoassets@npm:^13.2.0": - version: 13.2.0 - resolution: "@ledgerhq/cryptoassets@npm:13.2.0" +"@ledgerhq/cryptoassets@npm:^13.3.0": + version: 13.3.0 + resolution: "@ledgerhq/cryptoassets@npm:13.3.0" dependencies: axios: ^1.6.0 bs58check: ^2.1.2 invariant: 2 - checksum: aec0547dcfc2e21241ede8fba154d11da306766ae73c7f1553f4cb445108c783d9b935481fa9e2cb67cb559ee63bc17507b2caec8c13bde613bb2b2bf9365013 + checksum: bd69ec96d02a02179102edb85ce350109da8d610e1f46f0069438a277c564216705331eb49c46f39170bd322f69490e1114eaa012e58abd9239adb480564b184 languageName: node linkType: hard @@ -5122,7 +5176,7 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/devices@npm:^8.4.0, @ledgerhq/devices@npm:^8.4.2": +"@ledgerhq/devices@npm:^8.4.2": version: 8.4.2 resolution: "@ledgerhq/devices@npm:8.4.2" dependencies: @@ -5149,18 +5203,18 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/domain-service@npm:^1.2.2": - version: 1.2.2 - resolution: "@ledgerhq/domain-service@npm:1.2.2" +"@ledgerhq/domain-service@npm:^1.2.3": + version: 1.2.3 + resolution: "@ledgerhq/domain-service@npm:1.2.3" dependencies: "@ledgerhq/errors": ^6.18.0 "@ledgerhq/logs": ^6.12.0 - "@ledgerhq/types-live": ^6.49.0 + "@ledgerhq/types-live": ^6.50.0 axios: ^1.3.4 eip55: ^2.1.1 react: ^18.2.0 react-dom: ^18.2.0 - checksum: 5a3aa9120e47a9e05270e41f4c1a5a57083218e7f45477ff31b4b371b6b5db4f280c6112ac80e79ce2ca0cb68c5eeb7edca7aa14d2cb1c3911e676ef99c4d793 + checksum: f4b7d2481f91f8b9ec078cfe3a2b42a73ce25888327e9e559a21bac553beae870e5522a7c13a02830de230a06560ddb18e16b5b2b7653d64240c91900fccffa8 languageName: node linkType: hard @@ -5185,7 +5239,7 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/errors@npm:^6.17.0, @ledgerhq/errors@npm:^6.18.0": +"@ledgerhq/errors@npm:^6.18.0": version: 6.18.0 resolution: "@ledgerhq/errors@npm:6.18.0" checksum: 167f9530ca7498aa2ebfd3e036d3269f917bc27d95540f8a2a566b454896d41fc15026ac53951be0befdd1a05f9a9c2d03a6de8c78752e57aee9bc28838c8a48 @@ -5205,16 +5259,16 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/evm-tools@npm:^1.1.2": - version: 1.1.2 - resolution: "@ledgerhq/evm-tools@npm:1.1.2" +"@ledgerhq/evm-tools@npm:^1.2.0": + version: 1.2.0 + resolution: "@ledgerhq/evm-tools@npm:1.2.0" dependencies: - "@ledgerhq/cryptoassets": ^13.2.0 - "@ledgerhq/live-env": ^2.1.0 + "@ledgerhq/cryptoassets": ^13.3.0 + "@ledgerhq/live-env": ^2.2.0 axios: ^1.6.5 crypto-js: 4.2.0 ethers: 5.7.2 - checksum: 4ba7d891d8bc7b68701dbe55098c1bb5b4d6ea7ad18e56dc6b1eefb6f976346aa9b49aa8d34ce395b4049cbe1345417e532b71dfff74371bed14a1c73b03810f + checksum: ab223c77bd681883d57adc470f891cc813b8c1523ad0d579871669e1aad662bba29adaf702d716a51af64b5709d5c625ab291bd6dd275d669e1d4798e04b478e languageName: node linkType: hard @@ -5303,23 +5357,24 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-app-eth@npm:^6.37.3": - version: 6.37.3 - resolution: "@ledgerhq/hw-app-eth@npm:6.37.3" +"@ledgerhq/hw-app-eth@npm:^6.38.0": + version: 6.38.0 + resolution: "@ledgerhq/hw-app-eth@npm:6.38.0" dependencies: "@ethersproject/abi": ^5.5.0 "@ethersproject/rlp": ^5.5.0 - "@ledgerhq/cryptoassets": ^13.2.0 - "@ledgerhq/domain-service": ^1.2.2 + "@ledgerhq/cryptoassets": ^13.3.0 + "@ledgerhq/domain-service": ^1.2.3 "@ledgerhq/errors": ^6.18.0 - "@ledgerhq/evm-tools": ^1.1.2 + "@ledgerhq/evm-tools": ^1.2.0 "@ledgerhq/hw-transport": ^6.31.2 "@ledgerhq/hw-transport-mocker": ^6.29.2 "@ledgerhq/logs": ^6.12.0 - "@ledgerhq/types-live": ^6.49.0 + "@ledgerhq/types-live": ^6.50.0 axios: ^1.3.4 bignumber.js: ^9.1.2 - checksum: 93d46e4570d76f65f403db619dc35923282a762ef68f90ae32acbaef24f288c436b8c99abe7a293c1256558f10100a949484de9da83aea2ff932345445af0d6c + semver: ^7.3.5 + checksum: c08675b73c8ef4d7b493143cad0dad9a07742a5a167df7d29187a06e2b95fb7160ce9f6d08664d62cfb3d9fdaa47a09378a6dd6224ebafeeb7a5fa642d9e642d languageName: node linkType: hard @@ -5541,15 +5596,15 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:6.31.0": - version: 6.31.0 - resolution: "@ledgerhq/hw-transport@npm:6.31.0" +"@ledgerhq/hw-transport@npm:6.31.2, @ledgerhq/hw-transport@npm:^6.31.2": + version: 6.31.2 + resolution: "@ledgerhq/hw-transport@npm:6.31.2" dependencies: - "@ledgerhq/devices": ^8.4.0 - "@ledgerhq/errors": ^6.17.0 + "@ledgerhq/devices": ^8.4.2 + "@ledgerhq/errors": ^6.18.0 "@ledgerhq/logs": ^6.12.0 events: ^3.3.0 - checksum: 97911686ed4de1aaedcde364616c36a9831278002d7a168ea8469c0ce79d1712ded53c1f6deec3b7a86b76cad8b7ad4ba819670e864b1acfeb873271a829ee36 + checksum: 61f9fc0c9576bd2247f8ac660efc32f50ffaf7c099d6f0270d8ea66e624dab00c8a58586aed14e4c56ff6462c76f01e4e5e5d3ca7d6920beafb51b29b840b3ad languageName: node linkType: hard @@ -5576,18 +5631,6 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/hw-transport@npm:^6.31.2": - version: 6.31.2 - resolution: "@ledgerhq/hw-transport@npm:6.31.2" - dependencies: - "@ledgerhq/devices": ^8.4.2 - "@ledgerhq/errors": ^6.18.0 - "@ledgerhq/logs": ^6.12.0 - events: ^3.3.0 - checksum: 61f9fc0c9576bd2247f8ac660efc32f50ffaf7c099d6f0270d8ea66e624dab00c8a58586aed14e4c56ff6462c76f01e4e5e5d3ca7d6920beafb51b29b840b3ad - languageName: node - linkType: hard - "@ledgerhq/hw-transport@npm:~5.11.0": version: 5.11.0 resolution: "@ledgerhq/hw-transport@npm:5.11.0" @@ -5825,13 +5868,13 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/live-env@npm:^2.1.0": - version: 2.1.0 - resolution: "@ledgerhq/live-env@npm:2.1.0" +"@ledgerhq/live-env@npm:^2.2.0": + version: 2.2.0 + resolution: "@ledgerhq/live-env@npm:2.2.0" dependencies: rxjs: ^7.8.1 utility-types: ^3.10.0 - checksum: 7a6ad5274b34c94fc465c61b248185ddc2a4f0eca12d865fa7bf9ef71962c7808835fd42eba0e95545376653d53f29bc9ebf27a4522e3d8ac5a6faa2ffe2e84c + checksum: 0bd605d83b35268fa33e93045117ecb8a2829b4b2e93f92b01fe8f7fb8329f79b8706d70122138d3a23b3a47697fb8e67745d82449579cca53b5fcdf5f8fd662 languageName: node linkType: hard @@ -5914,13 +5957,13 @@ __metadata: languageName: node linkType: hard -"@ledgerhq/types-live@npm:^6.49.0": - version: 6.49.0 - resolution: "@ledgerhq/types-live@npm:6.49.0" +"@ledgerhq/types-live@npm:^6.50.0": + version: 6.50.0 + resolution: "@ledgerhq/types-live@npm:6.50.0" dependencies: bignumber.js: ^9.1.2 rxjs: ^7.8.1 - checksum: 1d09725cd1075e81a55e2d171322db21991bf4838981cad3cb923c8422493130ed5373a5ad06b9d3b3fe0231a39a3e600cc171a2a7e51d2c1fde6ce24d94a557 + checksum: 145f62b24f6a1e4894945c6b130ccb6c48d7fc557896f054f0ff890fb2abaffcb256e69abbe8a9a80e9f550ee55f5ff49ed2b4b7426e6010e25e4c4a23d0396b languageName: node linkType: hard @@ -6040,33 +6083,33 @@ __metadata: languageName: node linkType: hard -"@metaplex-foundation/mpl-bubblegum@npm:^4.2.0": - version: 4.2.0 - resolution: "@metaplex-foundation/mpl-bubblegum@npm:4.2.0" +"@metaplex-foundation/mpl-bubblegum@npm:^4.2.1": + version: 4.2.1 + resolution: "@metaplex-foundation/mpl-bubblegum@npm:4.2.1" dependencies: "@metaplex-foundation/digital-asset-standard-api": ^1.0.4 - "@metaplex-foundation/mpl-token-metadata": 3.0.0-alpha.27 + "@metaplex-foundation/mpl-token-metadata": 3.2.1 "@metaplex-foundation/mpl-toolbox": ^0.9.0 "@noble/hashes": ^1.3.1 merkletreejs: ^0.3.9 peerDependencies: "@metaplex-foundation/umi": ">= 0.8.9 < 1" - checksum: 66e9a6d5bd6a672fa359596ca32945de010eb51a9eb9106945b1538d88ac05993667642103684e9d660fc375d2b51b5b3ac6a02835058bb421a963b7e58a02a3 + checksum: 46266b9deea246196d160d7d1dcf5c3b5af6dd7734852dce8b36284d49f1ee6ca59a13790ecdcbbf58813abe1b6c26fa6e00ecd101e6e95b7649c1f9ac8602d6 languageName: node linkType: hard -"@metaplex-foundation/mpl-token-metadata@npm:3.0.0-alpha.27": - version: 3.0.0-alpha.27 - resolution: "@metaplex-foundation/mpl-token-metadata@npm:3.0.0-alpha.27" +"@metaplex-foundation/mpl-token-metadata@npm:3.2.1": + version: 3.2.1 + resolution: "@metaplex-foundation/mpl-token-metadata@npm:3.2.1" dependencies: - "@metaplex-foundation/mpl-toolbox": ^0.9.0 + "@metaplex-foundation/mpl-toolbox": ^0.9.4 peerDependencies: - "@metaplex-foundation/umi": ^0.8.2 - checksum: ec79071615b418a4efcfac50616dc6a873f6a827589a5c83990e68e8aa3617813893f8574268cdd53d0cb0330997a979913494ee2e1a722b7716f5536dd579a4 + "@metaplex-foundation/umi": ">= 0.8.2 < 1" + checksum: 2bb3f261741f72953290a12f37862513b65d97284bb15b7baa7793766046a830780d75fec1a044f3c6afeee9f2ea3d19a0fcb7bfb10c4d266e2e80307c4f4377 languageName: node linkType: hard -"@metaplex-foundation/mpl-toolbox@npm:^0.9.0": +"@metaplex-foundation/mpl-toolbox@npm:^0.9.0, @metaplex-foundation/mpl-toolbox@npm:^0.9.4": version: 0.9.4 resolution: "@metaplex-foundation/mpl-toolbox@npm:0.9.4" peerDependencies: @@ -6437,7 +6480,7 @@ __metadata: languageName: node linkType: hard -"@noble/curves@npm:^1.0.0, @noble/curves@npm:^1.1.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.3.0, @noble/curves@npm:^1.4.0, @noble/curves@npm:~1.4.0": +"@noble/curves@npm:^1.0.0, @noble/curves@npm:^1.1.0, @noble/curves@npm:^1.2.0, @noble/curves@npm:^1.3.0, @noble/curves@npm:~1.4.0": version: 1.4.0 resolution: "@noble/curves@npm:1.4.0" dependencies: @@ -6606,148 +6649,151 @@ __metadata: languageName: node linkType: hard -"@polkadot-api/json-rpc-provider-proxy@npm:0.0.1": - version: 0.0.1 - resolution: "@polkadot-api/json-rpc-provider-proxy@npm:0.0.1" - checksum: cf8daf52ff6d92f26c6027f13ef5fbef9e512626e0225bc8408b79002cfd34fc17c5f2d856beebcb01aa5f84c93ccc8272f9264dc8349b7f6cb63845b30119b5 +"@polkadot-api/json-rpc-provider-proxy@npm:^0.1.0": + version: 0.1.0 + resolution: "@polkadot-api/json-rpc-provider-proxy@npm:0.1.0" + checksum: 3dcfa50dfa9c1b5654d97d818ae85042facfdf47b71c418f069d664eba149c6be10eb02a8e8de011ce8753a813e214fff195f45f55851b8cfc7f60138fe9dfb2 languageName: node linkType: hard -"@polkadot-api/json-rpc-provider@npm:0.0.1": +"@polkadot-api/json-rpc-provider@npm:0.0.1, @polkadot-api/json-rpc-provider@npm:^0.0.1": version: 0.0.1 resolution: "@polkadot-api/json-rpc-provider@npm:0.0.1" checksum: 1f315bdadcba7def7145011132e6127b983c6f91f976be217ad7d555bb96a67f3a270fe4a46e427531822c5d54d353d84a6439d112a99cdfc07013d3b662ee3c languageName: node linkType: hard -"@polkadot-api/metadata-builders@npm:0.0.1": - version: 0.0.1 - resolution: "@polkadot-api/metadata-builders@npm:0.0.1" +"@polkadot-api/metadata-builders@npm:0.3.2": + version: 0.3.2 + resolution: "@polkadot-api/metadata-builders@npm:0.3.2" dependencies: - "@polkadot-api/substrate-bindings": 0.0.1 - "@polkadot-api/utils": 0.0.1 - checksum: 7cf69e583e64f0ea1b90b141d9f61c4b0ba445daf87d4eba25bfcaa629c95cf4bbe6d89f5263dc495189fae0795c45810a004a2a8fbf59ece01ae71e1e049f17 + "@polkadot-api/substrate-bindings": 0.6.0 + "@polkadot-api/utils": 0.1.0 + checksum: e37a664ac2582048a0dd0357b378349f2165eb2f0902f7bc3aa7ec7b84735cba2b4103d36169089671c422caab30af00467cf2866c1456fc668f57ff1c8d3b55 languageName: node linkType: hard -"@polkadot-api/observable-client@npm:0.1.0": - version: 0.1.0 - resolution: "@polkadot-api/observable-client@npm:0.1.0" +"@polkadot-api/observable-client@npm:^0.3.0": + version: 0.3.2 + resolution: "@polkadot-api/observable-client@npm:0.3.2" dependencies: - "@polkadot-api/metadata-builders": 0.0.1 - "@polkadot-api/substrate-bindings": 0.0.1 - "@polkadot-api/substrate-client": 0.0.1 - "@polkadot-api/utils": 0.0.1 + "@polkadot-api/metadata-builders": 0.3.2 + "@polkadot-api/substrate-bindings": 0.6.0 + "@polkadot-api/utils": 0.1.0 peerDependencies: + "@polkadot-api/substrate-client": 0.1.4 rxjs: ">=7.8.0" - checksum: 694ee405f40ce47eb8d23dd2fc68359a5016c54ac530893a76e772a2d6a1a7c09c3a11d772b7c196af4faa29e98a443849334b97c6bf91af616990b4c7834caa + checksum: a559a815c11fe29c5ce1d69e132bbfb451abd1de3fa2c701fa60777388c3730fb86acd7f6e3d9580ae50a148c742d4562aca90070c04c70fa9d45f9d5148b448 languageName: node linkType: hard -"@polkadot-api/substrate-bindings@npm:0.0.1": - version: 0.0.1 - resolution: "@polkadot-api/substrate-bindings@npm:0.0.1" +"@polkadot-api/substrate-bindings@npm:0.6.0": + version: 0.6.0 + resolution: "@polkadot-api/substrate-bindings@npm:0.6.0" dependencies: "@noble/hashes": ^1.3.1 - "@polkadot-api/utils": 0.0.1 + "@polkadot-api/utils": 0.1.0 "@scure/base": ^1.1.1 scale-ts: ^1.6.0 - checksum: fc49e49ffe749fc6fab49eee1d10d47fcd1fa3a9b6ca4e7bbde4e9741b9e062cd4e9271fd86a2525095ff36bf33b95d57c51efb88635bb60b2c77fa9e83b2cd6 + checksum: c752d52dbea2b332357652b5475297ee6fa2f1ab8adffa7bd697522df5a42a0c358aec6f558523fd6f38ab20ab54ed0bda284c0c0424d917c1c68ef435dde4a4 languageName: node linkType: hard -"@polkadot-api/substrate-client@npm:0.0.1": - version: 0.0.1 - resolution: "@polkadot-api/substrate-client@npm:0.0.1" - checksum: 13dc05f1fce0d00241b48d262d691a740c65b107800cdfdf8d800333e9b3950932ce50a88bf65810892e43103bf57d1541c71538e68aa27b9aba55b389835b91 +"@polkadot-api/substrate-client@npm:^0.1.2": + version: 0.1.4 + resolution: "@polkadot-api/substrate-client@npm:0.1.4" + dependencies: + "@polkadot-api/json-rpc-provider": 0.0.1 + "@polkadot-api/utils": 0.1.0 + checksum: b975bdf030523ea7620ef58b50ca1d258266656f040a95fa7875a59535a935b05d23d893090fc1216b0e119327b2df329a1aaca84c8893f5924b9536d2ed8473 languageName: node linkType: hard -"@polkadot-api/utils@npm:0.0.1": - version: 0.0.1 - resolution: "@polkadot-api/utils@npm:0.0.1" - checksum: 11e67019cbf6dd39997d772edf14296c1b156d7a59c7726ce117b438ee85a5e50e305514a2a93cba87fdce1380fcf045931f2fb959df3a43bb327e77ac876148 +"@polkadot-api/utils@npm:0.1.0": + version: 0.1.0 + resolution: "@polkadot-api/utils@npm:0.1.0" + checksum: 55f39cf6949e54b763fc67e5132ae7d1095bf28f8413895dcec7e5778d9fe345b1ce9fe08f127c84f79fb9aedd51f045aa8ed84b2a72f4217047a91d2ecb4c27 languageName: node linkType: hard -"@polkadot/api-augment@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/api-augment@npm:12.2.3" +"@polkadot/api-augment@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/api-augment@npm:12.4.2" dependencies: - "@polkadot/api-base": 12.2.3 - "@polkadot/rpc-augment": 12.2.3 - "@polkadot/types": 12.2.3 - "@polkadot/types-augment": 12.2.3 - "@polkadot/types-codec": 12.2.3 + "@polkadot/api-base": 12.4.2 + "@polkadot/rpc-augment": 12.4.2 + "@polkadot/types": 12.4.2 + "@polkadot/types-augment": 12.4.2 + "@polkadot/types-codec": 12.4.2 "@polkadot/util": ^13.0.2 - tslib: ^2.6.2 - checksum: bf40a0db154865f59c495ea938cb0aabcb16e7d14b3443655dcd73ea2b907ce1fb65a88ee6d9cfb0c1c5da25641de08a0cde62ca40c457e83aa7408766ca5322 + tslib: ^2.6.3 + checksum: 95ca6ad35b682918d989523ec25153dc1d4beab51b7dba2d8cf0a699b6337db85715dbe32bd704e47ffe964226ee2054def76f87f2c932f5d4ee2be0164c1131 languageName: node linkType: hard -"@polkadot/api-base@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/api-base@npm:12.2.3" +"@polkadot/api-base@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/api-base@npm:12.4.2" dependencies: - "@polkadot/rpc-core": 12.2.3 - "@polkadot/types": 12.2.3 + "@polkadot/rpc-core": 12.4.2 + "@polkadot/types": 12.4.2 "@polkadot/util": ^13.0.2 rxjs: ^7.8.1 - tslib: ^2.6.2 - checksum: 93671b0386f1cb7c4554ac1d287ced15aafe30ffffc79f356f21380bb71ec4202d17c6c120fc87d1a4fcccc032d96e9e3aa18ed3d794338d09223daf90039e77 + tslib: ^2.6.3 + checksum: 56c5933217f14e034db39c81f6fa308f2604507bbde820ca67f316ba6a390200dafade1d990ba4d6f1d2bedb94d567cb27435efe341dabf06af2388d457fc4b7 languageName: node linkType: hard -"@polkadot/api-derive@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/api-derive@npm:12.2.3" +"@polkadot/api-derive@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/api-derive@npm:12.4.2" dependencies: - "@polkadot/api": 12.2.3 - "@polkadot/api-augment": 12.2.3 - "@polkadot/api-base": 12.2.3 - "@polkadot/rpc-core": 12.2.3 - "@polkadot/types": 12.2.3 - "@polkadot/types-codec": 12.2.3 + "@polkadot/api": 12.4.2 + "@polkadot/api-augment": 12.4.2 + "@polkadot/api-base": 12.4.2 + "@polkadot/rpc-core": 12.4.2 + "@polkadot/types": 12.4.2 + "@polkadot/types-codec": 12.4.2 "@polkadot/util": ^13.0.2 "@polkadot/util-crypto": ^13.0.2 rxjs: ^7.8.1 - tslib: ^2.6.2 - checksum: 86af8b1c3b32f9c39ba0b9276163e82490034261a16ccd5e9cf1a1346bc9d30f9ee8141ed1e60d614ed9eb65f10879110cbce2aaa24d078bc261ccca782c261f + tslib: ^2.6.3 + checksum: a209e498772ea33fe587327196f13b9779b7054bd986c48c8efeb8fe9c298a375ef478c72fe39f0afec303d418859deb2d8822b554b55640caf1c06e12beeaf1 languageName: node linkType: hard -"@polkadot/api@npm:12.2.3, @polkadot/api@npm:^12.2.1, @polkadot/api@npm:^12.2.3": - version: 12.2.3 - resolution: "@polkadot/api@npm:12.2.3" +"@polkadot/api@npm:12.4.2, @polkadot/api@npm:^12.4.1, @polkadot/api@npm:^12.4.2": + version: 12.4.2 + resolution: "@polkadot/api@npm:12.4.2" dependencies: - "@polkadot/api-augment": 12.2.3 - "@polkadot/api-base": 12.2.3 - "@polkadot/api-derive": 12.2.3 + "@polkadot/api-augment": 12.4.2 + "@polkadot/api-base": 12.4.2 + "@polkadot/api-derive": 12.4.2 "@polkadot/keyring": ^13.0.2 - "@polkadot/rpc-augment": 12.2.3 - "@polkadot/rpc-core": 12.2.3 - "@polkadot/rpc-provider": 12.2.3 - "@polkadot/types": 12.2.3 - "@polkadot/types-augment": 12.2.3 - "@polkadot/types-codec": 12.2.3 - "@polkadot/types-create": 12.2.3 - "@polkadot/types-known": 12.2.3 + "@polkadot/rpc-augment": 12.4.2 + "@polkadot/rpc-core": 12.4.2 + "@polkadot/rpc-provider": 12.4.2 + "@polkadot/types": 12.4.2 + "@polkadot/types-augment": 12.4.2 + "@polkadot/types-codec": 12.4.2 + "@polkadot/types-create": 12.4.2 + "@polkadot/types-known": 12.4.2 "@polkadot/util": ^13.0.2 "@polkadot/util-crypto": ^13.0.2 eventemitter3: ^5.0.1 rxjs: ^7.8.1 - tslib: ^2.6.2 - checksum: 08c1600b090b6d52ab20e7f662a80ab3a91dce39ecca68fae7985b6fa720fb86cb7603824d37ec8921d27e3c74dd1e8d1fec9acca91d10b6cd7054bb80a6b001 + tslib: ^2.6.3 + checksum: 763e24b6d65c6a573d5d02153b35be9a4f7fa76101e3ad163dbfb46d7c0cd27904d28e92058c405dcd5ea2585788663ccaae406da09479b4bce4496e8f8a6f11 languageName: node linkType: hard -"@polkadot/extension-inject@npm:^0.50.1": - version: 0.50.1 - resolution: "@polkadot/extension-inject@npm:0.50.1" +"@polkadot/extension-inject@npm:^0.52.3": + version: 0.52.3 + resolution: "@polkadot/extension-inject@npm:0.52.3" dependencies: - "@polkadot/api": ^12.2.1 - "@polkadot/rpc-provider": ^12.2.1 - "@polkadot/types": ^12.2.1 + "@polkadot/api": ^12.4.1 + "@polkadot/rpc-provider": ^12.4.1 + "@polkadot/types": ^12.4.1 "@polkadot/util": ^13.0.2 "@polkadot/util-crypto": ^13.0.2 "@polkadot/x-global": ^13.0.2 @@ -6755,7 +6801,7 @@ __metadata: peerDependencies: "@polkadot/api": "*" "@polkadot/util": "*" - checksum: 2cff1aca27e94778a38b0c51dc81c2437f64dfe07126061d1965c4d33cd620b62955e2266eb023798cd3472231083cbabb5f16de1c990dd9a413561545383efe + checksum: d3bb7d7f9ece9d21978561925d11ddfc4cf78206cca6b68d55fe53a9e0196eedddf6d087764f4fe76e63d7f2898e588c5f9bbe71727a2baa84b2d3c97e59074f languageName: node linkType: hard @@ -6820,54 +6866,54 @@ __metadata: languageName: node linkType: hard -"@polkadot/rpc-augment@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/rpc-augment@npm:12.2.3" +"@polkadot/rpc-augment@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/rpc-augment@npm:12.4.2" dependencies: - "@polkadot/rpc-core": 12.2.3 - "@polkadot/types": 12.2.3 - "@polkadot/types-codec": 12.2.3 + "@polkadot/rpc-core": 12.4.2 + "@polkadot/types": 12.4.2 + "@polkadot/types-codec": 12.4.2 "@polkadot/util": ^13.0.2 - tslib: ^2.6.2 - checksum: 97d0b2c5451d5cb96e84569b0c5e2763abd83def4704def25f6ad728ca8eddc4c3872bd5afb26d9a8be28273f2bd927d1292b0e480727b0fe302548c5c432ae8 + tslib: ^2.6.3 + checksum: 0b329278b8b7217cdb87d451ed16e57f0d357db4e62f06d0315eea3f18db5be0078594dd0984896483f78c81d12e9bb62314c141d0a895f4e997ff49e981d2c5 languageName: node linkType: hard -"@polkadot/rpc-core@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/rpc-core@npm:12.2.3" +"@polkadot/rpc-core@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/rpc-core@npm:12.4.2" dependencies: - "@polkadot/rpc-augment": 12.2.3 - "@polkadot/rpc-provider": 12.2.3 - "@polkadot/types": 12.2.3 + "@polkadot/rpc-augment": 12.4.2 + "@polkadot/rpc-provider": 12.4.2 + "@polkadot/types": 12.4.2 "@polkadot/util": ^13.0.2 rxjs: ^7.8.1 - tslib: ^2.6.2 - checksum: bf0ff9d66ce3581751d0d0c26fd469e8b8d53bb50fdfd0e5da5cfbe1e811eefdf9c57cfbbb5f89e41ffc9ba44b0ea42ab8d73175d5a85ce73c1673c04e452003 + tslib: ^2.6.3 + checksum: 5a925296e14b4db61b1e37597934ad6a75b8cd7c195d5ef4a50dc200b453fdd86908770308076fe89364be280ad5777b187657b465486767baae67c163906258 languageName: node linkType: hard -"@polkadot/rpc-provider@npm:12.2.3, @polkadot/rpc-provider@npm:^12.2.1, @polkadot/rpc-provider@npm:^12.2.3": - version: 12.2.3 - resolution: "@polkadot/rpc-provider@npm:12.2.3" +"@polkadot/rpc-provider@npm:12.4.2, @polkadot/rpc-provider@npm:^12.4.1, @polkadot/rpc-provider@npm:^12.4.2": + version: 12.4.2 + resolution: "@polkadot/rpc-provider@npm:12.4.2" dependencies: "@polkadot/keyring": ^13.0.2 - "@polkadot/types": 12.2.3 - "@polkadot/types-support": 12.2.3 + "@polkadot/types": 12.4.2 + "@polkadot/types-support": 12.4.2 "@polkadot/util": ^13.0.2 "@polkadot/util-crypto": ^13.0.2 "@polkadot/x-fetch": ^13.0.2 "@polkadot/x-global": ^13.0.2 "@polkadot/x-ws": ^13.0.2 - "@substrate/connect": 0.8.10 + "@substrate/connect": 0.8.11 eventemitter3: ^5.0.1 mock-socket: ^9.3.1 - nock: ^13.5.0 - tslib: ^2.6.2 + nock: ^13.5.4 + tslib: ^2.6.3 dependenciesMeta: "@substrate/connect": optional: true - checksum: 88d7f7ce64c73bd2c118510aa0ae399707fd2e1b3420d593c76f7e5de570484ee48f0fbf4fcac9c0fe75da6d3beb0efe3d4f115dff16be509301819563f8cf52 + checksum: 029c2e7628271f5bb7ab4688adc14dcb3a6d13c00a2e1404f96f8a81188c51573d116e4c869b55faae54979afe319e4121404b956487784d52b5fd4a4c59bf26 languageName: node linkType: hard @@ -6883,15 +6929,15 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-augment@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/types-augment@npm:12.2.3" +"@polkadot/types-augment@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-augment@npm:12.4.2" dependencies: - "@polkadot/types": 12.2.3 - "@polkadot/types-codec": 12.2.3 + "@polkadot/types": 12.4.2 + "@polkadot/types-codec": 12.4.2 "@polkadot/util": ^13.0.2 - tslib: ^2.6.2 - checksum: f5e47c7764f655f7275162ccd080426ab0c23572fa8905134a792ed5917b302c1c71180d3a8051a61825698f4f00b072b5d6e7e4f9daed3414a3b2c223e7e7ee + tslib: ^2.6.3 + checksum: 15c0d82e190e97dd91df068d3cd9717364fbdfb1c8f3f873ff5c9156b76ee0ae78550d935dd2f4cf7e47d477e7132575d1154c27f3eccb78676e001fea9945c1 languageName: node linkType: hard @@ -6906,14 +6952,14 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-codec@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/types-codec@npm:12.2.3" +"@polkadot/types-codec@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-codec@npm:12.4.2" dependencies: "@polkadot/util": ^13.0.2 "@polkadot/x-bigint": ^13.0.2 - tslib: ^2.6.2 - checksum: 6f1cd31a6356cfe6f3210060dd7078030236c8dc2dac44e80110e614e6076087b9b7204664de2ba9e23e1cb7249b1bba3bb022df28c7a61d855ebb9a0aa70bf1 + tslib: ^2.6.3 + checksum: d5357e70c1e48a3e34bfffdbc1c88d59fa014c984bcdb09fa61153ed0afe96908852c235112b215b26e4ff8cd86e7167fad8a73a57cc6da473ef5d0e214ee8ec languageName: node linkType: hard @@ -6928,14 +6974,14 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-create@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/types-create@npm:12.2.3" +"@polkadot/types-create@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-create@npm:12.4.2" dependencies: - "@polkadot/types-codec": 12.2.3 + "@polkadot/types-codec": 12.4.2 "@polkadot/util": ^13.0.2 - tslib: ^2.6.2 - checksum: 5397bf6f850552155e3381ea81b211e564fbf7c2271805e7bded6b1d7ad54409dcd1fd1354bf7be10bbc96f02576d8199ed7f6110b02935cdea7eb369d1cbaeb + tslib: ^2.6.3 + checksum: 44b2491a1feaba192f818e9ab3ace507e8c6d155f5451f3324342edee1bd2a21b65020a41c4e258ce4900c7209d7dffe7f31b1a9425dad44a26d7f28fe8480a5 languageName: node linkType: hard @@ -6953,27 +6999,27 @@ __metadata: languageName: node linkType: hard -"@polkadot/types-known@npm:12.2.3, @polkadot/types-known@npm:^12.2.3": - version: 12.2.3 - resolution: "@polkadot/types-known@npm:12.2.3" +"@polkadot/types-known@npm:12.4.2, @polkadot/types-known@npm:^12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-known@npm:12.4.2" dependencies: "@polkadot/networks": ^13.0.2 - "@polkadot/types": 12.2.3 - "@polkadot/types-codec": 12.2.3 - "@polkadot/types-create": 12.2.3 + "@polkadot/types": 12.4.2 + "@polkadot/types-codec": 12.4.2 + "@polkadot/types-create": 12.4.2 "@polkadot/util": ^13.0.2 - tslib: ^2.6.2 - checksum: e2499edb751d8e38925512ff0e1396c5fe456e42d71fbdf090af8fe8dc14ac381fd747cd0b6a8c2492f90f2e6d48a0fc26a1da2cc7c8166648782f09916fc956 + tslib: ^2.6.3 + checksum: 9410347693b1c14d8a1fa52e3a633b1345ceae34ca6e63f86dd87666bf752da47dff7f8aa60f249d640151025034078cf837c18929ac0d72d626159c045a1a02 languageName: node linkType: hard -"@polkadot/types-support@npm:12.2.3": - version: 12.2.3 - resolution: "@polkadot/types-support@npm:12.2.3" +"@polkadot/types-support@npm:12.4.2": + version: 12.4.2 + resolution: "@polkadot/types-support@npm:12.4.2" dependencies: "@polkadot/util": ^13.0.2 - tslib: ^2.6.2 - checksum: dc681525f49129b8a2201f81e64032ac01ec84add507beb2e44dc8046246657645e6e7ed92012a03dfc08ea1167d5c4704c650396e0614ed2bc694054fc0a1d0 + tslib: ^2.6.3 + checksum: 77b96fa39717fbe0104b995a95b90e51e849f151de8d922e75f03a99c1b60aa1ee65029832b16e791692b4f3c17668ad8777fb6d2ce3f6019ca9aa01ba2135b0 languageName: node linkType: hard @@ -6993,32 +7039,32 @@ __metadata: languageName: node linkType: hard -"@polkadot/types@npm:12.2.3, @polkadot/types@npm:^12.2.1, @polkadot/types@npm:^12.2.3": - version: 12.2.3 - resolution: "@polkadot/types@npm:12.2.3" +"@polkadot/types@npm:12.4.2, @polkadot/types@npm:^12.4.1, @polkadot/types@npm:^12.4.2": + version: 12.4.2 + resolution: "@polkadot/types@npm:12.4.2" dependencies: "@polkadot/keyring": ^13.0.2 - "@polkadot/types-augment": 12.2.3 - "@polkadot/types-codec": 12.2.3 - "@polkadot/types-create": 12.2.3 + "@polkadot/types-augment": 12.4.2 + "@polkadot/types-codec": 12.4.2 + "@polkadot/types-create": 12.4.2 "@polkadot/util": ^13.0.2 "@polkadot/util-crypto": ^13.0.2 rxjs: ^7.8.1 - tslib: ^2.6.2 - checksum: 00b61ecb7a5d9c1ef1da568682c0fe65f28a5a16735944b0f7659943cf9dc15e6941824bd8e32920780ea507b5bf34472d393210cbf24dfe89c3fe84d1a5985d + tslib: ^2.6.3 + checksum: 7916d6ce73bc36e03582113114df01677f0cbfb780349d630f0da7a3413da42dbf9e9d5c97abdfb1918d67f6954c06ea3380cb162297c26503aa18b220ecec9d languageName: node linkType: hard -"@polkadot/ui-shared@npm:^3.8.3": - version: 3.8.3 - resolution: "@polkadot/ui-shared@npm:3.8.3" +"@polkadot/ui-shared@npm:^3.9.1": + version: 3.9.1 + resolution: "@polkadot/ui-shared@npm:3.9.1" dependencies: colord: ^2.9.3 tslib: ^2.6.2 peerDependencies: "@polkadot/util": "*" "@polkadot/util-crypto": "*" - checksum: f4d60b5de2b9dd963f167fd1c9ace99c735498b2b797103f706750cb90d6d91a82bfb9441515c7871dfc4e6e05e26c070bae64f37619e563cbeed8d88e8f4ab1 + checksum: 8a9749c5e455342f659315b62042f4f28e4d1f8570c6164c4576f0282e192ae4869626604c40efde859c73751f8e5b2d7dfe55d08b9fc71817127da42314ae63 languageName: node linkType: hard @@ -7583,9 +7629,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.20.0" +"@rollup/rollup-android-arm-eabi@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.2" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -7597,9 +7643,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-android-arm64@npm:4.20.0" +"@rollup/rollup-android-arm64@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-android-arm64@npm:4.21.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -7611,9 +7657,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.20.0" +"@rollup/rollup-darwin-arm64@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.21.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -7625,9 +7671,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.20.0" +"@rollup/rollup-darwin-x64@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.21.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -7639,9 +7685,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.20.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard @@ -7653,9 +7699,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.20.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard @@ -7667,9 +7713,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.20.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard @@ -7681,9 +7727,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.20.0" +"@rollup/rollup-linux-arm64-musl@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard @@ -7695,9 +7741,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.20.0" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard @@ -7709,9 +7755,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.20.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard @@ -7723,9 +7769,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.20.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard @@ -7737,9 +7783,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.20.0" +"@rollup/rollup-linux-x64-gnu@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard @@ -7751,9 +7797,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.20.0" +"@rollup/rollup-linux-x64-musl@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard @@ -7765,9 +7811,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.20.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -7779,9 +7825,9 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.20.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -7793,13 +7839,20 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.20.0": - version: 4.20.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.20.0" +"@rollup/rollup-win32-x64-msvc@npm:4.21.2": + version: 4.21.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 + languageName: node + linkType: hard + "@scure/base@npm:^1.1.1, @scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0": version: 1.1.3 resolution: "@scure/base@npm:1.1.3" @@ -7982,15 +8035,16 @@ __metadata: languageName: node linkType: hard -"@solana-developers/helpers@npm:^2.4.0": - version: 2.4.0 - resolution: "@solana-developers/helpers@npm:2.4.0" +"@solana-developers/helpers@npm:^2.5.4": + version: 2.5.4 + resolution: "@solana-developers/helpers@npm:2.5.4" dependencies: "@solana/spl-token": ^0.4.8 + "@solana/spl-token-metadata": ^0.1.4 "@solana/web3.js": ^1.95.2 bs58: ^6.0.0 dotenv: ^16.4.5 - checksum: 847e1676ebab87b5f7420a9440b0a45d5ba36ac2813e0b0052e937de2b2c52e735e6f664b84364468f6908f573891c30dd70c86311b3f21bedd17c170a2db82e + checksum: 71cd167887c0df7b97186809136ea42d808d0d03b8c6f77fd384aac0aec97dd725ab9bfdd1f42818e4f3130e616d63d98dbd90d38f9a3b54d71824e0bfb41862 languageName: node linkType: hard @@ -8035,6 +8089,17 @@ __metadata: languageName: node linkType: hard +"@solana/codecs-core@npm:2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@solana/codecs-core@npm:2.0.0-rc.1" + dependencies: + "@solana/errors": 2.0.0-rc.1 + peerDependencies: + typescript: ">=5" + checksum: e3a138cbdc2b87c6296c449384b684ca2f90cf212cee1cf0a1f30385c3acc72c9a3dc2e60e3152723b9fa5640635bcf69ce06581d83113986ede05d41139f0ba + languageName: node + linkType: hard + "@solana/codecs-data-structures@npm:2.0.0-preview.2": version: 2.0.0-preview.2 resolution: "@solana/codecs-data-structures@npm:2.0.0-preview.2" @@ -8059,6 +8124,19 @@ __metadata: languageName: node linkType: hard +"@solana/codecs-data-structures@npm:2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@solana/codecs-data-structures@npm:2.0.0-rc.1" + dependencies: + "@solana/codecs-core": 2.0.0-rc.1 + "@solana/codecs-numbers": 2.0.0-rc.1 + "@solana/errors": 2.0.0-rc.1 + peerDependencies: + typescript: ">=5" + checksum: 7c24700be7c935fc066dc70e1a02c32d9f17393d3898074e6dcff2c2083012dc8c5583fff5ee04f8ce4578c57bb708688f5e52aad301aa5543aab293640a0b21 + languageName: node + linkType: hard + "@solana/codecs-numbers@npm:2.0.0-preview.2": version: 2.0.0-preview.2 resolution: "@solana/codecs-numbers@npm:2.0.0-preview.2" @@ -8081,6 +8159,18 @@ __metadata: languageName: node linkType: hard +"@solana/codecs-numbers@npm:2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@solana/codecs-numbers@npm:2.0.0-rc.1" + dependencies: + "@solana/codecs-core": 2.0.0-rc.1 + "@solana/errors": 2.0.0-rc.1 + peerDependencies: + typescript: ">=5" + checksum: 370c1f94970e969b1f523d47714ddd751b68f622967455e2376590af0f230e027dce365bd54a9017fbc064ed21447f795c775c46285222c42a11b8ed46a41570 + languageName: node + linkType: hard + "@solana/codecs-strings@npm:2.0.0-preview.2": version: 2.0.0-preview.2 resolution: "@solana/codecs-strings@npm:2.0.0-preview.2" @@ -8108,6 +8198,20 @@ __metadata: languageName: node linkType: hard +"@solana/codecs-strings@npm:2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@solana/codecs-strings@npm:2.0.0-rc.1" + dependencies: + "@solana/codecs-core": 2.0.0-rc.1 + "@solana/codecs-numbers": 2.0.0-rc.1 + "@solana/errors": 2.0.0-rc.1 + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ">=5" + checksum: 0706605311508b02f7dc4bfde6f93237337ecde051c83f172a121b52676e2a21af90f916624f57c0e80bbe420412ed98c1e7ae90a583761b028cc6a883fa4a0e + languageName: node + linkType: hard + "@solana/codecs@npm:2.0.0-preview.2": version: 2.0.0-preview.2 resolution: "@solana/codecs@npm:2.0.0-preview.2" @@ -8136,6 +8240,21 @@ __metadata: languageName: node linkType: hard +"@solana/codecs@npm:2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@solana/codecs@npm:2.0.0-rc.1" + dependencies: + "@solana/codecs-core": 2.0.0-rc.1 + "@solana/codecs-data-structures": 2.0.0-rc.1 + "@solana/codecs-numbers": 2.0.0-rc.1 + "@solana/codecs-strings": 2.0.0-rc.1 + "@solana/options": 2.0.0-rc.1 + peerDependencies: + typescript: ">=5" + checksum: 8586abfd1e2792008a447c29efc22e0bfefd7d97a8025090dd49ec07c8c860e51c44355ab74faf43e23336f3dd2e1353238fa4b009d3fe60ff3f02b46a96aa04 + languageName: node + linkType: hard + "@solana/errors@npm:2.0.0-preview.2": version: 2.0.0-preview.2 resolution: "@solana/errors@npm:2.0.0-preview.2" @@ -8162,6 +8281,20 @@ __metadata: languageName: node linkType: hard +"@solana/errors@npm:2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@solana/errors@npm:2.0.0-rc.1" + dependencies: + chalk: ^5.3.0 + commander: ^12.1.0 + peerDependencies: + typescript: ">=5" + bin: + errors: bin/cli.mjs + checksum: 906892a892d250c2236449b875b174e0e19ade788146d0e63da23c83d89b98a762770c276341fae8f73959efc57d01090e0e979d111b12ac0e451f2402a8d092 + languageName: node + linkType: hard + "@solana/options@npm:2.0.0-preview.2": version: 2.0.0-preview.2 resolution: "@solana/options@npm:2.0.0-preview.2" @@ -8187,6 +8320,21 @@ __metadata: languageName: node linkType: hard +"@solana/options@npm:2.0.0-rc.1": + version: 2.0.0-rc.1 + resolution: "@solana/options@npm:2.0.0-rc.1" + dependencies: + "@solana/codecs-core": 2.0.0-rc.1 + "@solana/codecs-data-structures": 2.0.0-rc.1 + "@solana/codecs-numbers": 2.0.0-rc.1 + "@solana/codecs-strings": 2.0.0-rc.1 + "@solana/errors": 2.0.0-rc.1 + peerDependencies: + typescript: ">=5" + checksum: 63f3ed04e56ca232023fcf35ddab8f01a1ba7aae932990908657dec833ff4133ad0af279417d4bce291367903dbd3b962287796a22dd0aaa1d3e3290613a442e + languageName: node + linkType: hard + "@solana/spl-token-group@npm:^0.0.5": version: 0.0.5 resolution: "@solana/spl-token-group@npm:0.0.5" @@ -8211,6 +8359,18 @@ __metadata: languageName: node linkType: hard +"@solana/spl-token-metadata@npm:^0.1.4": + version: 0.1.5 + resolution: "@solana/spl-token-metadata@npm:0.1.5" + dependencies: + "@solana/codecs": 2.0.0-rc.1 + "@solana/spl-type-length-value": 0.1.0 + peerDependencies: + "@solana/web3.js": ^1.95.3 + checksum: dffe1bf05c5c60cb3a725044c2013c5d3dfeed2e0ae99dd083916cf92cc433f5d87b631f38fc8ae0aac5ed8c1d266be1c8dc7c868da5253be076fe7ce49a31b8 + languageName: node + linkType: hard + "@solana/spl-token@npm:^0.3.7": version: 0.3.8 resolution: "@solana/spl-token@npm:0.3.8" @@ -8304,30 +8464,7 @@ __metadata: languageName: node linkType: hard -"@solana/web3.js@npm:^1.90.2, @solana/web3.js@npm:^1.91.6": - version: 1.93.0 - resolution: "@solana/web3.js@npm:1.93.0" - dependencies: - "@babel/runtime": ^7.24.7 - "@noble/curves": ^1.4.0 - "@noble/hashes": ^1.4.0 - "@solana/buffer-layout": ^4.0.1 - agentkeepalive: ^4.5.0 - bigint-buffer: ^1.1.5 - bn.js: ^5.2.1 - borsh: ^0.7.0 - bs58: ^4.0.1 - buffer: 6.0.3 - fast-stable-stringify: ^1.0.0 - jayson: ^4.1.0 - node-fetch: ^2.7.0 - rpc-websockets: ^9.0.0 - superstruct: ^1.0.4 - checksum: 3ae7d1e0cd998481b0d17076aec5df8c8593e7a9927ea245db19b18473abe3c96b94553de1f130ae1662a65a57b372a49025da38eeec598eb6c8ef355891b8b4 - languageName: node - linkType: hard - -"@solana/web3.js@npm:^1.95.0": +"@solana/web3.js@npm:^1.95.0, @solana/web3.js@npm:^1.95.3": version: 1.95.3 resolution: "@solana/web3.js@npm:1.95.3" dependencies: @@ -8725,39 +8862,39 @@ __metadata: languageName: node linkType: hard -"@substrate/connect-known-chains@npm:^1.1.4": - version: 1.1.4 - resolution: "@substrate/connect-known-chains@npm:1.1.4" - checksum: 235c732509391f12525ec740dbb8b8d4c5f56b7c7e71216c933e12974e0ad4f9664f7248a6d6db8b687c1c9fca9105398113ac7fd39515163ab6a9d5f7eba737 +"@substrate/connect-known-chains@npm:^1.1.5": + version: 1.4.0 + resolution: "@substrate/connect-known-chains@npm:1.4.0" + checksum: 7f2942f78399560cab9e77a26ca116a192f209b2499e50e8c77c05712cecc4587696b3c8ea4d9acb1d0bedf35b52fa52ad530ba332bdfdfe0c6f1cdb656d70c0 languageName: node linkType: hard -"@substrate/connect@npm:0.8.10": - version: 0.8.10 - resolution: "@substrate/connect@npm:0.8.10" +"@substrate/connect@npm:0.8.11": + version: 0.8.11 + resolution: "@substrate/connect@npm:0.8.11" dependencies: "@substrate/connect-extension-protocol": ^2.0.0 - "@substrate/connect-known-chains": ^1.1.4 - "@substrate/light-client-extension-helpers": ^0.0.6 - smoldot: 2.0.22 - checksum: 2ed22ff5eefc547f9c3a7547f166b20c844372802cf406e6511844ed2f813b091f515611a720847e1b78848af1156d5cba403c9423c4ad32e4009daf014150bc + "@substrate/connect-known-chains": ^1.1.5 + "@substrate/light-client-extension-helpers": ^1.0.0 + smoldot: 2.0.26 + checksum: c7c915ef51c43258f928323b8197b20f8dc3c14f5a5369b320a209df0037bd49aa5fee849486872bee22f40fced8be169e23a600d36b6f254d7e9e80ac2e1c9c languageName: node linkType: hard -"@substrate/light-client-extension-helpers@npm:^0.0.6": - version: 0.0.6 - resolution: "@substrate/light-client-extension-helpers@npm:0.0.6" +"@substrate/light-client-extension-helpers@npm:^1.0.0": + version: 1.0.0 + resolution: "@substrate/light-client-extension-helpers@npm:1.0.0" dependencies: - "@polkadot-api/json-rpc-provider": 0.0.1 - "@polkadot-api/json-rpc-provider-proxy": 0.0.1 - "@polkadot-api/observable-client": 0.1.0 - "@polkadot-api/substrate-client": 0.0.1 + "@polkadot-api/json-rpc-provider": ^0.0.1 + "@polkadot-api/json-rpc-provider-proxy": ^0.1.0 + "@polkadot-api/observable-client": ^0.3.0 + "@polkadot-api/substrate-client": ^0.1.2 "@substrate/connect-extension-protocol": ^2.0.0 - "@substrate/connect-known-chains": ^1.1.4 + "@substrate/connect-known-chains": ^1.1.5 rxjs: ^7.8.1 peerDependencies: smoldot: 2.x - checksum: a0cc169e6edf56cdbfd839a32487e31ad0bcb4cc9d4d50bac632c16f95d6ebf54638b268c1f7b8e651482e201f38411139a90071bc91268a2c01e5b50f39f338 + checksum: 12b2180c1b5fa9884588e7e94c095ba6bdd4bc386ca54c2bd2d58e8b606b361b04636ae0536b1eb4a18398e31d191d5949e3b3ba9b3a01d6592f425fb671881c languageName: node linkType: hard @@ -8775,90 +8912,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-darwin-arm64@npm:1.7.6" +"@swc/core-darwin-arm64@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-darwin-arm64@npm:1.7.24" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-darwin-x64@npm:1.7.6" +"@swc/core-darwin-x64@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-darwin-x64@npm:1.7.24" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.6" +"@swc/core-linux-arm-gnueabihf@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.7.24" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-arm64-gnu@npm:1.7.6" +"@swc/core-linux-arm64-gnu@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-linux-arm64-gnu@npm:1.7.24" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-arm64-musl@npm:1.7.6" +"@swc/core-linux-arm64-musl@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-linux-arm64-musl@npm:1.7.24" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-x64-gnu@npm:1.7.6" +"@swc/core-linux-x64-gnu@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-linux-x64-gnu@npm:1.7.24" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-linux-x64-musl@npm:1.7.6" +"@swc/core-linux-x64-musl@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-linux-x64-musl@npm:1.7.24" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-win32-arm64-msvc@npm:1.7.6" +"@swc/core-win32-arm64-msvc@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-win32-arm64-msvc@npm:1.7.24" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-win32-ia32-msvc@npm:1.7.6" +"@swc/core-win32-ia32-msvc@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-win32-ia32-msvc@npm:1.7.24" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.7.6": - version: 1.7.6 - resolution: "@swc/core-win32-x64-msvc@npm:1.7.6" +"@swc/core-win32-x64-msvc@npm:1.7.24": + version: 1.7.24 + resolution: "@swc/core-win32-x64-msvc@npm:1.7.24" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@swc/core@npm:^1.7.6": - version: 1.7.6 - resolution: "@swc/core@npm:1.7.6" +"@swc/core@npm:^1.7.24": + version: 1.7.24 + resolution: "@swc/core@npm:1.7.24" dependencies: - "@swc/core-darwin-arm64": 1.7.6 - "@swc/core-darwin-x64": 1.7.6 - "@swc/core-linux-arm-gnueabihf": 1.7.6 - "@swc/core-linux-arm64-gnu": 1.7.6 - "@swc/core-linux-arm64-musl": 1.7.6 - "@swc/core-linux-x64-gnu": 1.7.6 - "@swc/core-linux-x64-musl": 1.7.6 - "@swc/core-win32-arm64-msvc": 1.7.6 - "@swc/core-win32-ia32-msvc": 1.7.6 - "@swc/core-win32-x64-msvc": 1.7.6 + "@swc/core-darwin-arm64": 1.7.24 + "@swc/core-darwin-x64": 1.7.24 + "@swc/core-linux-arm-gnueabihf": 1.7.24 + "@swc/core-linux-arm64-gnu": 1.7.24 + "@swc/core-linux-arm64-musl": 1.7.24 + "@swc/core-linux-x64-gnu": 1.7.24 + "@swc/core-linux-x64-musl": 1.7.24 + "@swc/core-win32-arm64-msvc": 1.7.24 + "@swc/core-win32-ia32-msvc": 1.7.24 + "@swc/core-win32-x64-msvc": 1.7.24 "@swc/counter": ^0.1.3 "@swc/types": ^0.1.12 peerDependencies: @@ -8887,7 +9024,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 6ecc0d5721458c35ee236ffeb8ac6c909aaf28155f9dbcdf796111ed28bc6273629bd2156547dff70368dff0bf43c6aae7e2cafbb507b31f9ab6e3aed879cd03 + checksum: d46f58a43c8a5067459fec37e9df61f821e0315269165d05c7c173ad2039ca819986d1397b967f17163082c6333cb31293a1870e9b68dd09e03c2fc21d48b723 languageName: node linkType: hard @@ -9035,18 +9172,6 @@ __metadata: languageName: node linkType: hard -"@trezor/analytics@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/analytics@npm:1.1.0" - dependencies: - "@trezor/env-utils": 1.1.0 - "@trezor/utils": 9.1.0 - peerDependencies: - tslib: ^2.6.2 - checksum: 6a5b426c12b7ba7bfbbb955ac003733ca0b36a33f52d49c13a37ab341ae6f9c38a5aa0696f60dd31da650b01326a93d27d06ef830190a608159cc833451a413b - languageName: node - linkType: hard - "@trezor/analytics@npm:1.2.0": version: 1.2.0 resolution: "@trezor/analytics@npm:1.2.0" @@ -9059,20 +9184,6 @@ __metadata: languageName: node linkType: hard -"@trezor/blockchain-link-types@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/blockchain-link-types@npm:1.1.0" - dependencies: - "@solana/web3.js": ^1.91.6 - "@trezor/type-utils": 1.1.0 - "@trezor/utxo-lib": 2.1.0 - socks-proxy-agent: 6.1.1 - peerDependencies: - tslib: ^2.6.2 - checksum: 1834c7841189a560f3ddba1863b5501ed7249ce1f138879d493f6c6b9f0e2d1d60cf8a44e4fdd986e8324fbf6e7940c823e692ba646b235e06c4af90967142a4 - languageName: node - linkType: hard - "@trezor/blockchain-link-types@npm:1.2.0": version: 1.2.0 resolution: "@trezor/blockchain-link-types@npm:1.2.0" @@ -9087,20 +9198,6 @@ __metadata: languageName: node linkType: hard -"@trezor/blockchain-link-utils@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/blockchain-link-utils@npm:1.1.0" - dependencies: - "@mobily/ts-belt": ^3.13.1 - "@solana/web3.js": ^1.91.6 - "@trezor/env-utils": 1.1.0 - "@trezor/utils": 9.1.0 - peerDependencies: - tslib: ^2.6.2 - checksum: 314ff6ccd4eccc91324410b3f46967effef766d45fcd7165026a909059519ecb04d5e3df470ec8c62b0ad345d3be6c727b9e98b92d3f4e12c81d3a283dd005b2 - languageName: node - linkType: hard - "@trezor/blockchain-link-utils@npm:1.2.0": version: 1.2.0 resolution: "@trezor/blockchain-link-utils@npm:1.2.0" @@ -9115,27 +9212,6 @@ __metadata: languageName: node linkType: hard -"@trezor/blockchain-link@npm:2.2.0": - version: 2.2.0 - resolution: "@trezor/blockchain-link@npm:2.2.0" - dependencies: - "@solana/buffer-layout": ^4.0.1 - "@solana/web3.js": ^1.90.2 - "@trezor/blockchain-link-types": 1.1.0 - "@trezor/blockchain-link-utils": 1.1.0 - "@trezor/utils": 9.1.0 - "@trezor/utxo-lib": 2.1.0 - "@types/web": ^0.0.138 - events: ^3.3.0 - ripple-lib: ^1.10.1 - socks-proxy-agent: 6.1.1 - ws: ^8.17.1 - peerDependencies: - tslib: ^2.6.2 - checksum: 6aa09f60d2ca8c9688505f68955a29df574cec869d1ffd5f332ddf1e5dcb4fa45be4e22e2ce1269b7b2dff8214202767ce7b1d9af6d8672013f6dc29506b5bf8 - languageName: node - linkType: hard - "@trezor/blockchain-link@npm:2.3.0": version: 2.3.0 resolution: "@trezor/blockchain-link@npm:2.3.0" @@ -9157,17 +9233,6 @@ __metadata: languageName: node linkType: hard -"@trezor/connect-analytics@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/connect-analytics@npm:1.1.0" - dependencies: - "@trezor/analytics": 1.1.0 - peerDependencies: - tslib: ^2.6.2 - checksum: e6beecb036be00d3c62af7f4f4ff96a6756df698ac19807a1b4be3fb0bd50a702780ee9a47e7e64ffebfab353ee532b07d0b5e7efdb3b611f88b9d8f9bb40157 - languageName: node - linkType: hard - "@trezor/connect-analytics@npm:1.2.0": version: 1.2.0 resolution: "@trezor/connect-analytics@npm:1.2.0" @@ -9179,18 +9244,6 @@ __metadata: languageName: node linkType: hard -"@trezor/connect-common@npm:0.1.0": - version: 0.1.0 - resolution: "@trezor/connect-common@npm:0.1.0" - dependencies: - "@trezor/env-utils": 1.1.0 - "@trezor/utils": 9.1.0 - peerDependencies: - tslib: ^2.6.2 - checksum: 4ad56ad4b0d7ccca01ecb89093b23bb013f58d709a23b74a50e982282a2fe0d014b3400ef569d3cde5407c6d16933b6987b43b81b72380d3b340ea317956f1ed - languageName: node - linkType: hard - "@trezor/connect-common@npm:0.2.0": version: 0.2.0 resolution: "@trezor/connect-common@npm:0.2.0" @@ -9203,48 +9256,20 @@ __metadata: languageName: node linkType: hard -"@trezor/connect-web@npm:^9.3.0": - version: 9.3.0 - resolution: "@trezor/connect-web@npm:9.3.0" - dependencies: - "@trezor/connect": 9.3.0 - "@trezor/connect-common": 0.1.0 - "@trezor/utils": 9.1.0 - peerDependencies: - tslib: ^2.6.2 - checksum: e887f9eb9429f9da899a79ef4fb37b1505f8da506e7c7ad86a89e27c981fb61eafdb55b950c3cbe09f06828361019fa8bcd95fdbcf0328a20c3de8e86198902c - languageName: node - linkType: hard - -"@trezor/connect@npm:9.3.0": - version: 9.3.0 - resolution: "@trezor/connect@npm:9.3.0" +"@trezor/connect-web@npm:^9.4.0": + version: 9.4.0 + resolution: "@trezor/connect-web@npm:9.4.0" dependencies: - "@babel/preset-typescript": ^7.23.3 - "@ethereumjs/common": ^4.2.0 - "@ethereumjs/tx": ^5.2.1 - "@fivebinaries/coin-selection": 2.2.1 - "@trezor/blockchain-link": 2.2.0 - "@trezor/blockchain-link-types": 1.1.0 - "@trezor/connect-analytics": 1.1.0 - "@trezor/connect-common": 0.1.0 - "@trezor/protobuf": 1.1.0 - "@trezor/protocol": 1.1.0 - "@trezor/schema-utils": 1.1.0 - "@trezor/transport": 1.2.0 - "@trezor/utils": 9.1.0 - "@trezor/utxo-lib": 2.1.0 - blakejs: ^1.2.1 - bs58: ^5.0.0 - bs58check: ^3.0.1 - cross-fetch: ^4.0.0 + "@trezor/connect": 9.4.0 + "@trezor/connect-common": 0.2.0 + "@trezor/utils": 9.2.0 peerDependencies: tslib: ^2.6.2 - checksum: 957a9fd376ff323be894a85d6d481a66d909d7222bf12f6d8bf6014f9aff116b318f22ec94c720759c9d4f277a515699158097ec26f38b6b9e640f4c5b0311ca + checksum: 608762153034ca63e89a0723b44d99f59d9efffddb5f29152f26ed7d9bdf56ab230cce68919982b8e7eb266367a7f16cc65a38a9b61c7c676c54735060f9e1a0 languageName: node linkType: hard -"@trezor/connect@npm:^9.4.0": +"@trezor/connect@npm:9.4.0, @trezor/connect@npm:^9.4.0": version: 9.4.0 resolution: "@trezor/connect@npm:9.4.0" dependencies: @@ -9272,27 +9297,6 @@ __metadata: languageName: node linkType: hard -"@trezor/env-utils@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/env-utils@npm:1.1.0" - dependencies: - ua-parser-js: ^1.0.37 - peerDependencies: - expo-constants: "*" - expo-localization: "*" - react-native: "*" - tslib: ^2.6.2 - peerDependenciesMeta: - expo-constants: - optional: true - expo-localization: - optional: true - react-native: - optional: true - checksum: 1b09c9ebc6070396528d5f1f9f44085b0465356cfcb936a7d69cff0b26ee024d90f0bf4e531cc927a5744651d70d3fddbd4d8e5aa771a9b62b86c29d08d2682d - languageName: node - linkType: hard - "@trezor/env-utils@npm:1.2.0": version: 1.2.0 resolution: "@trezor/env-utils@npm:1.2.0" @@ -9314,18 +9318,6 @@ __metadata: languageName: node linkType: hard -"@trezor/protobuf@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/protobuf@npm:1.1.0" - dependencies: - "@trezor/schema-utils": 1.1.0 - protobufjs: 7.2.6 - peerDependencies: - tslib: ^2.6.2 - checksum: 14ba5c3ead6b0ad277742cc26e16a5048ee956f25a88919c04c153eb802d11c3d00b31e54e0d7b72e23e2f442f4fd6c589694430adb3348d10ca7b6e4acb5ec3 - languageName: node - linkType: hard - "@trezor/protobuf@npm:1.2.0": version: 1.2.0 resolution: "@trezor/protobuf@npm:1.2.0" @@ -9338,15 +9330,6 @@ __metadata: languageName: node linkType: hard -"@trezor/protocol@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/protocol@npm:1.1.0" - peerDependencies: - tslib: ^2.6.2 - checksum: 860601a91621561d8e8b5c4004d3d6f6ef5ab34a2c793ce9554ff0989d4a8f57465f5f1d93a8c3f828366449254d8357efa661770d2ed135d70a88de6b7d36c8 - languageName: node - linkType: hard - "@trezor/protocol@npm:1.2.0": version: 1.2.0 resolution: "@trezor/protocol@npm:1.2.0" @@ -9356,18 +9339,6 @@ __metadata: languageName: node linkType: hard -"@trezor/schema-utils@npm:1.1.0": - version: 1.1.0 - resolution: "@trezor/schema-utils@npm:1.1.0" - dependencies: - "@sinclair/typebox": ^0.31.28 - ts-mixer: ^6.0.3 - peerDependencies: - tslib: ^2.6.2 - checksum: c84ce18f4dd0cb22daec8fc469a4c0622af279829602993573ade6a14346491f11e73c9f6fa37c68a7249380790e599084fa5c4ddd16c9d08a987da1f808db51 - languageName: node - linkType: hard - "@trezor/schema-utils@npm:1.2.0": version: 1.2.0 resolution: "@trezor/schema-utils@npm:1.2.0" @@ -9380,24 +9351,6 @@ __metadata: languageName: node linkType: hard -"@trezor/transport@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/transport@npm:1.2.0" - dependencies: - "@trezor/protobuf": 1.1.0 - "@trezor/protocol": 1.1.0 - "@trezor/utils": 9.1.0 - cross-fetch: ^4.0.0 - json-stable-stringify: ^1.1.1 - long: ^4.0.0 - protobufjs: 7.2.6 - usb: ^2.11.0 - peerDependencies: - tslib: ^2.6.2 - checksum: f60aa061df51a4566b922bb86cef541af939b538aec7ab25b1a7590d685a33f7180c9162611f56db4254b15f0f0d1403fb18e7f79ad9db6c10449ed1fe466d56 - languageName: node - linkType: hard - "@trezor/transport@npm:1.3.0": version: 1.3.0 resolution: "@trezor/transport@npm:1.3.0" @@ -9422,17 +9375,6 @@ __metadata: languageName: node linkType: hard -"@trezor/utils@npm:9.1.0": - version: 9.1.0 - resolution: "@trezor/utils@npm:9.1.0" - dependencies: - bignumber.js: ^9.1.2 - peerDependencies: - tslib: ^2.6.2 - checksum: 59590dcbb7c062991cbe0075a1b5e3b683929f2251ade96f90da12b2a01accbe14a12ef8d52e028934c97466aaeeb971b82669f0ecc69c52c42eb25f68ba92b3 - languageName: node - linkType: hard - "@trezor/utils@npm:9.2.0": version: 9.2.0 resolution: "@trezor/utils@npm:9.2.0" @@ -9444,33 +9386,6 @@ __metadata: languageName: node linkType: hard -"@trezor/utxo-lib@npm:2.1.0": - version: 2.1.0 - resolution: "@trezor/utxo-lib@npm:2.1.0" - dependencies: - "@trezor/utils": 9.1.0 - bchaddrjs: ^0.5.2 - bech32: ^2.0.0 - bip66: ^1.1.5 - bitcoin-ops: ^1.4.1 - blake-hash: ^2.0.0 - blakejs: ^1.2.1 - bn.js: ^5.2.1 - bs58: ^5.0.0 - bs58check: ^3.0.1 - create-hmac: ^1.1.7 - int64-buffer: ^1.0.1 - pushdata-bitcoin: ^1.0.1 - tiny-secp256k1: ^1.1.6 - typeforce: ^1.18.0 - varuint-bitcoin: ^1.1.2 - wif: ^4.0.0 - peerDependencies: - tslib: ^2.6.2 - checksum: b6626cba8316ed46b641bc973e575b3b32caaeb5791ea1ef684c5562227dc698a70ee67d4dc681a8f8b57c09dd3771c66bece2fb8c8a2f4484043bb9c5358bb2 - languageName: node - linkType: hard - "@trezor/utxo-lib@npm:2.2.0": version: 2.2.0 resolution: "@trezor/utxo-lib@npm:2.2.0" @@ -9733,20 +9648,20 @@ __metadata: languageName: node linkType: hard -"@types/chai@npm:^4.3.17": - version: 4.3.17 - resolution: "@types/chai@npm:4.3.17" - checksum: 56661c74c76df06547e3584be4a2b85eec60e7de4c0f6e7bbf7bf492a0ce96ce5bfc30f52a8889a7b35e24161d225e4a57041d4fa80f6e5592fea78e45dfd34c +"@types/chai@npm:^4.3.19": + version: 4.3.19 + resolution: "@types/chai@npm:4.3.19" + checksum: abd4d3239735054f3b6e8163e45bc6495f66469729fbcf4784c9f2b82361a6845d45ab9c518818c78eafa46d015e3a72306e9949d1333e10d7eaedf426af4261 languageName: node linkType: hard -"@types/chrome@npm:^0.0.269": - version: 0.0.269 - resolution: "@types/chrome@npm:0.0.269" +"@types/chrome@npm:^0.0.270": + version: 0.0.270 + resolution: "@types/chrome@npm:0.0.270" dependencies: "@types/filesystem": "*" "@types/har-format": "*" - checksum: bd48365b9e5f022855e6c3f1febcad2e20250adc0a718b6029380638b848acdc5bcc01161a13b48f9232ff2f620eb23101c284bdc89b1d01f0a52e7d24443e2b + checksum: 4034e48e450c4933434c7583a1b66a23145fb488655dbb14796f7bcc9c8288ec003397e725bef1cb1aab5acb54f1028e3d2397de199b6a715d9bb7ff4ba867c9 languageName: node linkType: hard @@ -10137,12 +10052,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.14.14": - version: 20.14.14 - resolution: "@types/node@npm:20.14.14" +"@types/node@npm:^20.16.5": + version: 20.16.5 + resolution: "@types/node@npm:20.16.5" dependencies: - undici-types: ~5.26.4 - checksum: cb2199123efca94908ee7191cc7b7abc11b26bf1fbb93c2948d5537a6594eedc35d4748d9fa998078fdc2eb5cc3a11d6d87b2fea20a05bda9d304e37d3c3282a + undici-types: ~6.19.2 + checksum: f38b7bd8c4993dcf38943afa2ffdd7dfd18fc94f8f3f28d0c1045a10d39871a6cc1b8f8d3bf0c7ed848457d0e1d283482f6ca125579c13fed1b7575d23e8e8f5 languageName: node linkType: hard @@ -10409,10 +10324,10 @@ __metadata: languageName: node linkType: hard -"@types/zxcvbn@npm:^4.4.4": - version: 4.4.4 - resolution: "@types/zxcvbn@npm:4.4.4" - checksum: e7efc6ca5e5aa5764981d853c53c4fe7b9b36a187bde29a2465cc1028e385073b7ae1fed126c41e86a6b0cd96f6326d0e8aa3a506bd0dca8fb98803a166f2c20 +"@types/zxcvbn@npm:^4.4.5": + version: 4.4.5 + resolution: "@types/zxcvbn@npm:4.4.5" + checksum: 6cef28a9d2c13838edce31b33eb11d6aaadb3fb1d3e90f51c2f2a7280be7c0c32c7a62f5cab05297f742f4c8c8fd07d9d8d6095a3255a6a9f280a5eee6b360b4 languageName: node linkType: hard @@ -10944,26 +10859,26 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-core@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/compiler-core@npm:3.4.35" +"@vue/compiler-core@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/compiler-core@npm:3.5.3" dependencies: - "@babel/parser": ^7.24.7 - "@vue/shared": 3.4.35 + "@babel/parser": ^7.25.3 + "@vue/shared": 3.5.3 entities: ^4.5.0 estree-walker: ^2.0.2 source-map-js: ^1.2.0 - checksum: 9f050edee2efefd214dcff65efea7f9faab63bab34ce31fb6ea08a7a12bad5a792b2b9f31e2f72a3d034474bd217707c769a5341e9006c8d442024647895cdd5 + checksum: 1b9b6059f8bc0a40b26b183644f46a6818dea9b6bbdd3639eaaf9cb928e363941596a7ca970d800cdcc546bd872cbf142c215e1644043512845dfa65e860a9f9 languageName: node linkType: hard -"@vue/compiler-dom@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/compiler-dom@npm:3.4.35" +"@vue/compiler-dom@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/compiler-dom@npm:3.5.3" dependencies: - "@vue/compiler-core": 3.4.35 - "@vue/shared": 3.4.35 - checksum: 3944753daadef563249778e5672dae80c66e687ed48509de682ffc9f620e13b373492925f2658a2c938dabcfb3914b39582b77e92e9190913be528d3e91434fc + "@vue/compiler-core": 3.5.3 + "@vue/shared": 3.5.3 + checksum: 3651d024af1a2186fec4ce0eb703b1990eb5d972cce4e607de053474bc05b0df618fe1207a609871d86e140616fab3fa73f8e74dd786f85b1a152a1867966a08 languageName: node linkType: hard @@ -10978,30 +10893,30 @@ __metadata: languageName: node linkType: hard -"@vue/compiler-sfc@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/compiler-sfc@npm:3.4.35" +"@vue/compiler-sfc@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/compiler-sfc@npm:3.5.3" dependencies: - "@babel/parser": ^7.24.7 - "@vue/compiler-core": 3.4.35 - "@vue/compiler-dom": 3.4.35 - "@vue/compiler-ssr": 3.4.35 - "@vue/shared": 3.4.35 + "@babel/parser": ^7.25.3 + "@vue/compiler-core": 3.5.3 + "@vue/compiler-dom": 3.5.3 + "@vue/compiler-ssr": 3.5.3 + "@vue/shared": 3.5.3 estree-walker: ^2.0.2 - magic-string: ^0.30.10 - postcss: ^8.4.40 + magic-string: ^0.30.11 + postcss: ^8.4.44 source-map-js: ^1.2.0 - checksum: 8fcb9141928c6309d7b7a714d5d4d262ca19b2398a88c69c4bb55ae69ab8575a8fe3cfa8ee6f2469bc3c96a54d7d309c435b8d8df9955a0037c8adba36b24d1f + checksum: 509f97ea9992c2ac7c7d5e114d008d92a5117d8f006f0b008559e5937b4cf9a5cecf2fb93db80d9525f618e42b43a55b2b48ccf53db862c197a7f6719072151c languageName: node linkType: hard -"@vue/compiler-ssr@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/compiler-ssr@npm:3.4.35" +"@vue/compiler-ssr@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/compiler-ssr@npm:3.5.3" dependencies: - "@vue/compiler-dom": 3.4.35 - "@vue/shared": 3.4.35 - checksum: 32a9018484bc6aba88dfb4e9d328c54c7ff3520906a0c0d1c4e913d81df26949c43b7d832364dfdb487a4ec59f3395e89c221bfa797dc3797bcf6ff2d988abb0 + "@vue/compiler-dom": 3.5.3 + "@vue/shared": 3.5.3 + checksum: 9ba69b14fd7776bf4653442ba50cf9f81e128f318ca86c01f2837884505c3e79841fe64c0b4668d9c72468708e322014c7c4858fa940f82c9703aa69edf1b106 languageName: node linkType: hard @@ -11050,53 +10965,53 @@ __metadata: languageName: node linkType: hard -"@vue/reactivity@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/reactivity@npm:3.4.35" +"@vue/reactivity@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/reactivity@npm:3.5.3" dependencies: - "@vue/shared": 3.4.35 - checksum: d1aeb528b78453d627b6ab0d7414b3b7926ff9d1ae0331c789a7e36642eeac56fc7b396869d740fff9e36c01ecea6db0bc0ced461c226ea277f5ec682f5e6a85 + "@vue/shared": 3.5.3 + checksum: c0773d58e5cc15d19001d67dd823463a8076e6a3ed7589bb9672e99c02dab1ed430cdf17972cf130e4aabc2f2305fbd47e7e1efa585c4751529c8f34ef7befd8 languageName: node linkType: hard -"@vue/runtime-core@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/runtime-core@npm:3.4.35" +"@vue/runtime-core@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/runtime-core@npm:3.5.3" dependencies: - "@vue/reactivity": 3.4.35 - "@vue/shared": 3.4.35 - checksum: f62a20e36029e23131c5f326636a5ccdb5a9f61bbe5fbec0275ee5f8ed720589d2e1f0ef1d5294d19d2b38e0690c183731ca7bd39bf6190ec89e3d7593903060 + "@vue/reactivity": 3.5.3 + "@vue/shared": 3.5.3 + checksum: 6aa7b618671d0a182b396a8525beb80fd30f2a66dd3b6de16fca0e4dc86f4e43f632db8802f59811f2154b7b0fda6f7a71fc699a83b5d6f569ad2d20627a3013 languageName: node linkType: hard -"@vue/runtime-dom@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/runtime-dom@npm:3.4.35" +"@vue/runtime-dom@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/runtime-dom@npm:3.5.3" dependencies: - "@vue/reactivity": 3.4.35 - "@vue/runtime-core": 3.4.35 - "@vue/shared": 3.4.35 + "@vue/reactivity": 3.5.3 + "@vue/runtime-core": 3.5.3 + "@vue/shared": 3.5.3 csstype: ^3.1.3 - checksum: 943b931652ca1e0adb4ebc8ef872453b729e9ad59536c26a6fc71649a1f9ce339aa49671446d3a3bc6c28ecc3de86f69e3a7e1272f3f219878d83333bd8ce941 + checksum: 0934fe6769ec9a3033bfbbb88afa612686b530bd7798655af79526d4c86ac748dc43bf5b64c25f9905bb24f5f57aefb2829fee398c5c25ee39e025f887c6b1ff languageName: node linkType: hard -"@vue/server-renderer@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/server-renderer@npm:3.4.35" +"@vue/server-renderer@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/server-renderer@npm:3.5.3" dependencies: - "@vue/compiler-ssr": 3.4.35 - "@vue/shared": 3.4.35 + "@vue/compiler-ssr": 3.5.3 + "@vue/shared": 3.5.3 peerDependencies: - vue: 3.4.35 - checksum: 410516532b6c9368c8c246556c6d713f367eea76b4e96a33235f2da36b9bc78126a63f1b75f198bbd578dd21d0eaafd99183303d6bf407e4631f4e64e2722408 + vue: 3.5.3 + checksum: da1d9e596054c1067a34e3180982a92ee5af4ad2dc782e9f567521dd09c5368b2b28b38d591939e1e3c753e020547ec4a92a2589b0f0d0eb8076a043e3aa5db8 languageName: node linkType: hard -"@vue/shared@npm:3.4.35": - version: 3.4.35 - resolution: "@vue/shared@npm:3.4.35" - checksum: 6397a102ff46e7c5e3d2507b6eb5390f4c07e56898cfdadf7be52e2bf124d1adce41c0c27b81c684ee3e211b480e67e11015fc4e3d14dcd2768ba9045a69d874 +"@vue/shared@npm:3.5.3": + version: 3.5.3 + resolution: "@vue/shared@npm:3.5.3" + checksum: 7d6bb64b6b7c682437485a574040a56c2edb0dbe7071fdb1ce9b72863a2dca8b291de0e649b752ae33b853d46b1a3b2de19ddf13e7ec4a15b88ccb9f63deb06e languageName: node linkType: hard @@ -11128,31 +11043,31 @@ __metadata: languageName: node linkType: hard -"@vueuse/core@npm:^10.11.0": - version: 10.11.0 - resolution: "@vueuse/core@npm:10.11.0" +"@vueuse/core@npm:^10.11.1": + version: 10.11.1 + resolution: "@vueuse/core@npm:10.11.1" dependencies: "@types/web-bluetooth": ^0.0.20 - "@vueuse/metadata": 10.11.0 - "@vueuse/shared": 10.11.0 + "@vueuse/metadata": 10.11.1 + "@vueuse/shared": 10.11.1 vue-demi: ">=0.14.8" - checksum: 51f9b06ee852eb8df2652de3c06db6c89216f17e8c8299996090e48b239411748edc6061d701eb349e6094c29cb1d99dbc011b988d4433a1c2d17fb36c28b1db + checksum: b1029259419e6556b988570d77d5d8fdbea3a8cd90d5fdb84c2a117b47aa02f8d8d67129f223c633a9f82314581fa849164aaee34cd9d8fc644c35c2883bd877 languageName: node linkType: hard -"@vueuse/metadata@npm:10.11.0": - version: 10.11.0 - resolution: "@vueuse/metadata@npm:10.11.0" - checksum: 11591402e150928b22866f9ee4f9bae85918d35467d3df1d921200596a132fa5d937d410fc4490ec893a8ce6582e06eff6a483f4b24d403a46c521037894adea +"@vueuse/metadata@npm:10.11.1": + version: 10.11.1 + resolution: "@vueuse/metadata@npm:10.11.1" + checksum: bca5dd08c6ce80233bfde586270229bba44b0e80b22e512df1fc3d98bbd36f0ada6fbb5e6a86db300c69e4ea2cada30d59c2f77cd642f7dd721aef1d7d867954 languageName: node linkType: hard -"@vueuse/shared@npm:10.11.0": - version: 10.11.0 - resolution: "@vueuse/shared@npm:10.11.0" +"@vueuse/shared@npm:10.11.1": + version: 10.11.1 + resolution: "@vueuse/shared@npm:10.11.1" dependencies: vue-demi: ">=0.14.8" - checksum: 25257b8d1b9fb5726d2bee0d1054ba33cce2b01263785ce7ecd01ee3102f2f0af52d486e121eaa9536e1e44508d46279bd452cec3f537367b5e6629de6c8b7b2 + checksum: c8553126ba2a260fee6bc1798c67f6d90295021bb25c72218c87e169f7d7374bac0777a9f64670f4126f5c7e9c2ec603286ed1810cb8c7961f4b44e4cd4d6f4f languageName: node linkType: hard @@ -11668,6 +11583,15 @@ __metadata: languageName: node linkType: hard +"@zondax/ledger-js@npm:^0.11.0": + version: 0.11.0 + resolution: "@zondax/ledger-js@npm:0.11.0" + dependencies: + "@ledgerhq/hw-transport": 6.30.6 + checksum: 38743b887fceaeb13460d70a127cb385f5df034fe014f698d4f164f0d111add71dd01381c182ac71135c7fb43f38e7b21218d5df7d87d69ddaee17dd9c57d392 + languageName: node + linkType: hard + "@zondax/ledger-js@npm:^0.2.1": version: 0.2.2 resolution: "@zondax/ledger-js@npm:0.2.2" @@ -11677,15 +11601,6 @@ __metadata: languageName: node linkType: hard -"@zondax/ledger-js@npm:^0.8.2": - version: 0.8.2 - resolution: "@zondax/ledger-js@npm:0.8.2" - dependencies: - "@ledgerhq/hw-transport": 6.30.6 - checksum: 7b33cd87d8569732028a57e594a4674f9fa232155c227031a00985bf9b6af62774a5cdbed59a5754c998122862ded64060b042c97850a38e6b734455828b362d - languageName: node - linkType: hard - "@zondax/ledger-stacks@npm:^1.0.2": version: 1.0.4 resolution: "@zondax/ledger-stacks@npm:1.0.4" @@ -11698,14 +11613,14 @@ __metadata: languageName: node linkType: hard -"@zondax/ledger-substrate@npm:^0.44.7": - version: 0.44.7 - resolution: "@zondax/ledger-substrate@npm:0.44.7" +"@zondax/ledger-substrate@npm:^1.0.0": + version: 1.0.0 + resolution: "@zondax/ledger-substrate@npm:1.0.0" dependencies: - "@ledgerhq/hw-transport": 6.31.0 - "@zondax/ledger-js": ^0.8.2 - axios: ^1.7.2 - checksum: e42a64278598410a705ee93a18ccb509afa0811295b6319de9576a5f9018810cf93152f4da5437282178088c762cc1750407b98f0367fdba8e0e275db763d1f4 + "@ledgerhq/hw-transport": 6.31.2 + "@zondax/ledger-js": ^0.11.0 + axios: ^1.7.4 + checksum: e758d84ee0cc6a73d0b9c7103058123e8214862aac2bd6d106e2d02a45e2432c646e37664738342e85c705628b46c71df05c231bb017fa6982f5913fbc5de9f4 languageName: node linkType: hard @@ -12157,6 +12072,16 @@ __metadata: languageName: node linkType: hard +"array-buffer-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "array-buffer-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.5 + is-array-buffer: ^3.0.4 + checksum: 53524e08f40867f6a9f35318fafe467c32e45e9c682ba67b11943e167344d2febc0f6977a17e699b05699e805c3e8f073d876f8bbf1b559ed494ad2cd0fae09e + languageName: node + linkType: hard + "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -12178,16 +12103,17 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.7": - version: 3.1.7 - resolution: "array-includes@npm:3.1.7" +"array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.4 is-string: ^1.0.7 - checksum: 06f9e4598fac12a919f7c59a3f04f010ea07f0b7f0585465ed12ef528a60e45f374e79d1bddbb34cdd4338357d00023ddbd0ac18b0be36964f5e726e8965d7fc + checksum: eb39ba5530f64e4d8acab39297c11c1c5be2a4ea188ab2b34aba5fb7224d918f77717a9d57a3e2900caaa8440e59431bdaf5c974d5212ef65d97f132e38e2d91 languageName: node linkType: hard @@ -12198,16 +12124,17 @@ __metadata: languageName: node linkType: hard -"array.prototype.findlastindex@npm:^1.2.3": - version: 1.2.3 - resolution: "array.prototype.findlastindex@npm:1.2.3" +"array.prototype.findlastindex@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlastindex@npm:1.2.5" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.2.1 - checksum: 31f35d7b370c84db56484618132041a9af401b338f51899c2e78ef7690fbba5909ee7ca3c59a7192085b328cc0c68c6fd1f6d1553db01a689a589ae510f3966e + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-shim-unscopables: ^1.0.2 + checksum: 2c81cff2a75deb95bf1ed89b6f5f2bfbfb882211e3b7cc59c3d6b87df774cd9d6b36949a8ae39ac476e092c1d4a4905f5ee11a86a456abb10f35f8211ae4e710 languageName: node linkType: hard @@ -12250,6 +12177,22 @@ __metadata: languageName: node linkType: hard +"arraybuffer.prototype.slice@npm:^1.0.3": + version: 1.0.3 + resolution: "arraybuffer.prototype.slice@npm:1.0.3" + dependencies: + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.5 + define-properties: ^1.2.1 + es-abstract: ^1.22.3 + es-errors: ^1.2.1 + get-intrinsic: ^1.2.3 + is-array-buffer: ^3.0.4 + is-shared-array-buffer: ^1.0.2 + checksum: 352259cba534dcdd969c92ab002efd2ba5025b2e3b9bead3973150edbdf0696c629d7f4b3f061c5931511e8207bdc2306da614703c820b45dabce39e3daf7e3e + languageName: node + linkType: hard + "arrify@npm:^1.0.0": version: 1.0.1 resolution: "arrify@npm:1.0.1" @@ -12405,6 +12348,15 @@ __metadata: languageName: node linkType: hard +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 + languageName: node + linkType: hard + "aws-sign2@npm:~0.7.0": version: 0.7.0 resolution: "aws-sign2@npm:0.7.0" @@ -12486,14 +12438,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.7.2": - version: 1.7.2 - resolution: "axios@npm:1.7.2" +"axios@npm:^1.7.4": + version: 1.7.7 + resolution: "axios@npm:1.7.7" dependencies: follow-redirects: ^1.15.6 form-data: ^4.0.0 proxy-from-env: ^1.1.0 - checksum: e457e2b0ab748504621f6fa6609074ac08c824bf0881592209dfa15098ece7e88495300e02cd22ba50b3468fd712fe687e629dcb03d6a3f6a51989727405aedf + checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe languageName: node linkType: hard @@ -13438,9 +13390,9 @@ __metadata: languageName: node linkType: hard -"bumpp@npm:^9.4.2": - version: 9.4.2 - resolution: "bumpp@npm:9.4.2" +"bumpp@npm:^9.5.2": + version: 9.5.2 + resolution: "bumpp@npm:9.5.2" dependencies: "@jsdevtools/ez-spawn": ^3.0.4 c12: ^1.11.1 @@ -13448,11 +13400,12 @@ __metadata: escalade: ^3.1.2 fast-glob: ^3.3.2 js-yaml: ^4.1.0 + jsonc-parser: ^3.3.1 prompts: ^2.4.2 semver: ^7.6.3 bin: bumpp: bin/bumpp.js - checksum: 2a85992751e0e083e6bf194179836eeb2dbfaaeaa6e7cf97623fec12a5f04ba990b9d791c912aa84458a6d98afa81504e79b7c9198b2d6548d6b60ddae62b393 + checksum: 5348fd7e937e40211e5790a50e59bd243fe915b4b675509122e8021cf2a64bdab6fda8ded5a2b34bf6461f9d302c888d062b3e5a4e917e549f2e4b8741487b54 languageName: node linkType: hard @@ -13615,7 +13568,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.7": +"call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": version: 1.0.7 resolution: "call-bind@npm:1.0.7" dependencies: @@ -14660,10 +14613,10 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.38.0": - version: 3.38.0 - resolution: "core-js@npm:3.38.0" - checksum: 71ef0598da69daee2b46fa1f82f074019981656f7cae26fed2b7f076c611e330a99ba5c70156ae37682f59a8d6ec6486119c70cb283c9fff25bd4f20db7fdc27 +"core-js@npm:^3.38.1": + version: 3.38.1 + resolution: "core-js@npm:3.38.1" + checksum: 55703c2f6fcd537e47a5cc83e9dc9884efef61861bbefb4a96a8c95e87956db980ce314628465dd49f14e626c5e633b9e3433f3e4a1f628404a14da420eb2556 languageName: node linkType: hard @@ -15200,6 +15153,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + languageName: node + linkType: hard + "date-fns@npm:^2.23.0, date-fns@npm:^2.30.0": version: 2.30.0 resolution: "date-fns@npm:2.30.0" @@ -15437,6 +15423,17 @@ __metadata: languageName: node linkType: hard +"define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" + dependencies: + define-data-property: ^1.0.1 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 + languageName: node + linkType: hard + "defined@npm:^1.0.0": version: 1.0.1 resolution: "defined@npm:1.0.1" @@ -15992,11 +15989,11 @@ __metadata: version: 0.0.0-use.local resolution: "enkrypt@workspace:." dependencies: - "@commitlint/cli": ^19.3.0 - "@commitlint/config-conventional": ^19.2.2 - "@swc/core": ^1.7.6 + "@commitlint/cli": ^19.4.1 + "@commitlint/config-conventional": ^19.4.1 + "@swc/core": ^1.7.24 concurrently: ^8.2.2 - husky: ^9.1.4 + husky: ^9.1.5 node-notifier: ^10.0.1 nodemon: ^3.1.4 ultra-runner: ^3.10.5 @@ -16123,6 +16120,60 @@ __metadata: languageName: node linkType: hard +"es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" + dependencies: + array-buffer-byte-length: ^1.0.1 + arraybuffer.prototype.slice: ^1.0.3 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + data-view-buffer: ^1.0.1 + data-view-byte-length: ^1.0.1 + data-view-byte-offset: ^1.0.0 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-set-tostringtag: ^2.0.3 + es-to-primitive: ^1.2.1 + function.prototype.name: ^1.1.6 + get-intrinsic: ^1.2.4 + get-symbol-description: ^1.0.2 + globalthis: ^1.0.3 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + has-proto: ^1.0.3 + has-symbols: ^1.0.3 + hasown: ^2.0.2 + internal-slot: ^1.0.7 + is-array-buffer: ^3.0.4 + is-callable: ^1.2.7 + is-data-view: ^1.0.1 + is-negative-zero: ^2.0.3 + is-regex: ^1.1.4 + is-shared-array-buffer: ^1.0.3 + is-string: ^1.0.7 + is-typed-array: ^1.1.13 + is-weakref: ^1.0.2 + object-inspect: ^1.13.1 + object-keys: ^1.1.1 + object.assign: ^4.1.5 + regexp.prototype.flags: ^1.5.2 + safe-array-concat: ^1.1.2 + safe-regex-test: ^1.0.3 + string.prototype.trim: ^1.2.9 + string.prototype.trimend: ^1.0.8 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.2 + typed-array-byte-length: ^1.0.1 + typed-array-byte-offset: ^1.0.2 + typed-array-length: ^1.0.6 + unbox-primitive: ^1.0.2 + which-typed-array: ^1.1.15 + checksum: f840cf161224252512f9527306b57117192696571e07920f777cb893454e32999206198b4f075516112af6459daca282826d1735c450528470356d09eff3a9ae + languageName: node + linkType: hard + "es-define-property@npm:^1.0.0": version: 1.0.0 resolution: "es-define-property@npm:1.0.0" @@ -16132,7 +16183,7 @@ __metadata: languageName: node linkType: hard -"es-errors@npm:^1.3.0": +"es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 @@ -16146,6 +16197,15 @@ __metadata: languageName: node linkType: hard +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c + languageName: node + linkType: hard + "es-set-tostringtag@npm:^2.0.1": version: 2.0.1 resolution: "es-set-tostringtag@npm:2.0.1" @@ -16157,6 +16217,17 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.0.3": + version: 2.0.3 + resolution: "es-set-tostringtag@npm:2.0.3" + dependencies: + get-intrinsic: ^1.2.4 + has-tostringtag: ^1.0.2 + hasown: ^2.0.1 + checksum: 7227fa48a41c0ce83e0377b11130d324ac797390688135b8da5c28994c0165be8b252e15cd1de41e1325e5a5412511586960213e88f9ab4a5e7d028895db5129 + languageName: node + linkType: hard + "es-shim-unscopables@npm:^1.0.0": version: 1.0.0 resolution: "es-shim-unscopables@npm:1.0.0" @@ -16166,6 +16237,15 @@ __metadata: languageName: node linkType: hard +"es-shim-unscopables@npm:^1.0.2": + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" + dependencies: + hasown: ^2.0.0 + checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 + languageName: node + linkType: hard + "es-to-primitive@npm:^1.2.1": version: 1.2.1 resolution: "es-to-primitive@npm:1.2.1" @@ -16495,42 +16575,43 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.8.0": - version: 2.8.0 - resolution: "eslint-module-utils@npm:2.8.0" +"eslint-module-utils@npm:^2.9.0": + version: 2.11.0 + resolution: "eslint-module-utils@npm:2.11.0" dependencies: debug: ^3.2.7 peerDependenciesMeta: eslint: optional: true - checksum: 74c6dfea7641ebcfe174be61168541a11a14aa8d72e515f5f09af55cd0d0862686104b0524aa4b8e0ce66418a44aa38a94d2588743db5fd07a6b49ffd16921d2 + checksum: 8c2ecff3484835e031c8f1aa44119be65a058d195cce7b3ac827ad7ccc8bb5f9bcdd85230e2e3398981d07789bf4d90f3b81d106e67faf3cd26e0b34d73093af languageName: node linkType: hard -"eslint-plugin-import@npm:^2.29.1": - version: 2.29.1 - resolution: "eslint-plugin-import@npm:2.29.1" +"eslint-plugin-import@npm:^2.30.0": + version: 2.30.0 + resolution: "eslint-plugin-import@npm:2.30.0" dependencies: - array-includes: ^3.1.7 - array.prototype.findlastindex: ^1.2.3 + "@rtsao/scc": ^1.1.0 + array-includes: ^3.1.8 + array.prototype.findlastindex: ^1.2.5 array.prototype.flat: ^1.3.2 array.prototype.flatmap: ^1.3.2 debug: ^3.2.7 doctrine: ^2.1.0 eslint-import-resolver-node: ^0.3.9 - eslint-module-utils: ^2.8.0 - hasown: ^2.0.0 - is-core-module: ^2.13.1 + eslint-module-utils: ^2.9.0 + hasown: ^2.0.2 + is-core-module: ^2.15.1 is-glob: ^4.0.3 minimatch: ^3.1.2 - object.fromentries: ^2.0.7 - object.groupby: ^1.0.1 - object.values: ^1.1.7 + object.fromentries: ^2.0.8 + object.groupby: ^1.0.3 + object.values: ^1.2.0 semver: ^6.3.1 tsconfig-paths: ^3.15.0 peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: e65159aef808136d26d029b71c8c6e4cb5c628e65e5de77f1eb4c13a379315ae55c9c3afa847f43f4ff9df7e54515c77ffc6489c6a6f81f7dd7359267577468c + checksum: 0ec1ad69c0d22f15bc4a49ee97ae757e4adfc3181996f2c4a1ed4d5028bd99bab38e7623e58ef4477ba1db8425f441e4e986367125273efa4c5f7ad2c4467a9a languageName: node linkType: hard @@ -16790,15 +16871,6 @@ __metadata: languageName: node linkType: hard -"eth-rpc-errors@npm:^4.0.3": - version: 4.0.3 - resolution: "eth-rpc-errors@npm:4.0.3" - dependencies: - fast-safe-stringify: ^2.0.6 - checksum: 5fa31d1a10fdb340733b9a55e38e7687222c501052ca20743cef4d0c911a9bbcc0cad54aa6bf3e4b428604c071ff519803060e1cbc79ddb7c9257c11d407d32a - languageName: node - linkType: hard - "ethereum-bloom-filters@npm:^1.0.6": version: 1.0.10 resolution: "ethereum-bloom-filters@npm:1.0.10" @@ -17372,7 +17444,7 @@ __metadata: languageName: node linkType: hard -"fast-safe-stringify@npm:^2.0.6, fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.1.1": +"fast-safe-stringify@npm:^2.0.7, fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" checksum: a851cbddc451745662f8f00ddb622d6766f9bd97642dabfd9a405fb0d646d69fc0b9a1243cbf67f5f18a39f40f6fa821737651ff1bceeba06c9992ca2dc5bd3d @@ -17952,7 +18024,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.2.4": +"get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" dependencies: @@ -18014,6 +18086,17 @@ __metadata: languageName: node linkType: hard +"get-symbol-description@npm:^1.0.2": + version: 1.0.2 + resolution: "get-symbol-description@npm:1.0.2" + dependencies: + call-bind: ^1.0.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + checksum: e1cb53bc211f9dbe9691a4f97a46837a553c4e7caadd0488dc24ac694db8a390b93edd412b48dcdd0b4bbb4c595de1709effc75fc87c0839deedc6968f5bd973 + languageName: node + linkType: hard + "get-tsconfig@npm:^4.7.3": version: 4.7.4 resolution: "get-tsconfig@npm:4.7.4" @@ -18509,6 +18592,13 @@ __metadata: languageName: node linkType: hard +"has-proto@npm:^1.0.3": + version: 1.0.3 + resolution: "has-proto@npm:1.0.3" + checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 + languageName: node + linkType: hard + "has-symbol-support-x@npm:^1.4.1": version: 1.4.2 resolution: "has-symbol-support-x@npm:1.4.2" @@ -18541,6 +18631,15 @@ __metadata: languageName: node linkType: hard +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d + languageName: node + linkType: hard + "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" @@ -18625,6 +18724,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + "hdkey@npm:^2.1.0": version: 2.1.0 resolution: "hdkey@npm:2.1.0" @@ -18988,12 +19096,12 @@ __metadata: languageName: node linkType: hard -"husky@npm:^9.1.4": - version: 9.1.4 - resolution: "husky@npm:9.1.4" +"husky@npm:^9.1.5": + version: 9.1.5 + resolution: "husky@npm:9.1.5" bin: husky: bin.js - checksum: 7608a6dfac264876a2ff37f2db8520e0f9f0ea2b810a9ca151548327e9eca0b7ed58a63e0a208d20d3f43b191d8f111edcab46c3c8132c95e10ef7bd7115ee9b + checksum: c240018e852666dc12a93ca84751f1440bdf436468ba872c7b7b3cee54f5f1d7b4222a117988b27ca437093efdeb128778897ab0e409361336676a2c3012c8a7 languageName: node linkType: hard @@ -19031,13 +19139,6 @@ __metadata: languageName: node linkType: hard -"idb@npm:^8.0.0": - version: 8.0.0 - resolution: "idb@npm:8.0.0" - checksum: a9c6176c176dc1a73520ae906d33fcda8a6f6068cf64027e196763d4ad70b088b7141650ed68f3604e0f0ccd1a123f6b8a435ba5e4514f42ada3460c23b6747a - languageName: node - linkType: hard - "idna-uts46-hx@npm:^2.3.1": version: 2.3.1 resolution: "idna-uts46-hx@npm:2.3.1" @@ -19214,6 +19315,17 @@ __metadata: languageName: node linkType: hard +"internal-slot@npm:^1.0.7": + version: 1.0.7 + resolution: "internal-slot@npm:1.0.7" + dependencies: + es-errors: ^1.3.0 + hasown: ^2.0.0 + side-channel: ^1.0.4 + checksum: cadc5eea5d7d9bc2342e93aae9f31f04c196afebb11bde97448327049f492cd7081e18623ae71388aac9cd237b692ca3a105be9c68ac39c1dec679d7409e33eb + languageName: node + linkType: hard + "invariant@npm:2, invariant@npm:^2.2.2, invariant@npm:^2.2.4": version: 2.2.4 resolution: "invariant@npm:2.2.4" @@ -19281,6 +19393,16 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4": + version: 3.0.4 + resolution: "is-array-buffer@npm:3.0.4" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + checksum: e4e3e6ef0ff2239e75371d221f74bc3c26a03564a22efb39f6bb02609b598917ddeecef4e8c877df2a25888f247a98198959842a5e73236bc7f22cabdf6351a7 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -19357,7 +19479,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": +"is-core-module@npm:^2.13.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -19366,6 +19488,24 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.15.1": + version: 2.15.1 + resolution: "is-core-module@npm:2.15.1" + dependencies: + hasown: ^2.0.2 + checksum: df134c168115690724b62018c37b2f5bba0d5745fa16960b329c5a00883a8bea6a5632fdb1e3efcce237c201826ba09f93197b7cd95577ea56b0df335be23633 + languageName: node + linkType: hard + +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" + dependencies: + is-typed-array: ^1.1.13 + checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 + languageName: node + linkType: hard + "is-date-object@npm:^1.0.1": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" @@ -19502,6 +19642,13 @@ __metadata: languageName: node linkType: hard +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd + languageName: node + linkType: hard + "is-network-error@npm:^1.0.0": version: 1.1.0 resolution: "is-network-error@npm:1.1.0" @@ -19618,6 +19765,15 @@ __metadata: languageName: node linkType: hard +"is-shared-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "is-shared-array-buffer@npm:1.0.3" + dependencies: + call-bind: ^1.0.7 + checksum: a4fff602c309e64ccaa83b859255a43bb011145a42d3f56f67d9268b55bc7e6d98a5981a1d834186ad3105d6739d21547083fe7259c76c0468483fc538e716d8 + languageName: node + linkType: hard + "is-ssh@npm:^1.0.0, is-ssh@npm:^1.3.0": version: 1.4.0 resolution: "is-ssh@npm:1.4.0" @@ -19684,6 +19840,15 @@ __metadata: languageName: node linkType: hard +"is-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "is-typed-array@npm:1.1.13" + dependencies: + which-typed-array: ^1.1.14 + checksum: 150f9ada183a61554c91e1c4290086d2c100b0dff45f60b028519be72a8db964da403c48760723bf5253979b8dffe7b544246e0e5351dcd05c5fdb1dcc1dc0f0 + languageName: node + linkType: hard + "is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" @@ -20366,18 +20531,6 @@ __metadata: languageName: node linkType: hard -"json-stable-stringify@npm:^1.1.1": - version: 1.1.1 - resolution: "json-stable-stringify@npm:1.1.1" - dependencies: - call-bind: ^1.0.5 - isarray: ^2.0.5 - jsonify: ^0.0.1 - object-keys: ^1.1.1 - checksum: e1ba06600fd278767eeff53f28e408e29c867e79abf564e7aadc3ce8f31f667258f8db278ef28831e45884dd687388fa1910f46e599fc19fb94c9afbbe3a4de8 - languageName: node - linkType: hard - "json-stable-stringify@npm:~0.0.0": version: 0.0.1 resolution: "json-stable-stringify@npm:0.0.1" @@ -20423,6 +20576,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:^3.3.1": + version: 3.3.1 + resolution: "jsonc-parser@npm:3.3.1" + checksum: 81ef19d98d9c6bd6e4a37a95e2753c51c21705cbeffd895e177f4b542cca9cda5fda12fb942a71a2e824a9132cf119dc2e642e9286386055e1365b5478f49a47 + languageName: node + linkType: hard + "jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" @@ -20460,7 +20620,7 @@ __metadata: languageName: node linkType: hard -"jsonify@npm:^0.0.1, jsonify@npm:~0.0.0": +"jsonify@npm:~0.0.0": version: 0.0.1 resolution: "jsonify@npm:0.0.1" checksum: 027287e1c0294fce15f18c0ff990cfc2318e7f01fb76515f784d5cd0784abfec6fc5c2355c3a2f2cb0ad7f4aa2f5b74ebbfe4e80476c35b2d13cabdb572e1134 @@ -21207,12 +21367,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.10": - version: 0.30.10 - resolution: "magic-string@npm:0.30.10" +"magic-string@npm:^0.30.11": + version: 0.30.11 + resolution: "magic-string@npm:0.30.11" dependencies: - "@jridgewell/sourcemap-codec": ^1.4.15 - checksum: 456fd47c39b296c47dff967e1965121ace35417eab7f45a99e681e725b8661b48e1573c366ee67a27715025b3740773c46b088f115421c7365ea4ea6fa10d399 + "@jridgewell/sourcemap-codec": ^1.5.0 + checksum: e041649453c9a3f31d2e731fc10e38604d50e20d3585cd48bc7713a6e2e1a3ad3012105929ca15750d59d0a3f1904405e4b95a23b7e69dc256db3c277a73a3ca languageName: node linkType: hard @@ -21812,9 +21972,9 @@ __metadata: languageName: node linkType: hard -"mocha@npm:^10.7.0": - version: 10.7.0 - resolution: "mocha@npm:10.7.0" +"mocha@npm:^10.7.3": + version: 10.7.3 + resolution: "mocha@npm:10.7.3" dependencies: ansi-colors: ^4.1.3 browser-stdout: ^1.3.1 @@ -21839,7 +21999,7 @@ __metadata: bin: _mocha: bin/_mocha mocha: bin/mocha.js - checksum: e04c4ce7a61cacf0edd66a8e5ce04b14c1adaaac66c1c7765d5408f3c27b75583e104baa92709c40f207b7ff51bc80b85c4aa7b4e5ce25dbddd1e55d66aa774b + checksum: 956376dd8c7cd3e4f496ab1b06b7c89673ade2fb7f78704d8fce32b491f6940550eb1e784b7eef617e37fa29257a728df8b5b2b5e34ed7e83a692652290fab3c languageName: node linkType: hard @@ -22215,14 +22375,14 @@ __metadata: languageName: node linkType: hard -"nock@npm:^13.5.0": - version: 13.5.4 - resolution: "nock@npm:13.5.4" +"nock@npm:^13.5.4": + version: 13.5.5 + resolution: "nock@npm:13.5.5" dependencies: debug: ^4.1.0 json-stringify-safe: ^5.0.1 propagate: ^2.0.0 - checksum: d31f924e34c87ae985edfb7b5a56e8a4dcfc3a072334ceb6d686326581f93090b3e23492663a64ce61b8df4f365b113231d926bc300bcfe9e5eb309c3e4b8628 + checksum: 91947b683992096a694140714323f11493b8ad9961c172e3e574c4801131fea259755e95c48e7e01527c14209967c20f151ff03b6bf6700471f0f76fa4071d32 languageName: node linkType: hard @@ -22671,6 +22831,18 @@ __metadata: languageName: node linkType: hard +"object.assign@npm:^4.1.5": + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" + dependencies: + call-bind: ^1.0.5 + define-properties: ^1.2.1 + has-symbols: ^1.0.3 + object-keys: ^1.1.1 + checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 + languageName: node + linkType: hard + "object.entries@npm:^1.1.5": version: 1.1.5 resolution: "object.entries@npm:1.1.5" @@ -22682,37 +22854,37 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.7": - version: 2.0.7 - resolution: "object.fromentries@npm:2.0.7" +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 7341ce246e248b39a431b87a9ddd331ff52a454deb79afebc95609f94b1f8238966cf21f52188f2a353f0fdf83294f32f1ebf1f7826aae915ebad21fd0678065 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + checksum: 29b2207a2db2782d7ced83f93b3ff5d425f901945f3665ffda1821e30a7253cd1fd6b891a64279976098137ddfa883d748787a6fea53ecdb51f8df8b8cec0ae1 languageName: node linkType: hard -"object.groupby@npm:^1.0.1": - version: 1.0.1 - resolution: "object.groupby@npm:1.0.1" +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - checksum: d7959d6eaaba358b1608066fc67ac97f23ce6f573dc8fc661f68c52be165266fcb02937076aedb0e42722fdda0bdc0bbf74778196ac04868178888e9fd3b78b5 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + checksum: 0d30693ca3ace29720bffd20b3130451dca7a56c612e1926c0a1a15e4306061d84410bdb1456be2656c5aca53c81b7a3661eceaa362db1bba6669c2c9b6d1982 languageName: node linkType: hard -"object.values@npm:^1.1.7": - version: 1.1.7 - resolution: "object.values@npm:1.1.7" +"object.values@npm:^1.2.0": + version: 1.2.0 + resolution: "object.values@npm:1.2.0" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: f3e4ae4f21eb1cc7cebb6ce036d4c67b36e1c750428d7b7623c56a0db90edced63d08af8a316d81dfb7c41a3a5fa81b05b7cc9426e98d7da986b1682460f0777 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: 51fef456c2a544275cb1766897f34ded968b22adfc13ba13b5e4815fdaf4304a90d42a3aee114b1f1ede048a4890381d47a5594d84296f2767c6a0364b9da8fa languageName: node linkType: hard @@ -23528,12 +23700,12 @@ __metadata: languageName: node linkType: hard -"pinia@npm:^2.2.0": - version: 2.2.0 - resolution: "pinia@npm:2.2.0" +"pinia@npm:^2.2.2": + version: 2.2.2 + resolution: "pinia@npm:2.2.2" dependencies: "@vue/devtools-api": ^6.6.3 - vue-demi: ^0.14.8 + vue-demi: ^0.14.10 peerDependencies: "@vue/composition-api": ^1.4.0 typescript: ">=4.4.4" @@ -23543,7 +23715,7 @@ __metadata: optional: true typescript: optional: true - checksum: a63231147370b640adcdea2c55fe7ecdc6c55adfe31ae61d141dd9593a6d996c2495c9ed89574cc4c2bcb222454d9c6f4a0936add3f5edd42908592b4ae269da + checksum: 87da2d803edc181a46de14513aae2a252b0218561113ce3d970ffb90f4768d12f3526369ed5a457fe8a1f93f8a16aaf691e624f5a54e54101110c30b424698c9 languageName: node linkType: hard @@ -23708,6 +23880,13 @@ __metadata: languageName: node linkType: hard +"possible-typed-array-names@npm:^1.0.0": + version: 1.0.0 + resolution: "possible-typed-array-names@npm:1.0.0" + checksum: b32d403ece71e042385cc7856385cecf1cd8e144fa74d2f1de40d1e16035dba097bc189715925e79b67bdd1472796ff168d3a90d296356c9c94d272d5b95f3ae + languageName: node + linkType: hard + "postcss-calc@npm:^8.2.3": version: 8.2.4 resolution: "postcss-calc@npm:8.2.4" @@ -24131,14 +24310,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.40": - version: 8.4.40 - resolution: "postcss@npm:8.4.40" +"postcss@npm:^8.4.44": + version: 8.4.45 + resolution: "postcss@npm:8.4.45" dependencies: nanoid: ^3.3.7 picocolors: ^1.0.1 source-map-js: ^1.2.0 - checksum: afd0cc49d2169dcd96c0f17e155c5d75de048956306a3017f1cfa6a7d66b941592245bed20f7796ceeccb2d8967749b623be2c7b010a74f67ea10fb5bdb8ba28 + checksum: 3223cdad4a9392c0b334ee3ee7e4e8041c631cb6160609cef83c18d2b2580e931dd8068ab13cc6000c1a254d57492ac6c38717efc397c5dcc9756d06bc9c44f3 languageName: node linkType: hard @@ -24755,24 +24934,21 @@ __metadata: languageName: node linkType: hard -"rango-sdk-basic@npm:^0.1.52": - version: 0.1.52 - resolution: "rango-sdk-basic@npm:0.1.52" +"rango-sdk-basic@npm:^0.1.56": + version: 0.1.56 + resolution: "rango-sdk-basic@npm:0.1.56" dependencies: - axios: ^1.7.2 - bignumber.js: ^9.1.1 - eth-rpc-errors: ^4.0.3 - ethers: ^5.7.2 - rango-types: ^0.1.72 + axios: ^1.7.4 + rango-types: ^0.1.73 uuid-random: ^1.3.2 - checksum: 93c1df3485dd8cbec6226e1f503a81ba613d125b79f96f41bdf38da82763a94da35a53ff0b4b789dc917c5e53851ec1a77e7b2e2df30f1e4249efacb4d20d628 + checksum: c7ec70bc983c53206c8924b419b08fccd79e4eb00490da34b38a021c0b5760171915ad5d6b179bd94fd19c1d6fd66e858eb4fd982bf65b87f6db12f6c050d3b4 languageName: node linkType: hard -"rango-types@npm:^0.1.72": - version: 0.1.72 - resolution: "rango-types@npm:0.1.72" - checksum: 765a094b290bc60303d4739b924df5f12862d4cc2e93434fd386f6ae878b96ed66369fc43286e74c3f227177084da84432b84ff398f5ddbe1920faf883fc5775 +"rango-types@npm:^0.1.73": + version: 0.1.73 + resolution: "rango-types@npm:0.1.73" + checksum: 715ee8d059dddc21c81a87b1e22a5e8a20bc21e93cb2a2563e60981b50d7d060941ebaafe3acf3140f945f1a8d871131bf90824fd1418a773fbb6da62d9849b4 languageName: node linkType: hard @@ -25063,6 +25239,18 @@ __metadata: languageName: node linkType: hard +"regexp.prototype.flags@npm:^1.5.2": + version: 1.5.2 + resolution: "regexp.prototype.flags@npm:1.5.2" + dependencies: + call-bind: ^1.0.6 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + set-function-name: ^2.0.1 + checksum: d7f333667d5c564e2d7a97c56c3075d64c722c9bb51b2b4df6822b2e8096d623a5e63088fb4c83df919b6951ef8113841de8b47de7224872fa6838bc5d8a7d64 + languageName: node + linkType: hard + "regexpu-core@npm:^5.0.1": version: 5.0.1 resolution: "regexpu-core@npm:5.0.1" @@ -25603,26 +25791,26 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.20.0": - version: 4.20.0 - resolution: "rollup@npm:4.20.0" - dependencies: - "@rollup/rollup-android-arm-eabi": 4.20.0 - "@rollup/rollup-android-arm64": 4.20.0 - "@rollup/rollup-darwin-arm64": 4.20.0 - "@rollup/rollup-darwin-x64": 4.20.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.20.0 - "@rollup/rollup-linux-arm-musleabihf": 4.20.0 - "@rollup/rollup-linux-arm64-gnu": 4.20.0 - "@rollup/rollup-linux-arm64-musl": 4.20.0 - "@rollup/rollup-linux-powerpc64le-gnu": 4.20.0 - "@rollup/rollup-linux-riscv64-gnu": 4.20.0 - "@rollup/rollup-linux-s390x-gnu": 4.20.0 - "@rollup/rollup-linux-x64-gnu": 4.20.0 - "@rollup/rollup-linux-x64-musl": 4.20.0 - "@rollup/rollup-win32-arm64-msvc": 4.20.0 - "@rollup/rollup-win32-ia32-msvc": 4.20.0 - "@rollup/rollup-win32-x64-msvc": 4.20.0 +"rollup@npm:^4.21.2": + version: 4.21.2 + resolution: "rollup@npm:4.21.2" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.21.2 + "@rollup/rollup-android-arm64": 4.21.2 + "@rollup/rollup-darwin-arm64": 4.21.2 + "@rollup/rollup-darwin-x64": 4.21.2 + "@rollup/rollup-linux-arm-gnueabihf": 4.21.2 + "@rollup/rollup-linux-arm-musleabihf": 4.21.2 + "@rollup/rollup-linux-arm64-gnu": 4.21.2 + "@rollup/rollup-linux-arm64-musl": 4.21.2 + "@rollup/rollup-linux-powerpc64le-gnu": 4.21.2 + "@rollup/rollup-linux-riscv64-gnu": 4.21.2 + "@rollup/rollup-linux-s390x-gnu": 4.21.2 + "@rollup/rollup-linux-x64-gnu": 4.21.2 + "@rollup/rollup-linux-x64-musl": 4.21.2 + "@rollup/rollup-win32-arm64-msvc": 4.21.2 + "@rollup/rollup-win32-ia32-msvc": 4.21.2 + "@rollup/rollup-win32-x64-msvc": 4.21.2 "@types/estree": 1.0.5 fsevents: ~2.3.2 dependenciesMeta: @@ -25662,7 +25850,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 92c6c68a93d7726345df2627fd5b0a88d1481fbe76e6c8ad84a8eae6835c03fc36ed4cb3271350b5290397b26eb97a97297496ca972289b2299a24e81649bca0 + checksum: ac83ca15495dd00d6b910e87e7f5f2c480d36977471ec11e3d207089e0aa207d34fc9bd0270f7804b268a7f7473d3bc6b65bccf474fbd1d1826a70bde2741894 languageName: node linkType: hard @@ -25685,7 +25873,7 @@ __metadata: languageName: node linkType: hard -"rpc-websockets@npm:^9.0.0, rpc-websockets@npm:^9.0.2": +"rpc-websockets@npm:^9.0.2": version: 9.0.2 resolution: "rpc-websockets@npm:9.0.2" dependencies: @@ -25746,6 +25934,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" + dependencies: + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 + languageName: node + linkType: hard + "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -25778,6 +25978,17 @@ __metadata: languageName: node linkType: hard +"safe-regex-test@npm:^1.0.3": + version: 1.0.3 + resolution: "safe-regex-test@npm:1.0.3" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-regex: ^1.1.4 + checksum: 6c7d392ff1ae7a3ae85273450ed02d1d131f1d2c76e177d6b03eb88e6df8fa062639070e7d311802c1615f351f18dc58f9454501c58e28d5ffd9b8f502ba6489 + languageName: node + linkType: hard + "safe-stable-stringify@npm:^2.1.0, safe-stable-stringify@npm:^2.3.1": version: 2.4.3 resolution: "safe-stable-stringify@npm:2.4.3" @@ -26163,6 +26374,18 @@ __metadata: languageName: node linkType: hard +"set-function-name@npm:^2.0.1": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.2 + checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f + languageName: node + linkType: hard + "setimmediate@npm:1.0.4": version: 1.0.4 resolution: "setimmediate@npm:1.0.4" @@ -26419,12 +26642,12 @@ __metadata: languageName: node linkType: hard -"smoldot@npm:2.0.22": - version: 2.0.22 - resolution: "smoldot@npm:2.0.22" +"smoldot@npm:2.0.26": + version: 2.0.26 + resolution: "smoldot@npm:2.0.26" dependencies: ws: ^8.8.1 - checksum: 383bc6a5481190d64302fad56e9e4120a484885aee5543b268887de425708f04e8b3b3b69893333dfd9fd0e596f006afaa7c7ee5ff260c5d2be929c60302d385 + checksum: df1b27afae3ade7ee08947ca73f6e7afd450106b7ae4ff127ad7e71b7c20b01a2dc64135a07a7039aeeb23ad30fb549d7003c3131afa368f47125abf6837d919 languageName: node linkType: hard @@ -26903,6 +27126,18 @@ __metadata: languageName: node linkType: hard +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.0 + es-object-atoms: ^1.0.0 + checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 + languageName: node + linkType: hard + "string.prototype.trimend@npm:^1.0.7": version: 1.0.7 resolution: "string.prototype.trimend@npm:1.0.7" @@ -26914,6 +27149,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd + languageName: node + linkType: hard + "string.prototype.trimstart@npm:^1.0.7": version: 1.0.7 resolution: "string.prototype.trimstart@npm:1.0.7" @@ -26925,6 +27171,17 @@ __metadata: languageName: node linkType: hard +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -27118,13 +27375,6 @@ __metadata: languageName: node linkType: hard -"superstruct@npm:^1.0.4": - version: 1.0.4 - resolution: "superstruct@npm:1.0.4" - checksum: 2e070994cc4998a753c3f0215449d6de01ffb8180e4f46527f559ffbc2ebcc40fcf428f545ccd355921ef2920db7d138a96258ae35c788e6c24b2aa8bb1695cb - languageName: node - linkType: hard - "superstruct@npm:^2.0.2": version: 2.0.2 resolution: "superstruct@npm:2.0.2" @@ -27251,12 +27501,12 @@ __metadata: languageName: node linkType: hard -"systeminformation@npm:^5.23.3": - version: 5.23.3 - resolution: "systeminformation@npm:5.23.3" +"systeminformation@npm:^5.23.5": + version: 5.23.5 + resolution: "systeminformation@npm:5.23.5" bin: systeminformation: lib/cli.js - checksum: b36ef16df59b8bd8ebf48ccc113c90d18810e49909698f5622c7c331d3b8fd44fd484804aee50a3a17b69638a91be4380b53514a7195026c4eb8680eb0be68c9 + checksum: 2a3983cd06c3d174c0102126a67522e88c5a72fae9dcb2dae9668ae96dc5c0c45fc5a59a89c8d5b4394773dfc6fbb11af379bb789c7e1d6697e267fa8161203d conditions: (os=darwin | os=linux | os=win32 | os=freebsd | os=openbsd | os=netbsd | os=sunos | os=android) languageName: node linkType: hard @@ -27878,6 +28128,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.6.3": + version: 2.7.0 + resolution: "tslib@npm:2.7.0" + checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 + languageName: node + linkType: hard + "tsup@npm:^8.2.4": version: 8.2.4 resolution: "tsup@npm:8.2.4" @@ -28064,10 +28321,10 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^4.23.0": - version: 4.23.0 - resolution: "type-fest@npm:4.23.0" - checksum: 75466563be2d3d116a0b70ffe76a7f72947e3350ceacbc8509a7d841670dddc2fbb008109f0307888137794cf25681fd50f65bf8873bcdc17bc7ac8912c70114 +"type-fest@npm:^4.26.1": + version: 4.26.1 + resolution: "type-fest@npm:4.26.1" + checksum: 7188db3bca82afa62c69a8043fb7c5eb74e63c45e7e28efb986da1629d844286f7181bc5a8185f38989fffff0d6c96be66fd13529b01932d1b6ebe725181d31a languageName: node linkType: hard @@ -28113,6 +28370,17 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-buffer@npm:1.0.2" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-typed-array: ^1.1.13 + checksum: 02ffc185d29c6df07968272b15d5319a1610817916ec8d4cd670ded5d1efe72901541ff2202fcc622730d8a549c76e198a2f74e312eabbfb712ed907d45cbb0b + languageName: node + linkType: hard + "typed-array-byte-length@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-length@npm:1.0.0" @@ -28125,6 +28393,19 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "typed-array-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: f65e5ecd1cf76b1a2d0d6f631f3ea3cdb5e08da106c6703ffe687d583e49954d570cc80434816d3746e18be889ffe53c58bf3e538081ea4077c26a41055b216d + languageName: node + linkType: hard + "typed-array-byte-offset@npm:^1.0.0": version: 1.0.0 resolution: "typed-array-byte-offset@npm:1.0.0" @@ -28138,6 +28419,20 @@ __metadata: languageName: node linkType: hard +"typed-array-byte-offset@npm:^1.0.2": + version: 1.0.2 + resolution: "typed-array-byte-offset@npm:1.0.2" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + checksum: c8645c8794a621a0adcc142e0e2c57b1823bbfa4d590ad2c76b266aa3823895cf7afb9a893bf6685e18454ab1b0241e1a8d885a2d1340948efa4b56add4b5f67 + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" @@ -28149,6 +28444,20 @@ __metadata: languageName: node linkType: hard +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" + dependencies: + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-proto: ^1.0.3 + is-typed-array: ^1.1.13 + possible-typed-array-names: ^1.0.0 + checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c + languageName: node + linkType: hard + "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -28205,13 +28514,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.5.4": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" +"typescript@npm:^5.6.2": + version: 5.6.2 + resolution: "typescript@npm:5.6.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: b309040f3a1cd91c68a5a58af6b9fdd4e849b8c42d837b2c2e73f9a4f96a98c4f1ed398a9aab576ee0a4748f5690cf594e6b99dbe61de7839da748c41e6d6ca8 + checksum: 48777e1dabd9044519f56cd012b0296e3b72bafe12b7e8e34222751d45c67e0eba5387ecdaa6c14a53871a29361127798df6dc8d1d35643a0a47cb0b1c65a33a languageName: node linkType: hard @@ -28225,13 +28534,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^5.5.4#~builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#~builtin::version=5.5.4&hash=5adc0c" +"typescript@patch:typescript@^5.6.2#~builtin": + version: 5.6.2 + resolution: "typescript@patch:typescript@npm%3A5.6.2#~builtin::version=5.6.2&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: fc52962f31a5bcb716d4213bef516885e4f01f30cea797a831205fc9ef12b405a40561c40eae3127ab85ba1548e7df49df2bcdee6b84a94bfbe3a0d7eff16b14 + checksum: c084ee1ab865f108c787e6233a5f63c126c482c0c8e87ec998ac5288a2ad54b603e1ea8b8b272355823b833eb31b9fabb99e8c6152283e1cb47e3a76bd6faf6c languageName: node linkType: hard @@ -28408,10 +28717,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 languageName: node linkType: hard @@ -28878,7 +29187,7 @@ __metadata: languageName: node linkType: hard -"vue-demi@npm:^0.14.8": +"vue-demi@npm:^0.14.10": version: 0.14.10 resolution: "vue-demi@npm:0.14.10" peerDependencies: @@ -28894,9 +29203,9 @@ __metadata: languageName: node linkType: hard -"vue-echarts@npm:7.0.1": - version: 7.0.1 - resolution: "vue-echarts@npm:7.0.1" +"vue-echarts@npm:7.0.3": + version: 7.0.3 + resolution: "vue-echarts@npm:7.0.3" dependencies: vue-demi: ^0.13.11 peerDependencies: @@ -28906,7 +29215,7 @@ __metadata: peerDependenciesMeta: "@vue/runtime-core": optional: true - checksum: aecdd9d98551904e3d759618f5b2da9de5bc59169f13b2626c57f11214b1d7e48722b4cbc0a809fb5362fb54d703173a7a930abfa6bddc45624c3cc05e004cdf + checksum: 3d59f50690fcf7b20edcd7a457fa9e49bf764aef32cd919b7613cf39ae94d783aae4cea60f87922dcef7804b4ff97e59efdfcc64e020f41e4d7b8ba80f9c58db languageName: node linkType: hard @@ -28964,14 +29273,14 @@ __metadata: languageName: node linkType: hard -"vue-router@npm:4.4.2": - version: 4.4.2 - resolution: "vue-router@npm:4.4.2" +"vue-router@npm:4.4.3": + version: 4.4.3 + resolution: "vue-router@npm:4.4.3" dependencies: "@vue/devtools-api": ^6.6.3 peerDependencies: vue: ^3.2.0 - checksum: 85b524f2bea830a555ec53de11653759cabe1af3eb29d7b7d7f6cc8d6220ba184699cd2ec856910918ec7108cbbb2591aaf5056f06fbb820979f557eb70bb686 + checksum: b1eaa94f8048fc84190cf7ebf5e6fad1e157ef6f41caabb425355730e77092904e715d02b026b96972457f9d4ace2b18e86de85142e269230c8ac71e3a17005e languageName: node linkType: hard @@ -29002,16 +29311,16 @@ __metadata: languageName: node linkType: hard -"vue3-lottie@npm:^3.3.0": - version: 3.3.0 - resolution: "vue3-lottie@npm:3.3.0" +"vue3-lottie@npm:^3.3.1": + version: 3.3.1 + resolution: "vue3-lottie@npm:3.3.1" dependencies: fast-deep-equal: ^3.1.3 klona: ^2.0.6 lottie-web: 5.12.2 peerDependencies: vue: ^3.2 - checksum: d6ae0e8116ba3eae1d92e67045ce8f128a9d63163fa4288c2dda0cc1e983eafdd40bc5c203c1d03fa01759d808e248816a1b78ec9194e487da9e8c7fb83a094b + checksum: ea8e0f016ad121116e876524f74107055040278025d07f6fc7dc42a722468ad8c3a57ccec91163eaf10c386225e8f77e312d5a91eee37640383bc479202a6894 languageName: node linkType: hard @@ -29025,21 +29334,21 @@ __metadata: languageName: node linkType: hard -"vue@npm:^3.4.35": - version: 3.4.35 - resolution: "vue@npm:3.4.35" +"vue@npm:^3.5.3": + version: 3.5.3 + resolution: "vue@npm:3.5.3" dependencies: - "@vue/compiler-dom": 3.4.35 - "@vue/compiler-sfc": 3.4.35 - "@vue/runtime-dom": 3.4.35 - "@vue/server-renderer": 3.4.35 - "@vue/shared": 3.4.35 + "@vue/compiler-dom": 3.5.3 + "@vue/compiler-sfc": 3.5.3 + "@vue/runtime-dom": 3.5.3 + "@vue/server-renderer": 3.5.3 + "@vue/shared": 3.5.3 peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - checksum: 7f9d369fa86a6b723d368b706b7ce2eef4437bf99d28137b91e517837074f232727ea342c643cc0de9925c764b321041a2dbbd0f62210d1bbe9efad2b49e7f53 + checksum: b121ceec47325bf3a5f630705cf0053cf637e6cae1ce71ac3531d749737e579bae4a8a734d8fa4387879761a4b754a6b8b177e29d5438d1502f3145a9736e158 languageName: node linkType: hard @@ -30440,6 +30749,19 @@ __metadata: languageName: node linkType: hard +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + has-tostringtag: ^1.0.2 + checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 + languageName: node + linkType: hard + "which@npm:^1.2.9": version: 1.3.1 resolution: "which@npm:1.3.1" @@ -30684,21 +31006,6 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.17.1": - version: 8.17.1 - resolution: "ws@npm:8.17.1" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf - languageName: node - linkType: hard - "ws@npm:^8.18.0": version: 8.18.0 resolution: "ws@npm:8.18.0" From 199a5aada5a12ca04eca12fd2d540d395fab2f65 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:09:50 -0700 Subject: [PATCH 317/375] fix: tests --- packages/swap/src/providers/jupiter/index.ts | 10 +++++----- packages/swap/src/providers/rango/index.ts | 3 +-- packages/swap/tests/changelly.test.ts | 6 +++--- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 6071a6166..874ef65e3 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -11,11 +11,14 @@ import { TransactionMessage, VersionedTransaction, } from "@solana/web3.js"; +import { toBN } from "web3-utils"; +import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "../../utils/approvals"; +import { extractComputeBudget } from "../../utils/solana"; import { DEFAULT_SLIPPAGE, FEE_CONFIGS, NATIVE_TOKEN_ADDRESS, -} from "@src/configs"; +} from "../../configs"; import { ProviderClass, ProviderName, @@ -34,10 +37,7 @@ import { StatusOptionsResponse, SolanaTransaction, TokenNetworkType, -} from "@src/types"; -import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "@src/utils/approvals"; -import { extractComputeBudget } from "@src/utils/solana"; -import { toBN } from "web3-utils"; +} from "../../types"; /** * # Jupiter swap flow diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index 8de8de661..ae26e91ca 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -11,7 +11,7 @@ import { TransactionType as RangoTransactionType, } from "rango-sdk-basic"; import { Connection, VersionedTransaction } from "@solana/web3.js"; -import { extractComputeBudget } from "@src/utils/solana"; +import { extractComputeBudget } from "../../utils/solana"; import { EVMTransaction, getQuoteOptions, @@ -149,7 +149,6 @@ class Rango extends ProviderClass { } async init(tokenList?: TokenType[]): Promise { - (window as any).rango = this; const resMeta = await rangoClient.meta({ excludeNonPopulars: true, transactionTypes: [RangoTransactionType.EVM, RangoTransactionType.SOLANA], diff --git a/packages/swap/tests/changelly.test.ts b/packages/swap/tests/changelly.test.ts index 9c14aa46a..818f2c665 100644 --- a/packages/swap/tests/changelly.test.ts +++ b/packages/swap/tests/changelly.test.ts @@ -20,7 +20,7 @@ import { describe("Changelly Provider", () => { // @ts-ignore const web3eth = new Web3Eth(nodeURL); - const changelly = new Changelly(web3eth, SupportedNetworkName.Ethereum); + const changelly = new Changelly(SupportedNetworkName.Ethereum); const init = changelly.init(); it("it should return a quote ", async () => { await init; @@ -70,7 +70,7 @@ describe("Changelly Provider", () => { }); it("it should initialize other networks: Bitcoin", async () => { - const changelly2 = new Changelly(web3eth, SupportedNetworkName.Bitcoin); + const changelly2 = new Changelly(SupportedNetworkName.Bitcoin); await changelly2.init(); const fromTokens = changelly2.getFromTokens(); expect(Object.values(fromTokens).length).to.be.eq(1); @@ -78,7 +78,7 @@ describe("Changelly Provider", () => { }); it("it should initialize other networks: Polkadot", async () => { - const changelly2 = new Changelly(web3eth, SupportedNetworkName.Polkadot); + const changelly2 = new Changelly(SupportedNetworkName.Polkadot); await changelly2.init(); const fromTokens = changelly2.getFromTokens(); expect(Object.values(fromTokens).length).to.be.eq(1); From e3e076891c1cc5f059820d4f5480e193780e1c56 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:12:15 -0700 Subject: [PATCH 318/375] chore: swap --- packages/swap/tests/changelly.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/swap/tests/changelly.test.ts b/packages/swap/tests/changelly.test.ts index 818f2c665..729998293 100644 --- a/packages/swap/tests/changelly.test.ts +++ b/packages/swap/tests/changelly.test.ts @@ -1,5 +1,4 @@ import { expect } from "chai"; -import Web3Eth from "web3-eth"; import { NATIVE_TOKEN_ADDRESS } from "../src/configs"; import Changelly from "../src/providers/changelly"; import { @@ -14,12 +13,10 @@ import { amount, fromAddress, toAddress, - nodeURL, } from "./fixtures/mainnet/configs"; describe("Changelly Provider", () => { // @ts-ignore - const web3eth = new Web3Eth(nodeURL); const changelly = new Changelly(SupportedNetworkName.Ethereum); const init = changelly.init(); it("it should return a quote ", async () => { From 5b22281e0879df3ea5f2a209196fa671ddb9acc3 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 9 Sep 2024 14:34:25 -0700 Subject: [PATCH 319/375] devop: add dapps to sol --- packages/extension/src/libs/dapp-list/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/extension/src/libs/dapp-list/index.ts b/packages/extension/src/libs/dapp-list/index.ts index 55ad778b7..2453be4fd 100644 --- a/packages/extension/src/libs/dapp-list/index.ts +++ b/packages/extension/src/libs/dapp-list/index.ts @@ -95,6 +95,8 @@ const lists: Partial> = { "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/dapps/scroll.json", [NetworkNames.Rari]: "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/dapps/rari.json", + [NetworkNames.Solana]: + "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/dapps/sol.json", }; export default lists; From 08e84b32e312ed94a639161a05b2e427ce7deb81 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 9 Sep 2024 19:44:17 -0500 Subject: [PATCH 320/375] fix: support for different token addresses in jupiter swap on solana --- .../views/swap/libs/send-transactions.ts | 5 +- .../action/views/swap/libs/solana-gasvals.ts | 54 ++- packages/swap/src/providers/jupiter/index.ts | 318 +++++++++++++----- 3 files changed, 281 insertions(+), 96 deletions(-) diff --git a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts index dab3fa3a2..e8a2f98c6 100644 --- a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts +++ b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts @@ -219,6 +219,7 @@ export const executeSwap = async ( // Send the transaction let txHash: string; try { + // TODO: don't skip preflight txHash = await conn.sendRawTransaction(tx.serialize()); } catch (err) { // Log error info if possible @@ -248,8 +249,8 @@ export const executeSwap = async ( // Trim the error so it doesn't break the UI by being too huge let msg = (err as Error).message; const len = msg.length; - if (len > 128 + 10 + len.toString().length) { - msg = `${msg.slice(0, 128)}... (128/${len.toString()})`; + if (len > 160 + 10 + len.toString().length) { + msg = `${msg.slice(0, 160)}... (160/${len.toString()})`; } throw new Error(msg); } diff --git a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts index b1605bffe..6a0109ab9 100644 --- a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts +++ b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts @@ -18,19 +18,57 @@ export const getSolanaTransactionFees = async ( ): Promise> => { let feesumlamp = additionalFee; const conn = ((await network.api()) as SolanaAPI).web3; - const latestBlockHash = await conn.getLatestBlockhash(); + let latestBlockHash = await conn.getLatestBlockhash(); for (let i = 0, len = txs.length; i < len; i++) { const tx = txs[i]; // Use the latest block hash in-case it's fallen too far behind tx.message.recentBlockhash = latestBlockHash.blockhash; - /** Base fee + priority fee + rent fees (but the rent fees seem slightly higher than expected @ 2024-09-04) */ - const fee = await conn.getFeeForMessage(tx.message); - if (fee.value == null) { - throw new Error( - `Failed to get fee for Solana VersionedTransaction ${i}. Transaction block hash possibly expired.` - ); + + // Not sure why but getFeeForMessage sometimes returns null, so we will retry + // with small backoff in-case it helps + const backoff = [0, 500, 1_500]; + /** 0 indexed attempt, used to index backoff ms from `backoff` */ + let attempt = 0; + let fee: number; + // eslint-disable-next-line no-constant-condition + while (true) { + if (attempt >= backoff.length) { + throw new Error( + `Failed to get fee for Solana VersionedTransaction ${i + 1}` + + ` after ${backoff.length} attempts.` + + ` Transaction block hash ${tx.message.recentBlockhash} possibly expired.` + ); + } + if (backoff[attempt] > 0) { + // wait before retrying + await new Promise((res) => { + return setTimeout(res, backoff[attempt]); + }); + } + // Update the block hash in-case it caused 0 fees to be returned + if (attempt > 0) { + latestBlockHash = await conn.getLatestBlockhash(); + tx.message.recentBlockhash = latestBlockHash.blockhash; + } + + /** Base fee + priority fee (Don't know why this returns null sometimes) */ + const feeResult = await conn.getFeeForMessage(tx.message); + if (feeResult.value == null) { + console.warn( + `Failed to get fee for Solana VersionedTransaction` + + ` ${i + 1}. Transaction block hash ${tx.message.recentBlockhash}` + + ` possibly expired. Attempt ${attempt + 1}/${backoff.length}.` + ); + } else { + // Success + fee = feeResult.value; + break; + } + + attempt += 1; } - feesumlamp = feesumlamp.add(toBN(fee.value)); + + feesumlamp = feesumlamp.add(toBN(fee)); } // Convert from lamports to SOL diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 6071a6166..31dbca39c 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -39,6 +39,9 @@ import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "@src/utils/approvals"; import { extractComputeBudget } from "@src/utils/solana"; import { toBN } from "web3-utils"; +/** Enables debug logging in this file */ +const DEBUG = false; + /** * # Jupiter swap flow * @@ -137,7 +140,9 @@ export const TOKEN_2022_PROGRAM_ID = new PublicKey( /** * Address of the SPL Associated Token Account program * - * @see https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb + * (Creates Associated Token Accounts (ATA)) + * + * @see https://solscan.io/account/ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL */ export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey( "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" @@ -152,10 +157,14 @@ const JUPITER_REFERRAL_ATA_ACCOUNT_SIZE_BYTES = 165; const SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES = 165; +let debug: (...args: any[]) => void; +if (DEBUG) { + console.debug.bind(console); +} // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function -const debug = (..._args: any[]) => {}; -// Use this debug instead to enable debug logging -// const debug = console.debug.bind(console); +else { + debug = (..._args: any[]) => {}; +} // Jupiter API Tokens @@ -172,7 +181,7 @@ type JupiterTokenInfo = { // Jupiter API Quote /** - * see https://station.jup.ag/api-v 6/get-quote + * see https://station.jup.ag/api-v6/get-quote * * ```sh * curl -sL -H 'Accept: application/json' 'https://quote-api.jup.ag/v6/quote?inputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&outputMint=So11111111111111111111111111111111111111112&amount=5' @@ -253,7 +262,7 @@ type JupiterSwapParams = { asLegacyTransaction?: boolean; /** Default: false */ useTokenLedger?: boolean; - /** Public key of key of token receiver. Default: user's ATA. */ + /** Public key of key of token receiver. Default: user's own ATA. */ destinationTokenAccount?: string; /** * Simulate the swap to get the compute units (like gas in the EVM) & @@ -413,6 +422,7 @@ export class Jupiter extends ProviderClass { const feeBps = Math.round(100 * feeConf.fee); const fromPubkey = new PublicKey(options.fromAddress); + const toPubkey = new PublicKey(options.toAddress); /** * Source token. @@ -464,11 +474,19 @@ export class Jupiter extends ProviderClass { { signal } ); + const dstTokenProgramId = await getTokenProgramOfMint(this.conn, dstMint); + const dstATAPubkey = getSPLAssociatedTokenAccountPubkey( + toPubkey, + dstMint, + dstTokenProgramId + ); + const swap = await getJupiterSwap( { quote, signerPubkey: fromPubkey, referrerATAPubkey, + dstATAPubkey, }, { signal } ); @@ -477,63 +495,91 @@ export class Jupiter extends ProviderClass { Buffer.from(swap.swapTransaction, "base64") ); - const tokenProgramId = await getTokenProgramOfMint(this.conn, srcMint); + const srcTokenProgramId = await getTokenProgramOfMint(this.conn, srcMint); /** Rent from having to create ATA accounts for the wallet & mint and the referral fee holder & mint */ let rentFees = 0; - if (!referrerATAExists) { + /** Instructions to be inserted at the start of the transaction to create requisite accounts */ + const extraInstructions: TransactionInstruction[] = []; + + if (referrerATAExists) { + debug( + `[JupiterSwapProvider.querySwapInfo] Referrer ATA already exists. No need to record additional rent fees.` + + ` ATA pubkey: ${referrerATAPubkey.toBase58()},` + + ` Source mint: ${srcMint.toBase58()}` + ); + } else { // The referral fee ATA account needs to be created or else we can't receive fees for this transaction - rentFees = await this.conn.getMinimumBalanceForRentExemption( + const extraRentFees = await this.conn.getMinimumBalanceForRentExemption( JUPITER_REFERRAL_ATA_ACCOUNT_SIZE_BYTES ); + // Get the instruction that creates the Jupiter referral ATA account + const instruction = getJupiterInitialiseReferralTokenAccountInstruction({ + payerPubkey: fromPubkey, + programId: JUPITER_REFERRAL_PROGRAM_PUBKEY, + vaultPubkey: JUPITER_REFERRAL_VAULT_PUBKEY, + referralAccountPubkey: referrerPubkey, + referralATAPubkey: referrerATAPubkey, + mintPubkey: srcMint, + systemProgramId: SystemProgram.programId, + tokenProgramId: srcTokenProgramId, + }); + + extraInstructions.push(instruction); + rentFees += extraRentFees; + debug( `[JupiterSwapProvider.querySwapInfo] Referrer ATA does not exist. Updating transaction with instruction to create it.` + ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + - ` Rent: ${rentFees} lamports` - ); - - tx = await updateSwapTransactionToCreateJupiterReferrerATA( - this.conn, - tx, - { - referrerPubkey, - mintPubkey: srcMint, - tokenProgramId, - referrerATAPubkey, - payerPubkey: new PublicKey(options.fromAddress), - } + ` Rent: ${extraRentFees} lamports,` + + ` Total Rent: ${extraRentFees} lamports` ); } // Will the destination token ATA for the swapper need to be created? - const walletDstMintATAPubkey = - getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( - fromPubkey, - dstMint, - tokenProgramId - ); - const walletDstMintATAExists = await solAccountExists( - this.conn, - walletDstMintATAPubkey - ); - if (walletDstMintATAExists) { + const dstATAExists = await solAccountExists(this.conn, dstATAPubkey); + + if (dstATAExists) { debug( - `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA already exists, no need to record additional rent fees.` + - ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + + `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA already exists. No need to record additional rent fees.` + + ` ATA pubkey: ${dstATAPubkey.toBase58()},` + ` Destination mint: ${dstMint.toBase58()}` ); } else { - rentFees += await this.conn.getMinimumBalanceForRentExemption( + const extraRentFee = await this.conn.getMinimumBalanceForRentExemption( SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES ); + + const instruction = getCreateAssociatedTokenAccountIdempotentInstruction({ + payerPubkey: fromPubkey, + ataPubkey: dstATAPubkey, + ownerPubkey: toPubkey, + mintPubkey: dstMint, + systemProgramId: SystemProgram.programId, + tokenProgramId: dstTokenProgramId, + associatedTokenProgramId: ASSOCIATED_TOKEN_PROGRAM_ID, + }); + + rentFees += extraRentFee; + extraInstructions.push(instruction); + debug( - `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA does not exist, it will be created by the swap transaction.` + + `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA does not exist, registering custom instruction to create it.` + ` Adding ATA rent to extra transaction fees.` + - ` ATA pubkey: ${walletDstMintATAPubkey.toBase58()},` + + ` ATA pubkey: ${dstATAPubkey.toBase58()},` + ` Destination mint: ${dstMint.toBase58()},` + - ` Rent: ${rentFees} lamports` + ` Rent: ${extraRentFee} lamports,` + + ` Total rent: ${rentFees} lamports` + ); + } + + if (extraInstructions.length) { + tx = await insertInstructionsAtStartOfTransaction( + this.conn, + tx, + extraInstructions ); } @@ -1052,6 +1098,8 @@ async function getJupiterSwap( params: { /** Base58 signer address that pays for the transaction */ signerPubkey: PublicKey; + /** Destination SPL ATA account that will receive ownership of the destination tokens */ + dstATAPubkey?: PublicKey; /** Base58 referrer address (created in the Jupiter dashboard, not the ATA address) */ referrerATAPubkey?: PublicKey; /** Response from Jupiter API */ @@ -1061,13 +1109,14 @@ async function getJupiterSwap( signal?: AbortSignal; } ): Promise { - const { signerPubkey, quote, referrerATAPubkey } = params; + const { signerPubkey, dstATAPubkey, quote, referrerATAPubkey } = params; const signal = context?.signal; const swapParams: JupiterSwapParams = { userPublicKey: signerPubkey.toBase58(), - feeAccount: referrerATAPubkey?.toBase58() ?? undefined, + feeAccount: referrerATAPubkey?.toBase58(), quoteResponse: quote, + destinationTokenAccount: dstATAPubkey?.toBase58(), }; const url = `${JUPITER_API_URL}swap`; @@ -1230,6 +1279,131 @@ function getJupiterReferrerAssociatedTokenAccount( return referrerATAPubkey; } +/** + * Construct a CreateAssociatedTokenAccountIdempotent instruction + * + * @param payer Payer of the initialization fees + * @param associatedToken New associated token account + * @param owner Owner of the new account + * @param mint Token mint account + * @param programId SPL Token program account + * @param associatedTokenProgramId SPL Associated Token program account + * + * @return Instruction to add to a transaction + */ +export function createAssociatedTokenAccountIdempotentInstruction( + payer: PublicKey, + associatedToken: PublicKey, + owner: PublicKey, + mint: PublicKey, + programId = TOKEN_PROGRAM_ID, + associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID +): TransactionInstruction { + return buildAssociatedTokenAccountInstruction( + payer, + associatedToken, + owner, + mint, + Buffer.from([1]), + programId, + associatedTokenProgramId + ); +} + +/** + * Create a transaction instruction that creates the given ATA for the owner and mint. + * + * Does nothing if the mint already exists. + * + * @see https://github.com/solana-labs/solana-program-library/blob/e018a30e751e759e62e17ad01864d4c57d090c26/token/js/src/instructions/associatedTokenAccount.ts#L49 + * @see https://github.com/solana-labs/solana-program-library/blob/e018a30e751e759e62e17ad01864d4c57d090c26/token/js/src/instructions/associatedTokenAccount.ts#L100 + */ +function getCreateAssociatedTokenAccountIdempotentInstruction(params: { + /** Payer of initialization / rent fees */ + payerPubkey: PublicKey; + /** Address of the Associated Token Account of `ownerPubkey` with `mintPubkey` @see `getSPLAssociatedTokenAccountPubkey` */ + ataPubkey: PublicKey; + /** Owner of the new SPL Associated Token Account */ + ownerPubkey: PublicKey; + /** + * SPL token address + * + * @example new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v') // USDC + * @example new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB') // USDT + * @example new PublicKey('So11111111111111111111111111111111111111112') // Wrapped SOL + */ + mintPubkey: PublicKey; + /** + * @example new PublicKey('11111111111111111111111111111111') + */ + systemProgramId: PublicKey; + /** + * SPL Token Program or 2022 SPL token program + * + * @example new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA') + * @example new PublicKey('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb') + */ + tokenProgramId: PublicKey; + /** + * SPL Associated Token Program account, + * + * @example new PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL') + * + * @see https://solscan.io/account/ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL + */ + associatedTokenProgramId: PublicKey; +}): TransactionInstruction { + const { + payerPubkey, + ataPubkey, + ownerPubkey, + mintPubkey, + systemProgramId, + tokenProgramId, + associatedTokenProgramId, + } = params; + + const keys = [ + { pubkey: payerPubkey, isSigner: true, isWritable: true }, + { pubkey: ataPubkey, isSigner: false, isWritable: true }, + { pubkey: ownerPubkey, isSigner: false, isWritable: false }, + { pubkey: mintPubkey, isSigner: false, isWritable: false }, + { pubkey: systemProgramId, isSigner: false, isWritable: false }, + { pubkey: tokenProgramId, isSigner: false, isWritable: false }, + ]; + + return new TransactionInstruction({ + keys, + programId: associatedTokenProgramId, + data: Buffer.from([1]), + }); +} + +function buildAssociatedTokenAccountInstruction( + payer: PublicKey, + associatedToken: PublicKey, + owner: PublicKey, + mint: PublicKey, + instructionData: Buffer, + programId = TOKEN_PROGRAM_ID, + associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID +): TransactionInstruction { + const keys = [ + { pubkey: payer, isSigner: true, isWritable: true }, + { pubkey: associatedToken, isSigner: false, isWritable: true }, + { pubkey: owner, isSigner: false, isWritable: false }, + { pubkey: mint, isSigner: false, isWritable: false }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + { pubkey: programId, isSigner: false, isWritable: false }, + ]; + + return new TransactionInstruction({ + keys, + programId: associatedTokenProgramId, + data: instructionData, + }); +} + /** * Links: * - [Jupiter Referral GitHub](https://github.com/TeamRaccoons/referral) @@ -1250,7 +1424,7 @@ function getJupiterReferrerAssociatedTokenAccount( * name: "initializeReferralTokenAccount", * args: [], * accounts: [ - * { name: "payer"; isMut: true; isSigner: true; * }, + * { name: "payer"; isMut: true; isSigner: true; }, * { name: "project"; isMut: false; isSigner: false; }, * { name: "referralAccount"; isMut: false; isSigner: false; }, * { name: "referralTokenAccount"; isMut: true; isSigner: false; }, @@ -1320,49 +1494,18 @@ function getJupiterInitialiseReferralTokenAccountInstruction(params: { } /** - * Modify the transaction received from the Jupiter swap API to also create the - * Jupiter referrer ATA account so that we can receive referral fees in it + * Insert new instructions at the start of a transaction, after compute budget and compute limit instructions */ -async function updateSwapTransactionToCreateJupiterReferrerATA( +async function insertInstructionsAtStartOfTransaction( conn: Connection, - /** Transaction direectly from Jupiter Swap */ tx: VersionedTransaction, - params: { - /** Pubkey paying for the transaction */ - payerPubkey: PublicKey; - /** Pubkey of your Jupiter referral account, from the Jupiter dashboard */ - referrerPubkey: PublicKey; - /** Jupiter referrer ATA pubkey @see `getJupiterReferrerAssociatedTokenAccount` */ - referrerATAPubkey: PublicKey; - /** SPL token address */ - mintPubkey: PublicKey; - /** The SPL token progam or the 2022 SPL token program */ - tokenProgramId: PublicKey; - } -) { - const { - payerPubkey, - referrerPubkey, - referrerATAPubkey, - mintPubkey, - tokenProgramId, - } = params; - - // Get the instruction that creates the Jupiter referral ATA account - const instruction = getJupiterInitialiseReferralTokenAccountInstruction({ - payerPubkey, - programId: JUPITER_REFERRAL_PROGRAM_PUBKEY, - vaultPubkey: JUPITER_REFERRAL_VAULT_PUBKEY, - referralAccountPubkey: referrerPubkey, - referralATAPubkey: referrerATAPubkey, - mintPubkey, - systemProgramId: SystemProgram.programId, - tokenProgramId, - }); + instructions: TransactionInstruction[] +): Promise { + if (instructions.length === 0) return tx; // Now we need to: // 1. Decompile the transaction - // 2. Put our instruction in it + // 2. Put our instructions in it // 3. Recompile it // Request lookup accounts so that we can decompile the message @@ -1378,6 +1521,7 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( const addressLookupTableAccounts: AddressLookupTableAccount[] = new Array( lookupAccountsCount ); + for (let i = 0; i < lookupAccountsCount; i++) { const lookup = tx.message.addressTableLookups[i]; const result = await conn.getAddressLookupTable(lookup.accountKey); @@ -1387,7 +1531,7 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( `Failed to get address lookup table for ${lookup.accountKey}` ); debug( - `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Fetching lookup account ${ + `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Fetching lookup account ${ i + 1 }. ${lookup.accountKey.toBase58()}` ); @@ -1418,10 +1562,10 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( default: { // insert our instruction here & continue debug( - `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` + `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` ); inserted = true; - decompiledTransactionMessage.instructions.splice(i, 0, instruction); + decompiledTransactionMessage.instructions.splice(i, 0, ...instructions); break instructionLoop; } } @@ -1430,14 +1574,16 @@ async function updateSwapTransactionToCreateJupiterReferrerATA( if (!inserted) { // If there were no compute budget instructions then just add it at the start debug( - `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` + `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` ); - decompiledTransactionMessage.instructions.unshift(instruction); + for (let len = instructions.length - 1, i = len - 1; i >= 0; i--) { + decompiledTransactionMessage.instructions.unshift(instructions[i]); + } } // Switch to using this modified transaction debug( - `[JupiterSwapProvider.updateSwapTransactionToCreateJupiterReferrerATA] Re-compiling transaction` + `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Re-compiling transaction` ); const modifiedTx = new VersionedTransaction( decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts) @@ -1484,7 +1630,7 @@ async function getTokenProgramOfMint( /** * Get the SPL token ATA pubkey for a wallet with a mint */ -function getSolanaProgrammingLibraryAssociatedTokenAccountPubkey( +function getSPLAssociatedTokenAccountPubkey( wallet: PublicKey, mint: PublicKey, /** Either the SPL token program or the 2022 SPL token program */ From b66fd251a59ce2763e0c173c498c575e8c1672cd Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 9 Sep 2024 22:25:22 -0500 Subject: [PATCH 321/375] chore: jupiter tests, fix: swap tests --- packages/swap/src/providers/jupiter/index.ts | 27 ++-- packages/swap/src/providers/rango/index.ts | 3 +- packages/swap/tests/changelly.test.ts | 9 +- .../swap/tests/fixtures/solana/configs.ts | 85 ++++++++++ packages/swap/tests/jupiter.test.ts | 148 ++++++++++++++++++ 5 files changed, 252 insertions(+), 20 deletions(-) create mode 100644 packages/swap/tests/fixtures/solana/configs.ts create mode 100644 packages/swap/tests/jupiter.test.ts diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 31dbca39c..c072e64ca 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -11,11 +11,9 @@ import { TransactionMessage, VersionedTransaction, } from "@solana/web3.js"; -import { - DEFAULT_SLIPPAGE, - FEE_CONFIGS, - NATIVE_TOKEN_ADDRESS, -} from "@src/configs"; +import { toBN } from "web3-utils"; +import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "../../utils/approvals"; +import { extractComputeBudget } from "../../utils/solana"; import { ProviderClass, ProviderName, @@ -34,10 +32,12 @@ import { StatusOptionsResponse, SolanaTransaction, TokenNetworkType, -} from "@src/types"; -import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "@src/utils/approvals"; -import { extractComputeBudget } from "@src/utils/solana"; -import { toBN } from "web3-utils"; +} from "../../types"; +import { + DEFAULT_SLIPPAGE, + FEE_CONFIGS, + NATIVE_TOKEN_ADDRESS, +} from "../../configs"; /** Enables debug logging in this file */ const DEBUG = false; @@ -160,9 +160,8 @@ const SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES = 165; let debug: (...args: any[]) => void; if (DEBUG) { console.debug.bind(console); -} -// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function -else { +} else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function debug = (..._args: any[]) => {}; } @@ -1331,6 +1330,10 @@ function getCreateAssociatedTokenAccountIdempotentInstruction(params: { * @example new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v') // USDC * @example new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB') // USDT * @example new PublicKey('So11111111111111111111111111111111111111112') // Wrapped SOL + * + * USDC @see https://solscan.io/token/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v + * USDT @see https://solscan.io/token/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB + * Wrapped SOL @see https://solscan.io/token/So11111111111111111111111111111111111111112 */ mintPubkey: PublicKey; /** diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index b0d52d379..175e228ef 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -11,7 +11,7 @@ import { TransactionType as RangoTransactionType, } from "rango-sdk-basic"; import { Connection, VersionedTransaction } from "@solana/web3.js"; -import { extractComputeBudget } from "@src/utils/solana"; +import { extractComputeBudget } from "../../utils/solana"; import { EVMTransaction, getQuoteOptions, @@ -124,7 +124,6 @@ class Rango extends ProviderClass { } async init(tokenList?: TokenType[]): Promise { - (window as any).rango = this; const resMeta = await rangoClient.meta({ excludeNonPopulars: true, transactionTypes: [RangoTransactionType.EVM, RangoTransactionType.SOLANA], diff --git a/packages/swap/tests/changelly.test.ts b/packages/swap/tests/changelly.test.ts index 9c14aa46a..729998293 100644 --- a/packages/swap/tests/changelly.test.ts +++ b/packages/swap/tests/changelly.test.ts @@ -1,5 +1,4 @@ import { expect } from "chai"; -import Web3Eth from "web3-eth"; import { NATIVE_TOKEN_ADDRESS } from "../src/configs"; import Changelly from "../src/providers/changelly"; import { @@ -14,13 +13,11 @@ import { amount, fromAddress, toAddress, - nodeURL, } from "./fixtures/mainnet/configs"; describe("Changelly Provider", () => { // @ts-ignore - const web3eth = new Web3Eth(nodeURL); - const changelly = new Changelly(web3eth, SupportedNetworkName.Ethereum); + const changelly = new Changelly(SupportedNetworkName.Ethereum); const init = changelly.init(); it("it should return a quote ", async () => { await init; @@ -70,7 +67,7 @@ describe("Changelly Provider", () => { }); it("it should initialize other networks: Bitcoin", async () => { - const changelly2 = new Changelly(web3eth, SupportedNetworkName.Bitcoin); + const changelly2 = new Changelly(SupportedNetworkName.Bitcoin); await changelly2.init(); const fromTokens = changelly2.getFromTokens(); expect(Object.values(fromTokens).length).to.be.eq(1); @@ -78,7 +75,7 @@ describe("Changelly Provider", () => { }); it("it should initialize other networks: Polkadot", async () => { - const changelly2 = new Changelly(web3eth, SupportedNetworkName.Polkadot); + const changelly2 = new Changelly(SupportedNetworkName.Polkadot); await changelly2.init(); const fromTokens = changelly2.getFromTokens(); expect(Object.values(fromTokens).length).to.be.eq(1); diff --git a/packages/swap/tests/fixtures/solana/configs.ts b/packages/swap/tests/fixtures/solana/configs.ts new file mode 100644 index 000000000..69d6b1df1 --- /dev/null +++ b/packages/swap/tests/fixtures/solana/configs.ts @@ -0,0 +1,85 @@ +import { NetworkNames } from "@enkryptcom/types"; +import { PublicKey } from "@solana/web3.js"; +import { toBN } from "web3-utils"; +import { NetworkType, TokenType, TokenTypeTo } from "../../../src/types"; + +export const nodeURL = "https://nodes.mewapi.io/rpc/sol"; + +export const amount = toBN("100000"); + +export const fromAddress = "CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38"; +export const toAddress = "3zDT4WonZsGr6x6ysQeuhTHtabpdawZNsjhC6g1yZDEK"; + +export const fromTokenNative: TokenType = { + address: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", + decimals: 9, + logoURI: "", + name: "Solana", + symbol: "SOL", + rank: 1, + cgId: "solana", + type: NetworkType.Solana, +}; + +/** @see https://solscan.io/token/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v */ +export const fromToken: TokenType = { + address: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + decimals: 6, + logoURI: + "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v/logo.png", + name: "USDC", + symbol: "USDC", + rank: 5, + cgId: "usd-coin", + type: NetworkType.Solana, +}; + +/** @see https://solscan.io/token/So11111111111111111111111111111111111111112 */ +export const toTokenWSOL: TokenTypeTo = { + address: "So11111111111111111111111111111111111111112", + decimals: 9, + logoURI: + "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/So11111111111111111111111111111111111111112/logo.png", + name: "Wrapped SOL", + symbol: "WSOL", + rank: 15, + cgId: "wrapped-solana", + type: NetworkType.EVM, + networkInfo: { + name: NetworkNames.Solana, + isAddress: (address: string) => { + try { + // eslint-disable-next-line no-new + new PublicKey(address); + return Promise.resolve(true); + } catch (err) { + return Promise.resolve(false); + } + }, + }, +}; + +/** @see https://solscan.io/token/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB */ +export const toToken: TokenTypeTo = { + address: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + decimals: 6, + logoURI: + "https://raw.githubusercontent.com/solana-labs/token-list/main/assets/mainnet/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB/logo.svg", + name: "Tether", + symbol: "USDT", + rank: 10, + cgId: "tether", + type: NetworkType.Solana, + networkInfo: { + name: NetworkNames.Solana, + isAddress: (address: string) => { + try { + // eslint-disable-next-line no-new + new PublicKey(address); + return Promise.resolve(true); + } catch (err) { + return Promise.resolve(false); + } + }, + }, +}; diff --git a/packages/swap/tests/jupiter.test.ts b/packages/swap/tests/jupiter.test.ts new file mode 100644 index 000000000..159d64bb0 --- /dev/null +++ b/packages/swap/tests/jupiter.test.ts @@ -0,0 +1,148 @@ +import { + AddressLookupTableAccount, + ComputeBudgetInstruction, + ComputeBudgetProgram, + Connection, + TransactionMessage, + VersionedTransaction, +} from "@solana/web3.js"; +import { expect } from "chai"; +import { Jupiter } from "../src/providers/jupiter"; +import { + ProviderName, + ProviderQuoteResponse, + ProviderSwapResponse, + SolanaTransaction, + SupportedNetworkName, + WalletIdentifier, +} from "../src/types"; +import { + fromToken, + amount, + fromAddress, + toAddress, + nodeURL, + toToken, +} from "./fixtures/solana/configs"; + +describe("Jupiter Provider", () => { + const conn = new Connection(nodeURL); + const jupiter = new Jupiter(conn, SupportedNetworkName.Solana); + + // // TODO: + // it("Should generate a swap transaction that creates both the source referral fee Associated Token Account and the destination Associated Token Account account if it doesn't exist", async () => { + // // + // }) + // + // // TODO: + // it("Should generate a swap transaction that creates the destination Associated Token Account if it doesn't exist", async () => { + // // + // }) + // + // // TODO: + // it("Should generate a swap transaction that creates the source referral fee Associated Token Account if it doesn't exist", async () => { + // // + // }) + // + // // TODO: + // it("Should generate a swap transaction that creates both the source referral fee Associated Token Account if it doesn't exist", async () => { + // // + // }) + + it("Should return a quote", async () => { + const quote: null | ProviderQuoteResponse = await jupiter.getQuote( + { + amount, + fromAddress, + fromToken, + toToken, + toAddress, + }, + { infiniteApproval: true, walletIdentifier: WalletIdentifier.enkrypt } + ); + expect(quote!.provider).to.be.eq(ProviderName.jupiter); + expect(quote!.quote.meta.infiniteApproval).to.be.eq(true); + expect(quote!.quote.meta.walletIdentifier).to.be.eq( + WalletIdentifier.enkrypt + ); + expect(quote!.fromTokenAmount.toString()).to.be.eq(amount.toString()); + expect(quote!.toTokenAmount.gtn(0)).to.be.eq(true); + + const swap: ProviderSwapResponse = await jupiter.getSwap(quote!.quote); + expect(swap.transactions.length).to.be.eq(1); + + const tx = VersionedTransaction.deserialize( + Buffer.from( + (swap.transactions[0] as SolanaTransaction).serialized, + "base64" + ) + ); + + // Decode the transaction and check some facts about it + + // Get lookup addresses (addresses optimized out of the transaction) + const addressLookupTableAccounts: AddressLookupTableAccount[] = []; + for (let i = 0, len = tx.message.addressTableLookups.length; i < len; i++) { + const addressTableLookup = tx.message.addressTableLookups[i]; + const result = await conn.getAddressLookupTable( + addressTableLookup.accountKey + ); + const addressLookupTableAccount = result.value; + // eslint-disable-next-line no-unused-expressions + expect( + addressLookupTableAccount, + "Address lookup table account not found" + ).to.be.ok; + addressLookupTableAccounts.push(addressLookupTableAccount!); + } + // Decode message + const decompiledMessage = TransactionMessage.decompile(tx.message, { + addressLookupTableAccounts, + }); + + // Decode instructions + let computeBudget: undefined | number; + let priorityRate: undefined | number | bigint; + for (let i = 0, len = decompiledMessage.instructions.length; i < len; i++) { + const instruction = decompiledMessage.instructions[i]; + switch (instruction.programId.toBase58()) { + case ComputeBudgetProgram.programId.toBase58(): { + const instructionType = + ComputeBudgetInstruction.decodeInstructionType(instruction); + switch (instructionType) { + case "SetComputeUnitLimit": { + // eslint-disable-next-line no-unused-expressions + expect( + computeBudget == null, + "Multiple SetComputeUnitLimit instructions found in the same transaction" + ).to.be.ok; + const command = + ComputeBudgetInstruction.decodeSetComputeUnitLimit(instruction); + computeBudget = command.units; + break; + } + case "SetComputeUnitPrice": { + // eslint-disable-next-line no-unused-expressions + expect( + priorityRate == null, + "Multiple SetComputeUnitPrice instructions found in the same transaction" + ).to.be.ok; + const command = + ComputeBudgetInstruction.decodeSetComputeUnitPrice(instruction); + priorityRate = command.microLamports; + break; + } + default: /* noop */ + } + break; + } + default: /* noop */ + } + } + + expect( + decompiledMessage.payerKey.toBase58(), + "Payer key is not the from address" + ).to.equal(fromAddress); + }).timeout(10_000); +}); From c8b18bb98856d8881a575802e37ebd704480fc6d Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 9 Sep 2024 22:26:39 -0500 Subject: [PATCH 322/375] chore: renaming --- packages/swap/tests/jupiter.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/swap/tests/jupiter.test.ts b/packages/swap/tests/jupiter.test.ts index 159d64bb0..f09be83be 100644 --- a/packages/swap/tests/jupiter.test.ts +++ b/packages/swap/tests/jupiter.test.ts @@ -49,7 +49,7 @@ describe("Jupiter Provider", () => { // // // }) - it("Should return a quote", async () => { + it("Should work", async () => { const quote: null | ProviderQuoteResponse = await jupiter.getQuote( { amount, From fdd5b958892ba6365944e25435735ae3b380f4e9 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 9 Sep 2024 22:35:30 -0500 Subject: [PATCH 323/375] chore: switch from fetch to node-fetch to make gha tests pass --- packages/swap/src/providers/jupiter/index.ts | 52 +++++++++----------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index c072e64ca..6b7a5fbd2 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -12,6 +12,7 @@ import { VersionedTransaction, } from "@solana/web3.js"; import { toBN } from "web3-utils"; +import fetch from 'node-fetch'; import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "../../utils/approvals"; import { extractComputeBudget } from "../../utils/solana"; import { @@ -162,7 +163,7 @@ if (DEBUG) { console.debug.bind(console); } else { // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function - debug = (..._args: any[]) => {}; + debug = (..._args: any[]) => { }; } // Jupiter API Tokens @@ -505,8 +506,8 @@ export class Jupiter extends ProviderClass { if (referrerATAExists) { debug( `[JupiterSwapProvider.querySwapInfo] Referrer ATA already exists. No need to record additional rent fees.` + - ` ATA pubkey: ${referrerATAPubkey.toBase58()},` + - ` Source mint: ${srcMint.toBase58()}` + ` ATA pubkey: ${referrerATAPubkey.toBase58()},` + + ` Source mint: ${srcMint.toBase58()}` ); } else { // The referral fee ATA account needs to be created or else we can't receive fees for this transaction @@ -531,9 +532,9 @@ export class Jupiter extends ProviderClass { debug( `[JupiterSwapProvider.querySwapInfo] Referrer ATA does not exist. Updating transaction with instruction to create it.` + - ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + - ` Rent: ${extraRentFees} lamports,` + - ` Total Rent: ${extraRentFees} lamports` + ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + + ` Rent: ${extraRentFees} lamports,` + + ` Total Rent: ${extraRentFees} lamports` ); } @@ -543,8 +544,8 @@ export class Jupiter extends ProviderClass { if (dstATAExists) { debug( `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA already exists. No need to record additional rent fees.` + - ` ATA pubkey: ${dstATAPubkey.toBase58()},` + - ` Destination mint: ${dstMint.toBase58()}` + ` ATA pubkey: ${dstATAPubkey.toBase58()},` + + ` Destination mint: ${dstMint.toBase58()}` ); } else { const extraRentFee = await this.conn.getMinimumBalanceForRentExemption( @@ -566,11 +567,11 @@ export class Jupiter extends ProviderClass { debug( `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA does not exist, registering custom instruction to create it.` + - ` Adding ATA rent to extra transaction fees.` + - ` ATA pubkey: ${dstATAPubkey.toBase58()},` + - ` Destination mint: ${dstMint.toBase58()},` + - ` Rent: ${extraRentFee} lamports,` + - ` Total rent: ${rentFees} lamports` + ` Adding ATA rent to extra transaction fees.` + + ` ATA pubkey: ${dstATAPubkey.toBase58()},` + + ` Destination mint: ${dstMint.toBase58()},` + + ` Rent: ${extraRentFee} lamports,` + + ` Total rent: ${rentFees} lamports` ); } @@ -865,8 +866,7 @@ async function getJupiterTokens(context?: { default: /* noop */ } throw new Error( - `Failed to get Jupiter tokens, HTTP response returned not-ok status ${ - res.status + `Failed to get Jupiter tokens, HTTP response returned not-ok status ${res.status } ${res.statusText || ""}: ${msg}` ); } @@ -883,8 +883,7 @@ async function getJupiterTokens(context?: { if (signal?.aborted) throw signal.reason; if (failed) throw err; debug( - `[JupiterSwapProvider.getJupiterTokens] Failed to get Jupiter tokens on attempt ${ - backoffi + 1 + `[JupiterSwapProvider.getJupiterTokens] Failed to get Jupiter tokens on attempt ${backoffi + 1 }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; @@ -1056,8 +1055,7 @@ async function getJupiterQuote( default: /* noop */ } throw new Error( - `Failed to get Jupiter quote, HTTP response returned not-ok status ${ - res.status + `Failed to get Jupiter quote, HTTP response returned not-ok status ${res.status } ${res.statusText || ""} at url ${url}: ${msg}` ); } @@ -1074,8 +1072,7 @@ async function getJupiterQuote( if (signal?.aborted) throw signal.reason; if (failed) throw err; console.warn( - `[getJupiterQuote] Failed to get Jupiter quote on attempt ${ - backoffi + 1 + `[getJupiterQuote] Failed to get Jupiter quote on attempt ${backoffi + 1 }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; @@ -1219,8 +1216,7 @@ async function getJupiterSwap( default: /* noop */ } throw new Error( - `Failed to get Jupiter swap, HTTP response returned not-ok status ${ - res.status + `Failed to get Jupiter swap, HTTP response returned not-ok status ${res.status } ${res.statusText || ""} at url ${url}: ${msg}` ); } @@ -1237,8 +1233,7 @@ async function getJupiterSwap( } catch (err) { if (failed) throw err; debug( - `[JupiterSwapProvider.getJupiterSwap] Failed to get Jupiter swap on attempt ${ - backoffi + 1 + `[JupiterSwapProvider.getJupiterSwap] Failed to get Jupiter swap on attempt ${backoffi + 1 }/${backoff.length}: ${String(err)}` ); errRef ??= { err: err as Error }; @@ -1534,8 +1529,7 @@ async function insertInstructionsAtStartOfTransaction( `Failed to get address lookup table for ${lookup.accountKey}` ); debug( - `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Fetching lookup account ${ - i + 1 + `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Fetching lookup account ${i + 1 }. ${lookup.accountKey.toBase58()}` ); addressLookupTableAccounts[i] = addressLookupTableAccount; @@ -1624,8 +1618,8 @@ async function getTokenProgramOfMint( default: throw new Error( `Mint address is not a valid SPL token, must either have owner` + - ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + - ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` + ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + + ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` ); } } From 3cb0a2f2ef65d62f5579e5832a67610bc0aac3d4 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 12 Sep 2024 18:50:03 -0500 Subject: [PATCH 324/375] devop: add holesky chain --- .../providers/ethereum/networks/holesky.ts | 21 +++++++++++++++++++ .../src/providers/ethereum/networks/index.ts | 2 ++ packages/types/src/networks.ts | 1 + 3 files changed, 24 insertions(+) create mode 100644 packages/extension/src/providers/ethereum/networks/holesky.ts diff --git a/packages/extension/src/providers/ethereum/networks/holesky.ts b/packages/extension/src/providers/ethereum/networks/holesky.ts new file mode 100644 index 000000000..bb06f1f3f --- /dev/null +++ b/packages/extension/src/providers/ethereum/networks/holesky.ts @@ -0,0 +1,21 @@ +import { NetworkNames } from "@enkryptcom/types"; +import { EvmNetwork, EvmNetworkOptions } from "../types/evm-network"; + +const holeskyOptions: EvmNetworkOptions = { + name: NetworkNames.Holesky, + name_long: "Holesky", + homePage: "https://holesky.dev/", + blockExplorerTX: "https://holesky.etherscan.io/tx/[[txHash]]", + blockExplorerAddr: "https://holesky.etherscan.io/address/[[address]]", + chainID: "0x4268", + isTestNetwork: true, + currencyName: "HOL", + currencyNameLong: "Holesky", + node: "wss://nodes.mewapi.io/ws/holesky", + icon: require("./icons/eth.svg"), + activityHandler: () => Promise.resolve([]), +}; + +const holesky = new EvmNetwork(holeskyOptions); + +export default holesky; diff --git a/packages/extension/src/providers/ethereum/networks/index.ts b/packages/extension/src/providers/ethereum/networks/index.ts index 5d94e223a..c5197358f 100644 --- a/packages/extension/src/providers/ethereum/networks/index.ts +++ b/packages/extension/src/providers/ethereum/networks/index.ts @@ -58,6 +58,7 @@ import palmNode from "./palm"; import proofOfPlayApexNode from "./pop-apex"; import scrollNode from "./scroll"; import cotiDevnetNode from "./coti-devnet"; +import holeskyNode from "./holesky"; export default { sepolia: sepoliaNode, @@ -129,4 +130,5 @@ export default { popApex: proofOfPlayApexNode, scroll: scrollNode, cotiDevnet: cotiDevnetNode, + holesky: holeskyNode, }; diff --git a/packages/types/src/networks.ts b/packages/types/src/networks.ts index e30405fcf..3b5d00cc2 100644 --- a/packages/types/src/networks.ts +++ b/packages/types/src/networks.ts @@ -93,6 +93,7 @@ export enum NetworkNames { Scroll = "scroll", Rari = "rari", CotiDevnet = "CotiDevnet", + Holesky = "HOLESKY", } export enum CoingeckoPlatform { From f5c1134b90f7c8092c9c5dc346596c416a59d3e1 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Thu, 12 Sep 2024 19:20:24 -0500 Subject: [PATCH 325/375] chore: add extra optional debug logging to swaps, fix rango swap error, potentially fix changelly swap error --- .../swap/src/providers/changelly/index.ts | 237 ++++++++++++++++-- packages/swap/src/providers/jupiter/index.ts | 119 ++++++--- packages/swap/src/providers/rango/index.ts | 116 ++++++++- 3 files changed, 402 insertions(+), 70 deletions(-) diff --git a/packages/swap/src/providers/changelly/index.ts b/packages/swap/src/providers/changelly/index.ts index c928f50e0..79ec0b849 100644 --- a/packages/swap/src/providers/changelly/index.ts +++ b/packages/swap/src/providers/changelly/index.ts @@ -35,8 +35,39 @@ import supportedNetworks from "./supported"; import { ChangellyCurrency } from "./types"; import estimateEVMGasList from "../../common/estimateGasList"; +const DEBUG = false; + const BASE_URL = "https://partners.mewapi.io/changelly-v2"; +let debug: (context: string, message: string, ...args: any[]) => void; +if (DEBUG) { + debug = (context: string, message: string, ...args: any[]): void => { + const now = new Date(); + const ymdhms = + // eslint-disable-next-line prefer-template + now.getFullYear().toString().padStart(4, "0") + + "-" + + (now.getMonth() + 1).toString().padStart(2, "0") + + "-" + + now.getDate().toString().padStart(2, "0") + + " " + + now.getHours().toString().padStart(2, "0") + + ":" + + now.getMinutes().toString().padStart(2, "0") + + ":" + + now.getSeconds().toString().padStart(2, "0") + + "." + + now.getMilliseconds().toString().padStart(3, "0"); + console.info( + `\x1b[90m${ymdhms}\x1b[0m \x1b[32mChangellySwapProvider.${context}\x1b[0m: ${message}`, + ...args + ); + }; +} else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function + debug = () => {}; +} + class Changelly extends ProviderClass { tokenList: TokenType[]; @@ -64,7 +95,14 @@ class Changelly extends ProviderClass { } async init(): Promise { - if (!Changelly.isSupported(this.network)) return; + debug("init", "Initialising..."); + if (!Changelly.isSupported(this.network)) { + debug( + "init", + `Enkrypt does not support Changelly on this network network=${this.network}` + ); + return; + } this.changellyList = await fetch(CHANGELLY_LIST).then((res) => res.json()); /** Mapping of changelly network name -> enkrypt network name */ @@ -117,6 +155,11 @@ class Changelly extends ProviderClass { cur.ticker ); }); + + debug( + "init", + `Finished initialising this.changellyList.length=${this.changellyList.length}` + ); } private setTicker( @@ -156,8 +199,16 @@ class Changelly extends ProviderClass { currency: ticker, address, }).then((response) => { - if (response.error || !response.result) return false; - return response.result[0].result; + if (response.error) { + debug( + "isValidAddress", + `Error in response when validating address` + + ` address=${address}` + + ` err=${String(response.error.message)}` + ); + return false; + } + return response.result?.[0]?.result ?? false; }); } @@ -177,13 +228,21 @@ class Changelly extends ProviderClass { fromToken: TokenType; toToken: TokenTypeTo; }): Promise { + const startedAt = Date.now(); + debug( + "getMinMaxAmount", + `Getting min and max of swap pair` + + ` fromToken=${fromToken.symbol}` + + ` toToken=${toToken.symbol}` + ); const emptyResponse = { minimumFrom: toBN("0"), maximumFrom: toBN("0"), minimumTo: toBN("0"), maximumTo: toBN("0"), }; - return this.changellyRequest("getFixRate", { + const method = "getFixRate"; + return this.changellyRequest(method, { from: this.getTicker(fromToken, this.network), to: this.getTicker( toToken as TokenType, @@ -193,43 +252,118 @@ class Changelly extends ProviderClass { .then((response) => { if (response.error) return emptyResponse; const result = response.result[0]; - return { + const minMax = { minimumFrom: toBN(toBase(result.minFrom, fromToken.decimals)), maximumFrom: toBN(toBase(result.maxFrom, fromToken.decimals)), minimumTo: toBN(toBase(result.minTo, toToken.decimals)), maximumTo: toBN(toBase(result.maxTo, toToken.decimals)), }; + debug( + "getMinMaxAmount", + `Successfully got min and max of swap pair` + + ` method=${method}` + + ` fromToken=${fromToken.symbol}` + + ` toToken=${toToken.symbol}` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); + return minMax; }) - .catch(() => emptyResponse); + .catch((err: Error) => { + debug( + "getMinMaxAmount", + `Errored calling getFixRate to get the min and max of swap pair` + + ` method=${method}` + + ` fromToken=${fromToken.symbol}` + + ` toToken=${toToken.symbol}` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` err=${String(err)}` + ); + return emptyResponse; + }); } async getQuote( options: getQuoteOptions, meta: QuoteMetaOptions ): Promise { + const startedAt = Date.now(); + + debug( + "getQuote", + `Getting Changelly quote` + + ` srcToken=${options.fromToken.symbol}` + + ` dstToken=${options.toToken.symbol}` + + ` fromAddress=${options.fromAddress}` + + ` toAddress=${options.toAddress}` + + ` fromNetwork=${this.network}` + + ` toNetwork=${options.toToken.networkInfo.name}` + ); + if ( !Changelly.isSupported( options.toToken.networkInfo.name as SupportedNetworkName - ) || - !Changelly.isSupported(this.network) || - !this.getTicker(options.fromToken, this.network) || + ) + ) { + debug( + "getQuote", + `No swap: Enkrypt does not support Changelly on the destination network` + + ` dstNetwork=${options.toToken.networkInfo.name}` + ); + return null; + } + + if (!Changelly.isSupported(this.network)) { + debug( + "getQuote", + `No swap: Enkrypt does not support Changelly on the source network` + + ` srcNetwork=${this.network}` + ); + return null; + } + + if (!this.getTicker(options.fromToken, this.network)) { + debug( + "getQuote", + `No swap: Failed to find ticker for src token` + + ` srcToken=${options.fromToken.symbol}` + + ` srcNetwork=${this.network}` + ); + return null; + } + + if ( !this.getTicker( options.toToken as TokenType, options.toToken.networkInfo.name as SupportedNetworkName ) - ) - return Promise.resolve(null); + ) { + debug( + "getQuote", + `No swap: Failed to find ticker for dst token` + + ` dstToken=${options.toToken.symbol}` + + ` dstNetwork=${options.toToken.networkInfo.name}` + ); + return null; + } + const minMax = await this.getMinMaxAmount({ fromToken: options.fromToken, toToken: options.toToken, }); + let quoteRequestAmount = options.amount; + + // Clamp `quoteRequestAmount` if (quoteRequestAmount.lt(minMax.minimumFrom)) quoteRequestAmount = minMax.minimumFrom; else if (quoteRequestAmount.gt(minMax.maximumFrom)) quoteRequestAmount = minMax.maximumFrom; + if (quoteRequestAmount.toString() === "0") return null; - return this.changellyRequest("getFixRateForAmount", { + + const method = "getFixRateForAmount"; + debug("getQuote", `Requesting changelly swap... method=${method}`); + return this.changellyRequest(method, { from: this.getTicker(options.fromToken, this.network), to: this.getTicker( options.toToken as TokenType, @@ -241,8 +375,16 @@ class Changelly extends ProviderClass { ), }) .then(async (response) => { - if (response.error || !response.result || !response.result[0].id) + debug("getQuote", `Received Changelly swap response method=${method}`); + if (response.error || !response.result || !response.result[0].id) { + debug( + "getQuote", + `No swap: response either contains error, no result or no id` + + ` method=${method}` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); return null; + } const result = response.result[0]; const evmGasLimit = options.fromToken.address === NATIVE_TOKEN_ADDRESS && @@ -274,19 +416,53 @@ class Changelly extends ProviderClass { options.fromToken.type === NetworkType.EVM ? evmGasLimit : 0, minMax, }; + debug( + "getQuote", + `Successfully processed Changelly swap response` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); return retResponse; }) - .catch(() => null); + .catch((err) => { + debug( + "getQuote", + `Changelly request failed` + + ` method=${method}` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` err=${String(err)}` + ); + return null; + }); } getSwap(quote: SwapQuote): Promise { + const startedAt = Date.now(); + debug("getSwap", `Getting Changelly swap`); + + if (!Changelly.isSupported(this.network)) { + debug( + "getSwap", + `No swap: Enkrypt does not support Changelly on the source network` + + ` srcNetwork=${this.network}` + ); + return Promise.resolve(null); + } + if ( !Changelly.isSupported( quote.options.toToken.networkInfo.name as SupportedNetworkName - ) || - !Changelly.isSupported(this.network) - ) + ) + ) { + debug( + "getSwap", + `No swap: Enkrypt does not support Changelly on the destination network` + + ` dstNetwork=${quote.options.toToken.networkInfo.name}` + ); return Promise.resolve(null); + } + + const method = "createFixTransaction"; + debug("getSwap", `Requesting Changelly swap... method=${method}`); return this.changellyRequest("createFixTransaction", { from: this.getTicker(quote.options.fromToken, this.network), to: this.getTicker( @@ -302,7 +478,16 @@ class Changelly extends ProviderClass { rateId: quote.meta.changellyQuoteId, }) .then(async (response) => { - if (response.error || !response.result.id) return null; + debug("getSwap", `Received Changelly swap response method=${method}`); + if (response.error || !response.result.id) { + debug( + "getSwap", + `No swap: response either contains error or no id` + + ` method=${method}` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); + return null; + } const { result } = response; let transaction: SwapTransaction; if (quote.options.fromToken.type === NetworkType.EVM) { @@ -360,9 +545,23 @@ class Changelly extends ProviderClass { provider: this.name, }), }; + debug( + "getSwap", + `Successfully processed Changelly swap response` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); return retResponse; }) - .catch(() => null); + .catch((err) => { + debug( + "getSwap", + `Changelly request failed` + + ` method=${method}` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` err=${String(err)}` + ); + return null; + }); } getStatus(options: StatusOptions): Promise { diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 3a0d124d2..1edfefb9b 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -158,12 +158,33 @@ const JUPITER_REFERRAL_ATA_ACCOUNT_SIZE_BYTES = 165; const SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES = 165; -let debug: (...args: any[]) => void; +let debug: (context: string, message: string, ...args: any[]) => void; if (DEBUG) { - console.debug.bind(console); + debug = (context: string, message: string, ...args: any[]): void => { + const now = new Date(); + const ymdhms = + // eslint-disable-next-line prefer-template + now.getFullYear().toString().padStart(4, "0") + + "-" + + (now.getMonth() + 1).toString().padStart(2, "0") + + "-" + + now.getDate().toString().padStart(2, "0") + + " " + + now.getHours().toString().padStart(2, "0") + + ":" + + now.getMinutes().toString().padStart(2, "0") + + ":" + + now.getSeconds().toString().padStart(2, "0") + + "." + + now.getMilliseconds().toString().padStart(3, "0"); + console.info( + `\x1b[90m${ymdhms}\x1b[0m \x1b[32mRangoSwapProvider.${context}\x1b[0m: ${message}`, + ...args + ); + }; } else { // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function - debug = (..._args: any[]) => {}; + debug = () => {}; } // Jupiter API Tokens @@ -505,7 +526,8 @@ export class Jupiter extends ProviderClass { if (referrerATAExists) { debug( - `[JupiterSwapProvider.querySwapInfo] Referrer ATA already exists. No need to record additional rent fees.` + + "querySwapInfo", + `Referrer ATA already exists. No need to record additional rent fees.` + ` ATA pubkey: ${referrerATAPubkey.toBase58()},` + ` Source mint: ${srcMint.toBase58()}` ); @@ -531,7 +553,8 @@ export class Jupiter extends ProviderClass { rentFees += extraRentFees; debug( - `[JupiterSwapProvider.querySwapInfo] Referrer ATA does not exist. Updating transaction with instruction to create it.` + + "querySwapInfo", + `Referrer ATA does not exist. Updating transaction with instruction to create it.` + ` Referral ATA pubkey: ${referrerATAPubkey.toBase58()},` + ` Rent: ${extraRentFees} lamports,` + ` Total Rent: ${extraRentFees} lamports` @@ -543,7 +566,8 @@ export class Jupiter extends ProviderClass { if (dstATAExists) { debug( - `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA already exists. No need to record additional rent fees.` + + "querySwapInfo", + `Wallet destination mint ATA already exists. No need to record additional rent fees.` + ` ATA pubkey: ${dstATAPubkey.toBase58()},` + ` Destination mint: ${dstMint.toBase58()}` ); @@ -566,7 +590,8 @@ export class Jupiter extends ProviderClass { extraInstructions.push(instruction); debug( - `[JupiterSwapProvider.querySwapInfo] Wallet destination mint ATA does not exist, registering custom instruction to create it.` + + "querySwapInfo", + `Wallet destination mint ATA does not exist, registering custom instruction to create it.` + ` Adding ATA rent to extra transaction fees.` + ` ATA pubkey: ${dstATAPubkey.toBase58()},` + ` Destination mint: ${dstMint.toBase58()},` + @@ -603,7 +628,9 @@ export class Jupiter extends ProviderClass { ): Promise { if (options.toToken.networkInfo.name !== SupportedNetworkName.Solana) { debug( - `[JupiterSwapProvider.getQuote] ignoring quote request to network ${options.toToken.networkInfo.name}, cross network swaps not supported` + "getQuote", + `ignoring quote request to network ${options.toToken.networkInfo.name},` + + ` cross network swaps not supported` ); return null; } @@ -618,10 +645,12 @@ export class Jupiter extends ProviderClass { // 4. Rent for ATA accounts that may need to be created; the referral fee account and mint account debug( - `[JupiterSwapProvider.getQuote] Quote inAmount: ${jupiterQuote.inAmount} ${options.fromToken.symbol}` + "getQuote", + `Quote inAmount: ${jupiterQuote.inAmount} ${options.fromToken.symbol}` ); debug( - `[JupiterSwapProvider.getQuote] Quote outAmount: ${jupiterQuote.outAmount} ${options.toToken.symbol}` + "getQuote", + `Quote outAmount: ${jupiterQuote.outAmount} ${options.toToken.symbol}` ); const result: ProviderQuoteResponse = { @@ -666,10 +695,12 @@ export class Jupiter extends ProviderClass { }; debug( - `[JupiterSwapProvider.getSwap] Quote inAmount: ${jupiterQuote.inAmount} ${quote.options.fromToken.symbol}` + "getSwap", + `Quote inAmount: ${jupiterQuote.inAmount} ${quote.options.fromToken.symbol}` ); debug( - `[JupiterSwapProvider.getSwap] Quote outAmount: ${jupiterQuote.outAmount} ${quote.options.toToken.symbol}` + "getSwap", + `Quote outAmount: ${jupiterQuote.outAmount} ${quote.options.toToken.symbol}` ); const result: ProviderSwapResponse = { @@ -794,9 +825,7 @@ async function getJupiterTokens(context?: { if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying - debug( - `[JupiterSwapProvider.getJupiterTokens] Retrying after ${backoff[backoffi]}ms...` - ); + debug("getJupiterTokens", `Retrying after ${backoff[backoffi]}ms...`); await new Promise((res, rej) => { function onTimeout() { cleanupSleep(); @@ -837,7 +866,8 @@ async function getJupiterTokens(context?: { try { debug( - `[JupiterSwapProvider.getJupiterTokens] Initiating HTTP request for Jupiter tokens ${url}` + "getJupiterTokens", + `Initiating HTTP request for Jupiter tokens ${url}` ); const res = await fetch(url, { signal: aborter.signal, @@ -848,7 +878,9 @@ async function getJupiterTokens(context?: { if (!res.ok) { let msg = await res .text() - .catch((err) => `Failed to decode response text: ${String(err)}`); + .catch( + (err: Error) => `Failed to decode response text: ${String(err)}` + ); const msglen = msg.length; if (msglen > 512 + 7 + 3 + msglen.toString().length) { msg = `${msg.slice(0, 512)}... (512/${msglen})`; @@ -884,9 +916,10 @@ async function getJupiterTokens(context?: { if (signal?.aborted) throw signal.reason; if (failed) throw err; debug( - `[JupiterSwapProvider.getJupiterTokens] Failed to get Jupiter tokens on attempt ${ - backoffi + 1 - }/${backoff.length}: ${String(err)}` + "getJupiterTokens", + `Failed to get Jupiter tokens on attempt ${backoffi + 1}/${ + backoff.length + }: ${String(err)}` ); errRef ??= { err: err as Error }; } finally { @@ -986,7 +1019,8 @@ async function getJupiterQuote( if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying debug( - `[JupiterSwapProvider.getJupiterQuote] Retrying ${url} after ${backoff[backoffi]}ms...` + "getJupiterQuote", + `Retrying ${url} after ${backoff[backoffi]}ms...` ); await new Promise((res, rej) => { function onTimeout() { @@ -1028,7 +1062,8 @@ async function getJupiterQuote( try { debug( - `[JupiterSwapProvider.getJupiterQuote] Initiating HTTP request for Jupiter quote ${url}` + "getJupiterQuote", + `Initiating HTTP request for Jupiter quote ${url}` ); const res = await fetch(url, { signal: aborter.signal, @@ -1039,7 +1074,9 @@ async function getJupiterQuote( if (!res.ok) { let msg = await res .text() - .catch((err) => `Failed to decode response text: ${String(err)}`); + .catch( + (err: Error) => `Failed to decode response text: ${String(err)}` + ); const msglen = msg.length; if (msglen > 512 + 7 + 3 + msglen.toString().length) { msg = `${msg.slice(0, 512)}... (512/${msglen})`; @@ -1144,7 +1181,8 @@ async function getJupiterSwap( if (backoff[backoffi] > 0) { // Previous request failed, wait before retrying debug( - `[JupiterSwapProvider.getJupiterSwap] Retrying ${url} after ${backoff[backoffi]}ms...` + "getJupiterSwap", + `Retrying ${url} after ${backoff[backoffi]}ms...` ); await new Promise((res, rej) => { function onTimeout() { @@ -1186,7 +1224,8 @@ async function getJupiterSwap( try { debug( - `[JupiterSwapProvider.getJupiterSwap] Initiating HTTP request for Jupiter swap ${url}` + "getJupiterSwap", + `Initiating HTTP request for Jupiter swap ${url}` ); const res = await fetch(url, { signal: aborter.signal, @@ -1202,7 +1241,9 @@ async function getJupiterSwap( if (!res.ok) { let msg = await res .text() - .catch((err) => `Failed to decode response text: ${String(err)}`); + .catch( + (err: Error) => `Failed to decode response text: ${String(err)}` + ); const msglen = msg.length; if (msglen > 512 + 7 + 3 + msglen.toString().length) { msg = `${msg.slice(0, 512)}... (512/${msglen})`; @@ -1238,9 +1279,10 @@ async function getJupiterSwap( } catch (err) { if (failed) throw err; debug( - `[JupiterSwapProvider.getJupiterSwap] Failed to get Jupiter swap on attempt ${ - backoffi + 1 - }/${backoff.length}: ${String(err)}` + "getJupiterSwap", + `Failed to get Jupiter swap on attempt ${backoffi + 1}/${ + backoff.length + }: ${String(err)}` ); errRef ??= { err: err as Error }; } finally { @@ -1535,9 +1577,8 @@ async function insertInstructionsAtStartOfTransaction( `Failed to get address lookup table for ${lookup.accountKey}` ); debug( - `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Fetching lookup account ${ - i + 1 - }. ${lookup.accountKey.toBase58()}` + "insertInstructionsAtStartOfTransaction", + `Fetching lookup account ${i + 1}. ${lookup.accountKey.toBase58()}` ); addressLookupTableAccounts[i] = addressLookupTableAccount; } @@ -1566,7 +1607,8 @@ async function insertInstructionsAtStartOfTransaction( default: { // insert our instruction here & continue debug( - `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` + "insertInstructionsAtStartOfTransaction", + `Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` ); inserted = true; decompiledTransactionMessage.instructions.splice(i, 0, ...instructions); @@ -1578,7 +1620,8 @@ async function insertInstructionsAtStartOfTransaction( if (!inserted) { // If there were no compute budget instructions then just add it at the start debug( - `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` + "insertInstructionsAtStartOfTransaction", + `Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` ); for (let len = instructions.length - 1, i = len - 1; i >= 0; i--) { decompiledTransactionMessage.instructions.unshift(instructions[i]); @@ -1586,9 +1629,7 @@ async function insertInstructionsAtStartOfTransaction( } // Switch to using this modified transaction - debug( - `[JupiterSwapProvider.insertInstructionsAtStartOfTransaction] Re-compiling transaction` - ); + debug("insertInstructionsAtStartOfTransaction", `Re-compiling transaction`); const modifiedTx = new VersionedTransaction( decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts) ); @@ -1607,9 +1648,7 @@ async function getTokenProgramOfMint( conn: Connection, mint: PublicKey ): Promise { - debug( - `[JupiterSwapProvider.getTokenProgramOfMint] Checking mint account of ${mint.toBase58()}` - ); + debug("getTokenProgramOfMint", `Checking mint account of ${mint.toBase58()}`); const srcMintAcc = await conn.getAccountInfo(mint); if (srcMintAcc == null) { diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index ae26e91ca..69cb67244 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -46,6 +46,37 @@ import { isEVMAddress } from "../../utils/common"; const RANGO_PUBLIC_API_KEY = "ee7da377-0ed8-4d42-aaf9-fa978a32b18d"; const rangoClient = new RangoClient(RANGO_PUBLIC_API_KEY); +const DEBUG = false; + +let debug: (context: string, message: string, ...args: any[]) => void; +if (DEBUG) { + debug = (context: string, message: string, ...args: any[]): void => { + const now = new Date(); + const ymdhms = + // eslint-disable-next-line prefer-template + now.getFullYear().toString().padStart(4, "0") + + "-" + + (now.getMonth() + 1).toString().padStart(2, "0") + + "-" + + now.getDate().toString().padStart(2, "0") + + " " + + now.getHours().toString().padStart(2, "0") + + ":" + + now.getMinutes().toString().padStart(2, "0") + + ":" + + now.getSeconds().toString().padStart(2, "0") + + "." + + now.getMilliseconds().toString().padStart(3, "0"); + console.info( + `\x1b[90m${ymdhms}\x1b[0m \x1b[32mRangoSwapProvider.${context}\x1b[0m: ${message}`, + ...args + ); + }; +} else { + // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function + debug = () => {}; +} + /** * `name` is the blockchain id on Rango * @@ -149,13 +180,21 @@ class Rango extends ProviderClass { } async init(tokenList?: TokenType[]): Promise { + debug("init", `Initialising against ${tokenList?.length} tokens...`); const resMeta = await rangoClient.meta({ excludeNonPopulars: true, transactionTypes: [RangoTransactionType.EVM, RangoTransactionType.SOLANA], }); this.rangoMeta = resMeta; + debug( + "init", + "Rango meta" + + ` tokens.length=${resMeta.tokens.length}` + + ` blockchains.length=${resMeta.blockchains.length}` + ); const { blockchains, tokens } = resMeta; if (!Rango.isSupported(this.network, blockchains)) { + debug("init", `Not supported on network ${this.network}`); return; } tokenList?.forEach((t) => { @@ -164,6 +203,7 @@ class Rango extends ProviderClass { this.fromTokens[t.address] = t; } }); + debug("init", `Finished initialising`); } static isSupported( @@ -206,11 +246,11 @@ class Rango extends ProviderClass { return true; } - getFromTokens() { + getFromTokens(): ProviderFromTokenResponse { return this.fromTokens; } - getToTokens() { + getToTokens(): ProviderToTokenResponse { const { tokens } = this.rangoMeta; const supportedCRangoNames = Object.values(supportedNetworks).map( (s) => s.name @@ -275,6 +315,18 @@ class Rango extends ProviderClass { accurateEstimate: boolean ): Promise { const { blockchains } = this.rangoMeta; + const startedAt = Date.now(); + + debug( + "getRangoSwap", + `Getting swap` + + ` srcToken=${options.fromToken.symbol}` + + ` dstToken=${options.toToken.symbol}` + + ` fromAddress=${options.fromAddress}` + + ` toAddress=${options.toAddress}` + + ` fromNetwork=${this.network}` + + ` toNetwork=${options.toToken.networkInfo.name}` + ); // Determine whether Enkrypt + Rango supports this swap @@ -285,8 +337,15 @@ class Rango extends ProviderClass { blockchains ) || !Rango.isSupported(this.network, blockchains) - ) + ) { + debug( + "getRangoSwap", + `No swap:` + + ` Enkrypt does not support Rango swap on the destination` + + ` network ${options.toToken.networkInfo.name}` + ); return Promise.resolve(null); + } // Does Rango support these tokens? const feeConfig = FEE_CONFIGS[this.name][meta.walletIdentifier]; @@ -329,6 +388,13 @@ class Rango extends ProviderClass { return false; })?.name; + debug( + "getRangoSwap", + `Rango block chains ids` + + ` fromBlokchain=${fromBlockchain}` + + ` toBlockchain=${toBlockchain}` + ); + const fromTokenAddress = options.fromToken.address; const toTokenAddress = options.toToken.address; @@ -339,10 +405,23 @@ class Rango extends ProviderClass { const toSymbol = this.getSymbol(options.toToken); // If we can't get symbols for the tokens then we don't support them - if (!fromSymbol || !toSymbol) return Promise.resolve(null); + if (!fromSymbol || !toSymbol) { + debug( + "getRangoSwap", + `No swap: No symbol for src token or dst token` + + ` srcTokenSymbol=${fromSymbol}` + + ` dstTokenSymbol=${toSymbol}` + ); + return Promise.resolve(null); + } // Enkrypt & Rango both likely support this swap (pair & networks) + const slippage = Number(meta.slippage || DEFAULT_SLIPPAGE); + if (!Number.isFinite(slippage)) { + throw new Error(`Slippage is not a number: ${slippage}`); + } + // Request a swap transaction from Rango for the pair & networks const params: SwapRequest = { from: { @@ -360,12 +439,13 @@ class Rango extends ProviderClass { amount: options.amount.toString(), fromAddress: options.fromAddress, toAddress: options.toAddress, - slippage: meta.slippage || DEFAULT_SLIPPAGE, + slippage, referrerFee: feeConfig ? (feeConfig.fee * 100).toFixed(3) : undefined, referrerAddress: feeConfig?.referrer || undefined, disableEstimate: true, }; + debug("getRangoSwap", `Requesting quote from rango sdk...`); const rangoSwapResponse = await rangoClient.swap(params); if ( @@ -373,10 +453,13 @@ class Rango extends ProviderClass { rangoSwapResponse.resultType !== RoutingResultType.OK ) { // Rango experienced some kind of error or is unable to route the swap - console.error(rangoSwapResponse.error); + debug("getRangoSwap", `Rango swap SDK returned an error`); + console.error("Rango swap SDK error:", rangoSwapResponse.error); return Promise.resolve(null); } + debug("getRangoSwap", `Rango swap SDK returned OK`); + // We have a swap transaction provided by Rango that can be executed // Note additional routing fees @@ -397,21 +480,27 @@ class Rango extends ProviderClass { switch (rangoSwapResponse.tx?.type) { // Process Rango swap Solana transaction case RangoTransactionType.SOLANA: { + debug("getRangoSwap", "Received Solana transaction"); + let versionedTransaction: VersionedTransaction; if (rangoSwapResponse.tx.serializedMessage == null) { - // TODO: when and why does this happen? - throw new Error( - `Rango did not return a serialized message for the Solana transaction` + // TODO: When how and why does this happen? + debug( + "getRangoSwap", + "Dropping rango swap transaction: Rango SDK returned a Solana transaction without any serializedMessage" ); + return null; } switch (rangoSwapResponse.tx.txType) { case "VERSIONED": { + debug("getRangoSwap", `Deserializing Solana versioned transaction`); versionedTransaction = VersionedTransaction.deserialize( new Uint8Array(rangoSwapResponse.tx.serializedMessage) ); break; } case "LEGACY": { + debug("getRangoSwap", `Deserializing Solana legacy transaction`); // TODO: does this work? versionedTransaction.version has type `'legacy' | 0` so maybe? versionedTransaction = VersionedTransaction.deserialize( new Uint8Array(rangoSwapResponse.tx.serializedMessage) @@ -444,9 +533,9 @@ class Rango extends ProviderClass { // Process Rango swap EVM transaction case RangoTransactionType.EVM: { - const transactions: EVMTransaction[] = []; + debug("getRangoSwap", `Received EVM transaction`); - // TODO: handle Solana transactions + const transactions: EVMTransaction[] = []; const tx = rangoSwapResponse.tx as RangoEvmTransaction; if (!this.isNativeToken(options.fromToken.address) && tx.approveTo) { // The user needss to approve Rango to swap tokens on their behalf @@ -511,6 +600,11 @@ class Rango extends ProviderClass { requestId: rangoSwapResponse.requestId, }; + debug( + "getRangoSwap", + `Done took=${(Date.now() - startedAt).toLocaleString()}ms` + ); + return result; } From f978b421c1db6f6d4c0911485f26f6bbb303d570 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 23 Sep 2024 17:48:22 -0500 Subject: [PATCH 326/375] feat: solana on rango, support for pre signed solana swap transactions, legacy transactions, fix: some changelly api calls, chore: changelly types and documentation links --- .../src/libs/keyring/public-keyring.ts | 20 + .../views/swap/libs/send-transactions.ts | 101 +- .../action/views/swap/libs/solana-gasvals.ts | 85 +- .../src/ui/action/views/swap/libs/swap-txs.ts | 32 +- packages/swap/package.json | 1 + packages/swap/src/configs.ts | 10 + packages/swap/src/index.ts | 8 +- .../swap/src/providers/changelly/index.ts | 904 +++++++++++++----- .../swap/src/providers/changelly/supported.ts | 21 +- .../swap/src/providers/changelly/types.ts | 696 ++++++++++++++ packages/swap/src/providers/jupiter/index.ts | 510 +--------- packages/swap/src/providers/jupiter/types.ts | 130 +++ packages/swap/src/providers/rango/index.ts | 377 ++++++-- packages/swap/src/types/index.ts | 3 + packages/swap/src/utils/solana.ts | 376 +++++++- yarn.lock | 1 + 16 files changed, 2416 insertions(+), 859 deletions(-) create mode 100644 packages/swap/src/providers/jupiter/types.ts diff --git a/packages/extension/src/libs/keyring/public-keyring.ts b/packages/extension/src/libs/keyring/public-keyring.ts index c9a2048e8..210b1d518 100644 --- a/packages/extension/src/libs/keyring/public-keyring.ts +++ b/packages/extension/src/libs/keyring/public-keyring.ts @@ -77,6 +77,26 @@ class PublicKeyRing { walletType: WalletType.mnemonic, isHardware: false, }; + allKeys["77hREDDaAiimedtD9bR1JDMgYLW3AA5yPvD91pvrueRp"] = { + address: "77hREDDaAiimedtD9bR1JDMgYLW3AA5yPvD91pvrueRp", + basePath: "m/44'/501'/0'/1", + name: "fake sol acc 1", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.ed25519sol, + walletType: WalletType.mnemonic, + isHardware: false, + }; + allKeys["tQvduDby4rvC6VU4rSirhVWuRYxbJz3rvUrVMkUWsZP"] = { + address: "tQvduDby4rvC6VU4rSirhVWuRYxbJz3rvUrVMkUWsZP", + basePath: "m/44'/501'/0'/1", + name: "fake sol acc 2", + pathIndex: 0, + publicKey: "0x0", + signerType: SignerType.ed25519sol, + walletType: WalletType.mnemonic, + isHardware: false, + }; } return allKeys; } diff --git a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts index 8254cab43..fba46812c 100644 --- a/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts +++ b/packages/extension/src/ui/action/views/swap/libs/send-transactions.ts @@ -37,6 +37,7 @@ import BitcoinAPI from "@/providers/bitcoin/libs/api"; import SolanaAPI from "@/providers/solana/libs/api"; import { VersionedTransaction as SolanaVersionedTransaction, + Transaction as SolanaLegacyTransaction, PublicKey, SendTransactionError, } from "@solana/web3.js"; @@ -192,35 +193,88 @@ export const executeSwap = async ( // Execute each transaction in-order one-by-one for (const enkSolTx of enkSolTxs) { // Transform the Enkrypt representation of the transaction into the Solana lib's representation - const tx = SolanaVersionedTransaction.deserialize( - Buffer.from(enkSolTx.serialized, "base64") - ); - // Sign the transaction message - // Use the keyring running in the background script - const sigRes = await sendUsingInternalMessengers({ - method: InternalMethods.sign, - params: [bufferToHex(tx.message.serialize()), options.from], - }); + let serialized: Uint8Array; + switch (enkSolTx.kind) { + case "versioned": { + // Sign Versioned transaction + // (note: the transaction may already be signed by a third party, + // like Rango exchange) - // Did we fail to sign? - if (sigRes.error != null) { - throw new Error( - `Failed to sign Solana swap transaction: ${sigRes.error.code} ${sigRes.error.message}` - ); - } + const tx = SolanaVersionedTransaction.deserialize( + Buffer.from(enkSolTx.serialized, "base64") + ); + + // Sign the transaction message + // Use the keyring running in the background script + const sigRes = await sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [bufferToHex(tx.message.serialize()), options.from], + }); + + // Did we fail to sign? + if (sigRes.error != null) { + throw new Error( + `Failed to sign Solana versioned swap transaction: ${sigRes.error.code} ${sigRes.error.message}` + ); + } + + // Add signature to the transaction + tx.addSignature( + new PublicKey(options.network.displayAddress(options.from.address)), + hexToBuffer(JSON.parse(sigRes.result!)) + ); + + serialized = tx.serialize(); + + break; + } + + case "legacy": { + // Sign Versioned transaction + // (note: the transaction may already be signed by a third party, + // like Rango exchange) - // Add signature to the transaction - tx.addSignature( - new PublicKey(options.network.displayAddress(options.from.address)), - hexToBuffer(JSON.parse(sigRes.result!)) - ); + const tx = SolanaLegacyTransaction.from( + Buffer.from(enkSolTx.serialized, "base64") + ); + + // Sign the transaction message + // Use the keyring running in the background script + const sigRes = await sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [bufferToHex(tx.serialize()), options.from], + }); + + // Did we fail to sign? + if (sigRes.error != null) { + throw new Error( + `Failed to sign Solana legacy swap transaction: ${sigRes.error.code} ${sigRes.error.message}` + ); + } + + // Add signature to the transaction + tx.addSignature( + new PublicKey(options.network.displayAddress(options.from.address)), + hexToBuffer(JSON.parse(sigRes.result!)) + ); + + serialized = tx.serialize(); + + break; + } + + default: + enkSolTx.kind satisfies never; + throw new Error( + `Cannot send Solana transaction: unexpected kind ${enkSolTx.kind}` + ); + } // Send the transaction let txHash: string; try { - // TODO: don't skip preflight - txHash = await conn.sendRawTransaction(tx.serialize()); + txHash = await conn.sendRawTransaction(serialized); } catch (err) { // Log error info if possible // The Solana web3 library prompts you to call getLogs if your error is of type @@ -263,9 +317,6 @@ export const executeSwap = async ( network: options.network.name, }); - // TODO:get the status of the transaction? - // activity.status = // success | failed | pending - solTxHashes.push(txHash); } diff --git a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts index 6a0109ab9..929699e19 100644 --- a/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts +++ b/packages/extension/src/ui/action/views/swap/libs/solana-gasvals.ts @@ -2,7 +2,12 @@ import { GasFeeType, GasPriceTypes } from "@/providers/common/types"; import SolanaAPI from "@/providers/solana/libs/api"; import { SolanaNetwork } from "@/providers/solana/types/sol-network"; import { fromBase } from "@enkryptcom/utils"; -import { VersionedTransaction } from "@solana/web3.js"; +import { + VersionedTransaction as SolanaVersionedTransaction, + Transaction as SolanaLegacyTransaction, + VersionedMessage, + Message, +} from "@solana/web3.js"; import BigNumber from "bignumber.js"; import { toBN } from "web3-utils"; @@ -11,7 +16,7 @@ import { toBN } from "web3-utils"; * (not nice but convenient) */ export const getSolanaTransactionFees = async ( - txs: VersionedTransaction[], + txs: (SolanaVersionedTransaction | SolanaLegacyTransaction)[], network: SolanaNetwork, price: number, additionalFee: ReturnType @@ -21,8 +26,12 @@ export const getSolanaTransactionFees = async ( let latestBlockHash = await conn.getLatestBlockhash(); for (let i = 0, len = txs.length; i < len; i++) { const tx = txs[i]; + // Use the latest block hash in-case it's fallen too far behind - tx.message.recentBlockhash = latestBlockHash.blockhash; + // (can't change block hash if it's already signed) + if (!tx.signatures.length) { + updateBlockHash(tx, latestBlockHash.blockhash); + } // Not sure why but getFeeForMessage sometimes returns null, so we will retry // with small backoff in-case it helps @@ -36,27 +45,34 @@ export const getSolanaTransactionFees = async ( throw new Error( `Failed to get fee for Solana VersionedTransaction ${i + 1}` + ` after ${backoff.length} attempts.` + - ` Transaction block hash ${tx.message.recentBlockhash} possibly expired.` + ` Transaction block hash` + + `${getRecentBlockHash(tx)} possibly expired.` ); } if (backoff[attempt] > 0) { // wait before retrying - await new Promise((res) => { - return setTimeout(res, backoff[attempt]); - }); + await new Promise((res) => setTimeout(res, backoff[attempt])); } // Update the block hash in-case it caused 0 fees to be returned if (attempt > 0) { - latestBlockHash = await conn.getLatestBlockhash(); - tx.message.recentBlockhash = latestBlockHash.blockhash; + if (!tx.signatures.length) { + console.warn( + `Cannot update block hash for signed transaction` + + ` ${i + 1}, retrying getFeeForMessage using the same` + + ` block hash ${getRecentBlockHash(tx)}` + ); + } else { + latestBlockHash = await conn.getLatestBlockhash(); + updateBlockHash(tx, latestBlockHash.blockhash); + } } /** Base fee + priority fee (Don't know why this returns null sometimes) */ - const feeResult = await conn.getFeeForMessage(tx.message); + const feeResult = await conn.getFeeForMessage(getMessage(tx)); if (feeResult.value == null) { console.warn( - `Failed to get fee for Solana VersionedTransaction` + - ` ${i + 1}. Transaction block hash ${tx.message.recentBlockhash}` + + `Failed to get fee for Solana VersionedTransaction ${i + 1}.` + + ` Transaction block hash ${getRecentBlockHash(tx)}` + ` possibly expired. Attempt ${attempt + 1}/${backoff.length}.` ); } else { @@ -74,7 +90,6 @@ export const getSolanaTransactionFees = async ( // Convert from lamports to SOL const feesumsol = fromBase(feesumlamp.toString(), network.decimals); - // TODO: give different fees for different priority levels return { [GasPriceTypes.REGULAR]: { nativeValue: feesumsol, @@ -84,3 +99,47 @@ export const getSolanaTransactionFees = async ( }, }; }; + +function getRecentBlockHash( + tx: SolanaVersionedTransaction | SolanaLegacyTransaction +): string { + return getMessage(tx).recentBlockhash; +} + +function updateBlockHash( + tx: SolanaVersionedTransaction | SolanaLegacyTransaction, + recentBlockHash: string +): void { + switch ((tx as SolanaVersionedTransaction).version) { + case 0: + case "legacy": + (tx as SolanaVersionedTransaction).message.recentBlockhash = + recentBlockHash; + break; + case undefined: + (tx as SolanaLegacyTransaction).recentBlockhash = recentBlockHash; + break; + default: + throw new Error( + `Cannot set block hash for Solana transaction: unexpected Solana transaction` + + ` type ${Object.getPrototypeOf(tx).constructor.name}` + ); + } +} + +function getMessage( + tx: SolanaVersionedTransaction | SolanaLegacyTransaction +): Message | VersionedMessage { + switch ((tx as SolanaVersionedTransaction).version) { + case 0: + case "legacy": + return (tx as SolanaVersionedTransaction).message; + case undefined: + return (tx as SolanaLegacyTransaction).compileMessage(); + default: + throw new Error( + `Cannot get Solana transaction message: unexpected Solana transaction` + + ` type ${Object.getPrototypeOf(tx).constructor.name}` + ); + } +} diff --git a/packages/extension/src/ui/action/views/swap/libs/swap-txs.ts b/packages/extension/src/ui/action/views/swap/libs/swap-txs.ts index bd2a4db77..327fdc0c8 100644 --- a/packages/extension/src/ui/action/views/swap/libs/swap-txs.ts +++ b/packages/extension/src/ui/action/views/swap/libs/swap-txs.ts @@ -21,7 +21,10 @@ import BitcoinAPI from "@/providers/bitcoin/libs/api"; import { getTxInfo as getBTCTxInfo } from "@/providers/bitcoin/libs/utils"; import { toBN } from "web3-utils"; import { BTCTxInfo } from "@/providers/bitcoin/ui/types"; -import { VersionedTransaction as SolanaVersionedTransaction } from "@solana/web3.js"; +import { + VersionedTransaction as SolanaVersionedTransaction, + Transaction as SolanaLegacyTransaction, +} from "@solana/web3.js"; export const getSubstrateNativeTransation = async ( network: SubstrateNetwork, @@ -97,7 +100,7 @@ export const getEVMTransaction = async ( export const getSwapTransactions = async ( networkName: SupportedNetworkName, transactions: TransactionType[] -) => { +): Promise => { const netInfo = getNetworkInfoByName(networkName); const network = await getNetworkByName( networkName as unknown as NetworkNames @@ -112,12 +115,25 @@ export const getSwapTransactions = async ( const allTxs = await Promise.all(txPromises); return allTxs; } else if (netInfo.type === NetworkType.Solana) { - const solTxs = (transactions as EnkryptSolanaTransaction[]).map( - (enkSolTx) => - SolanaVersionedTransaction.deserialize( - Buffer.from(enkSolTx.serialized, "base64") - ) - ); + const solTxs: (SolanaVersionedTransaction | SolanaLegacyTransaction)[] = ( + transactions as EnkryptSolanaTransaction[] + ).map(function (enkSolTx) { + switch (enkSolTx.kind) { + case "legacy": + return SolanaLegacyTransaction.from( + Buffer.from(enkSolTx.serialized, "base64") + ); + case "versioned": + return SolanaVersionedTransaction.deserialize( + Buffer.from(enkSolTx.serialized, "base64") + ); + default: + enkSolTx.kind satisfies never; + throw new Error( + `Cannot deserialize Solana transaction: Unexpected kind: ${enkSolTx.kind}` + ); + } + }); return solTxs; } else if (netInfo.type === NetworkType.Substrate) { if (transactions.length > 1) diff --git a/packages/swap/package.json b/packages/swap/package.json index bc44610d3..89e60b9f4 100644 --- a/packages/swap/package.json +++ b/packages/swap/package.json @@ -18,6 +18,7 @@ "dependencies": { "@enkryptcom/types": "workspace:^", "@enkryptcom/utils": "workspace:^", + "@solana/spl-token": "^0.4.8", "@solana/web3.js": "^1.95.3", "bignumber.js": "^9.1.2", "eventemitter3": "^5.0.1", diff --git a/packages/swap/src/configs.ts b/packages/swap/src/configs.ts index efcefd83f..72ddf32d0 100644 --- a/packages/swap/src/configs.ts +++ b/packages/swap/src/configs.ts @@ -98,9 +98,19 @@ const TOKEN_LISTS: { [NetworkNames.Telos]: `https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/${SupportedNetworkName.Telos}.json`, }; +/** + * ```sh + * curl -sL https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/changelly.json | jq '.' -C | less -R + * ``` + */ const CHANGELLY_LIST = "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/changelly.json"; +/** + * ```sh + * curl -sL https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/top-tokens.json | jq '.' -C | less -R + * ``` + */ const TOP_TOKEN_INFO_LIST = "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/swaplists/top-tokens.json"; diff --git a/packages/swap/src/index.ts b/packages/swap/src/index.ts index b1191c22b..c8b692ad3 100644 --- a/packages/swap/src/index.ts +++ b/packages/swap/src/index.ts @@ -102,10 +102,12 @@ class Swap extends EventEmitter { } private async init() { - if (TOKEN_LISTS[this.network]) + if (TOKEN_LISTS[this.network]) { this.tokenList = await fetch(TOKEN_LISTS[this.network]).then((res) => res.json() ); + } + this.topTokenInfo = await fetch(TOP_TOKEN_INFO_LIST).then((res) => res.json() ); @@ -117,7 +119,7 @@ class Swap extends EventEmitter { this.providers = [ new Jupiter(this.api as Web3Solana, this.network), new Rango(this.api as Web3Solana, this.network), - new Changelly(this.network), + new Changelly(this.api, this.network), ]; break; default: @@ -125,7 +127,7 @@ class Swap extends EventEmitter { this.providers = [ new OneInch(this.api as Web3Eth, this.network), new Paraswap(this.api as Web3Eth, this.network), - new Changelly(this.network), + new Changelly(this.api, this.network), new ZeroX(this.api as Web3Eth, this.network), new Rango(this.api as Web3Eth, this.network), ]; diff --git a/packages/swap/src/providers/changelly/index.ts b/packages/swap/src/providers/changelly/index.ts index 79ec0b849..74a7f0b59 100644 --- a/packages/swap/src/providers/changelly/index.ts +++ b/packages/swap/src/providers/changelly/index.ts @@ -1,7 +1,20 @@ +import type Web3Eth from "web3-eth"; import { v4 as uuidv4 } from "uuid"; import fetch from "node-fetch"; import { fromBase, toBase } from "@enkryptcom/utils"; import { numberToHex, toBN } from "web3-utils"; +import { + VersionedTransaction, + SystemProgram, + PublicKey, + TransactionMessage, + Connection, + TransactionInstruction, +} from "@solana/web3.js"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + createTransferInstruction as createSPLTransferInstruction, +} from "@solana/spl-token"; import { getQuoteOptions, MinMaxResponse, @@ -32,9 +45,30 @@ import { import { getTransfer } from "../../utils/approvals"; import supportedNetworks from "./supported"; -import { ChangellyCurrency } from "./types"; +import { + ChangellyApiCreateFixedRateTransactionParams, + ChangellyApiCreateFixedRateTransactionResult, + ChangellyApiGetFixRateForAmountParams, + ChangellyApiGetFixRateForAmountResult, + ChangellyApiGetFixRateParams, + ChangellyApiGetFixRateResult, + ChangellyApiGetStatusParams, + ChangellyApiGetStatusResult, + ChangellyApiResponse, + ChangellyApiValidateAddressParams, + ChangellyApiValidateAddressResult, + ChangellyCurrency, +} from "./types"; import estimateEVMGasList from "../../common/estimateGasList"; - +import { + getCreateAssociatedTokenAccountIdempotentInstruction, + getSPLAssociatedTokenAccountPubkey, + getTokenProgramOfMint, + solAccountExists, + SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES, +} from "../../utils/solana"; + +/** Enables debug logging in this file */ const DEBUG = false; const BASE_URL = "https://partners.mewapi.io/changelly-v2"; @@ -73,6 +107,8 @@ class Changelly extends ProviderClass { network: SupportedNetworkName; + web3: Web3Eth | Connection; + name: ProviderName; fromTokens: ProviderFromTokenResponse; @@ -84,8 +120,9 @@ class Changelly extends ProviderClass { contractToTicker: Record; - constructor(network: SupportedNetworkName) { + constructor(web3: Web3Eth | Connection, network: SupportedNetworkName) { super(); + this.web3 = web3; this.network = network; this.tokenList = []; this.name = ProviderName.changelly; @@ -105,8 +142,7 @@ class Changelly extends ProviderClass { } this.changellyList = await fetch(CHANGELLY_LIST).then((res) => res.json()); - /** Mapping of changelly network name -> enkrypt network name */ - /** changelly blockchain name -> enkrypt supported swap network name */ + /** Changelly blockchain name -> enkrypt supported swap network name */ const changellyToNetwork: Record = {}; // Generate mapping of changelly blockchain -> enkrypt blockchain Object.keys(supportedNetworks).forEach((net) => { @@ -180,36 +216,99 @@ class Changelly extends ProviderClass { ); } - private changellyRequest(method: string, params: any): Promise { - // TODO: timeoutes & retries? - return fetch(`${BASE_URL}`, { - method: "POST", - body: JSON.stringify({ - id: uuidv4(), - jsonrpc: "2.0", - method, - params, - }), - headers: { "Content-Type": "application/json" }, - }).then((res) => res.json()); + /** + * Make a HTTP request to the Changelly Json RPC API + * + * @param method JsonRPC request method + * @param params JsonRPC request parameters + * @param context Cancellable execution context + * @returns JsonRPC response, could be success or error + */ + private async changellyRequest( + method: string, + params: any, + context?: { signal?: AbortSignal } + ): Promise> { + const signal = context?.signal; + const aborter = new AbortController(); + function onAbort() { + // Pass context signal to the request signal + aborter.abort(signal!.reason); + } + function onTimeout() { + aborter.abort( + new Error(`Changelly API request timed out ${BASE_URL} ${method}`) + ); + } + function cleanup() { + // eslint-disable-next-line no-use-before-define + clearTimeout(timeout); + signal?.removeEventListener("abort", onAbort); + } + const timeout = setTimeout(onTimeout, 30_000); + signal?.addEventListener("abort", onAbort); + try { + const response = await fetch(BASE_URL, { + method: "POST", + signal: aborter.signal, + body: JSON.stringify({ + id: uuidv4(), + jsonrpc: "2.0", + method, + params, + }), + headers: [ + ["Content-Type", "application/json"], + ["Accept", "application/json"], + ], + }); + const json = (await response.json()) as ChangellyApiResponse; + return json; + } finally { + cleanup(); + } } - isValidAddress(address: string, ticker: string): Promise { - return this.changellyRequest("validateAddress", { + async isValidAddress(address: string, ticker: string): Promise { + const params: ChangellyApiValidateAddressParams = { currency: ticker, address, - }).then((response) => { - if (response.error) { - debug( - "isValidAddress", - `Error in response when validating address` + - ` address=${address}` + - ` err=${String(response.error.message)}` - ); - return false; - } - return response.result?.[0]?.result ?? false; - }); + }; + + /** @see https://docs.changelly.com/validate-address */ + const response = + await this.changellyRequest( + "validateAddress", + params + ); + + if (response.error) { + console.warn( + `Error validating address with via Changelly` + + ` code=${String(response.error.code)}` + + ` message=${String(response.error.message)}` + ); + return false; + } + + if (typeof response.result.result !== "boolean") { + console.warn( + 'Unexpected response to "validateAddress" call to Changelly.' + + ` Expected a response.result.result to be a boolean` + + ` but received response: ${JSON.stringify(response)}` + ); + return false; + } + + const isValid = response.result.result; + debug( + "isValidAddress", + `Changelly validateAddress result` + + ` address=${address}` + + ` ticker=${ticker}` + + ` isValid=${isValid}` + ); + return isValid; } getFromTokens() { @@ -221,71 +320,86 @@ class Changelly extends ProviderClass { return {}; } - getMinMaxAmount({ - fromToken, - toToken, - }: { - fromToken: TokenType; - toToken: TokenTypeTo; - }): Promise { + async getMinMaxAmount( + options: { fromToken: TokenType; toToken: TokenTypeTo }, + context?: { signal?: AbortSignal } + ): Promise { + const { fromToken, toToken } = options; + const signal = context?.signal; + const startedAt = Date.now(); - debug( - "getMinMaxAmount", - `Getting min and max of swap pair` + - ` fromToken=${fromToken.symbol}` + - ` toToken=${toToken.symbol}` - ); const emptyResponse = { minimumFrom: toBN("0"), maximumFrom: toBN("0"), minimumTo: toBN("0"), maximumTo: toBN("0"), }; - const method = "getFixRate"; - return this.changellyRequest(method, { - from: this.getTicker(fromToken, this.network), - to: this.getTicker( - toToken as TokenType, - toToken.networkInfo.name as SupportedNetworkName - ), - }) - .then((response) => { - if (response.error) return emptyResponse; - const result = response.result[0]; - const minMax = { - minimumFrom: toBN(toBase(result.minFrom, fromToken.decimals)), - maximumFrom: toBN(toBase(result.maxFrom, fromToken.decimals)), - minimumTo: toBN(toBase(result.minTo, toToken.decimals)), - maximumTo: toBN(toBase(result.maxTo, toToken.decimals)), - }; - debug( - "getMinMaxAmount", - `Successfully got min and max of swap pair` + - ` method=${method}` + - ` fromToken=${fromToken.symbol}` + - ` toToken=${toToken.symbol}` + - ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + try { + const params: ChangellyApiGetFixRateParams = { + from: this.getTicker(fromToken, this.network), + to: this.getTicker( + toToken as TokenType, + toToken.networkInfo.name as SupportedNetworkName + ), + }; + + const response = + await this.changellyRequest( + "getFixRate", + params, + { signal } ); - return minMax; - }) - .catch((err: Error) => { - debug( - "getMinMaxAmount", - `Errored calling getFixRate to get the min and max of swap pair` + - ` method=${method}` + - ` fromToken=${fromToken.symbol}` + - ` toToken=${toToken.symbol}` + + + if (response.error) { + // JsonRPC ERR response + console.warn( + `Changelly "getFixRate" returned JSONRPC error response` + + ` fromToken=${fromToken.symbol} (${params.from})` + + ` toToken=${toToken.symbol} (${params.to})` + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + - ` err=${String(err)}` + ` code=${String(response.error.code)}` + + ` message=${String(response.error.message)}` ); return emptyResponse; - }); + } + + // JsonRPC OK response + const result = response.result[0]; + const minMax = { + minimumFrom: toBN(toBase(result.minFrom, fromToken.decimals)), + maximumFrom: toBN(toBase(result.maxFrom, fromToken.decimals)), + minimumTo: toBN(toBase(result.minTo, toToken.decimals)), + maximumTo: toBN(toBase(result.maxTo, toToken.decimals)), + }; + debug( + "getMinMaxAmount", + `Successfully got min and max of swap pair` + + ` fromToken=${fromToken.symbol} (${params.from})` + + ` toToken=${toToken.symbol} (${params.to})` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); + return minMax; + } catch (err) { + // HTTP request failed + console.warn( + `Errored calling Changelly JSONRPC HTTP API "getFixRate"` + + ` fromToken=${fromToken.symbol}` + + ` toToken=${toToken.symbol}` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` err=${String(err)}` + ); + return emptyResponse; + } } async getQuote( options: getQuoteOptions, - meta: QuoteMetaOptions + meta: QuoteMetaOptions, + context?: { signal?: AbortSignal } ): Promise { + const signal = context?.signal; + const startedAt = Date.now(); debug( @@ -361,91 +475,189 @@ class Changelly extends ProviderClass { if (quoteRequestAmount.toString() === "0") return null; - const method = "getFixRateForAmount"; - debug("getQuote", `Requesting changelly swap... method=${method}`); - return this.changellyRequest(method, { - from: this.getTicker(options.fromToken, this.network), - to: this.getTicker( - options.toToken as TokenType, - options.toToken.networkInfo.name as SupportedNetworkName - ), - amountFrom: fromBase( - quoteRequestAmount.toString(), - options.fromToken.decimals - ), - }) - .then(async (response) => { - debug("getQuote", `Received Changelly swap response method=${method}`); - if (response.error || !response.result || !response.result[0].id) { - debug( - "getQuote", - `No swap: response either contains error, no result or no id` + - ` method=${method}` + - ` took=${(Date.now() - startedAt).toLocaleString()}ms` - ); - return null; - } - const result = response.result[0]; - const evmGasLimit = - options.fromToken.address === NATIVE_TOKEN_ADDRESS && - options.fromToken.type === NetworkType.EVM - ? 21000 - : toBN(GAS_LIMITS.transferToken).toNumber(); - const retResponse: ProviderQuoteResponse = { - fromTokenAmount: quoteRequestAmount, - additionalNativeFees: toBN(0), - toTokenAmount: toBN( - toBase(result.amountTo, options.toToken.decimals) - ).sub(toBN(toBase(result.networkFee, options.toToken.decimals))), - provider: this.name, - quote: { - meta: { - ...meta, - changellyQuoteId: result.id, - changellynetworkFee: toBN( - toBase(result.networkFee, options.toToken.decimals) - ), - }, - options: { - ...options, - amount: quoteRequestAmount, - }, - provider: this.name, - }, - totalGaslimit: - options.fromToken.type === NetworkType.EVM ? evmGasLimit : 0, - minMax, - }; - debug( - "getQuote", - `Successfully processed Changelly swap response` + - ` took=${(Date.now() - startedAt).toLocaleString()}ms` + debug("getQuote", `Requesting changelly swap...`); + + try { + const params: ChangellyApiGetFixRateForAmountParams = { + from: this.getTicker(options.fromToken, this.network), + to: this.getTicker( + options.toToken as TokenType, + options.toToken.networkInfo.name as SupportedNetworkName + ), + amountFrom: fromBase( + quoteRequestAmount.toString(), + options.fromToken.decimals + ), + }; + + const response = + await this.changellyRequest( + "getFixRateForAmount", + params, + { signal } + ); + + debug("getQuote", `Received Changelly swap response`); + + if (response.error) { + console.warn( + `Changelly "getFixRateForAmount" returned JSONRPC error response,` + + ` returning no quotes` + + ` fromToken=${options.fromToken.symbol} (${params.from})` + + ` toToken=${options.toToken.symbol} (${params.to})` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` code=${String(response.error.code)}` + + ` message=${String(response.error.message)}` ); - return retResponse; - }) - .catch((err) => { - debug( - "getQuote", - `Changelly request failed` + - ` method=${method}` + + return null; + } + + if (!response.result || !response.result[0]?.id) { + console.warn( + `Changelly "getFixRateForAmount" response contains no quotes,` + + ` returning no quotes` + + ` fromToken=${options.fromToken.symbol} (${params.from})` + + ` toToken=${options.toToken.symbol} (${params.to})` + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + - ` err=${String(err)}` + ` code=${String(response.error.code)}` + + ` message=${String(response.error.message)}`, + { ...response } ); return null; - }); + } + + // TODO: Do we want to warn here? or just debug log? or nothing? + if (response.result.length > 1) { + console.warn( + `Changelly "getFixRateForAmount" returned more than one quote, continuing with first quote` + + ` fromToken=${options.fromToken.symbol} (${params.from})` + + ` toToken=${options.toToken.symbol} (${params.to})` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` count=${response.result.length}ms`, + { ...response } + ); + } + + const [firstChangellyFixRateQuote] = response.result; + + const evmGasLimit = + options.fromToken.address === NATIVE_TOKEN_ADDRESS && + options.fromToken.type === NetworkType.EVM + ? 21000 + : toBN(GAS_LIMITS.transferToken).toNumber(); + + // `toBase` fails sometimes because Changelly returns more decimals than the token has + let toTokenAmountBase: string; + try { + toTokenAmountBase = toBase( + firstChangellyFixRateQuote.amountTo, + options.toToken.decimals + ); + } catch (err) { + console.warn( + `Changelly "getFixRateForAmount" "amountTo" possibly returned more` + + ` decimals than the token has, attempting to trim trailing decimals...` + + ` amountTo=${firstChangellyFixRateQuote.amountTo}` + + ` toTokenDecimals=${options.toToken.decimals}` + + ` err=${String(err)}` + ); + const original = firstChangellyFixRateQuote.amountTo; + // eslint-disable-next-line no-use-before-define + const [success, fixed] = trimDecimals( + original, + options.toToken.decimals + ); + if (!success) throw err; + const rounded = ( + BigInt(toBase(fixed, options.toToken.decimals)) - BigInt(1) + ).toString(); + toTokenAmountBase = rounded; + } + + // `toBase` fails sometimes because Changelly returns more decimals than the token has + let networkFeeBase: string; + try { + networkFeeBase = toBase( + firstChangellyFixRateQuote.networkFee, + options.toToken.decimals + ); + } catch (err) { + console.warn( + `Changelly "getFixRateForAmount" "networkFee" possibly returned more` + + ` decimals than the token has, attempting to trim trailing decimals...` + + ` networkFee=${firstChangellyFixRateQuote.networkFee}` + + ` toTokenDecimals=${options.toToken.decimals}` + + ` err=${String(err)}` + ); + const original = firstChangellyFixRateQuote.networkFee; + // eslint-disable-next-line no-use-before-define + const [success, fixed] = trimDecimals( + original, + options.toToken.decimals + ); + if (!success) throw err; + const rounded = ( + BigInt(toBase(fixed, options.toToken.decimals)) + BigInt(1) + ).toString(); + networkFeeBase = rounded; + } + + const providerQuoteResponse: ProviderQuoteResponse = { + fromTokenAmount: quoteRequestAmount, + additionalNativeFees: toBN(0), + toTokenAmount: toBN(toTokenAmountBase).sub(toBN(networkFeeBase)), + provider: this.name, + quote: { + meta: { + ...meta, + changellyQuoteId: firstChangellyFixRateQuote.id, + changellynetworkFee: toBN(networkFeeBase), + }, + options: { + ...options, + amount: quoteRequestAmount, + }, + provider: this.name, + }, + totalGaslimit: + options.fromToken.type === NetworkType.EVM ? evmGasLimit : 0, + minMax, + }; + + debug( + "getQuote", + `Successfully retrieved quote from Changelly via "getFixRateForAmount"` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); + + return providerQuoteResponse; + } catch (err) { + console.warn( + `Errored getting quotes from Changelly via "getFixRateForAmount",` + + ` returning no quotes` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` err=${String(err)}` + ); + return null; + } } - getSwap(quote: SwapQuote): Promise { + async getSwap( + quote: SwapQuote, + context?: { signal?: AbortSignal } + ): Promise { + const signal = context?.signal; + const startedAt = Date.now(); - debug("getSwap", `Getting Changelly swap`); + debug("getSwap", `Requesting swap transaction from Changelly...`); if (!Changelly.isSupported(this.network)) { debug( "getSwap", - `No swap: Enkrypt does not support Changelly on the source network` + + `Enkrypt does not support Changelly on the source network, returning no swap` + ` srcNetwork=${this.network}` ); - return Promise.resolve(null); + return null; } if ( @@ -455,58 +667,81 @@ class Changelly extends ProviderClass { ) { debug( "getSwap", - `No swap: Enkrypt does not support Changelly on the destination network` + + `Enkrypt does not support Changelly on the destination network, returning no swap` + ` dstNetwork=${quote.options.toToken.networkInfo.name}` ); - return Promise.resolve(null); + return null; } - const method = "createFixTransaction"; - debug("getSwap", `Requesting Changelly swap... method=${method}`); - return this.changellyRequest("createFixTransaction", { - from: this.getTicker(quote.options.fromToken, this.network), - to: this.getTicker( - quote.options.toToken as TokenType, - quote.options.toToken.networkInfo.name as SupportedNetworkName - ), - refundAddress: quote.options.fromAddress, - address: quote.options.toAddress, - amountFrom: fromBase( - quote.options.amount.toString(), - quote.options.fromToken.decimals - ), - rateId: quote.meta.changellyQuoteId, - }) - .then(async (response) => { - debug("getSwap", `Received Changelly swap response method=${method}`); - if (response.error || !response.result.id) { - debug( - "getSwap", - `No swap: response either contains error or no id` + - ` method=${method}` + - ` took=${(Date.now() - startedAt).toLocaleString()}ms` - ); - return null; - } - const { result } = response; - let transaction: SwapTransaction; - if (quote.options.fromToken.type === NetworkType.EVM) { - if (quote.options.fromToken.address === NATIVE_TOKEN_ADDRESS) + try { + const params: ChangellyApiCreateFixedRateTransactionParams = { + from: this.getTicker(quote.options.fromToken, this.network), + to: this.getTicker( + quote.options.toToken as TokenType, + quote.options.toToken.networkInfo.name as SupportedNetworkName + ), + refundAddress: quote.options.fromAddress, + address: quote.options.toAddress, + amountFrom: fromBase( + quote.options.amount.toString(), + quote.options.fromToken.decimals + ), + rateId: quote.meta.changellyQuoteId, + }; + + const response = + await this.changellyRequest( + "createFixTransaction", + params, + { signal } + ); + + if (response.error) { + console.warn( + `Changelly "createFixTransaction" returned JSONRPC error response, returning no swap` + + ` fromToken=${quote.options.fromToken.symbol} (${params.from})` + + ` toToken=${quote.options.toToken.symbol} (${params.to})` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` code=${String(response.error.code)}` + + ` message=${String(response.error.message)}` + ); + return null; + } + + if (!response.result.id) { + console.warn( + `Changelly "createFixTransaction" response contains no id, returning no swap` + + ` fromToken=${quote.options.fromToken.symbol} (${params.from})` + + ` toToken=${quote.options.toToken.symbol} (${params.to})` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms`, + { ...response } + ); + return null; + } + + let additionalNativeFees = toBN(0); + const changellyFixedRateTx = response.result; + let transaction: SwapTransaction; + switch (quote.options.fromToken.type) { + case NetworkType.EVM: { + debug("getSwap", `Preparing EVM transaction for Changelly swap`); + if (quote.options.fromToken.address === NATIVE_TOKEN_ADDRESS) { transaction = { from: quote.options.fromAddress, data: "0x", gasLimit: numberToHex(21000), - to: result.payinAddress, + to: changellyFixedRateTx.payinAddress, value: numberToHex(quote.options.amount), type: TransactionType.evm, }; - else + } else { transaction = getTransfer({ from: quote.options.fromAddress, contract: quote.options.fromToken.address, - to: result.payinAddress, + to: changellyFixedRateTx.payinAddress, value: quote.options.amount.toString(), }); + } const accurateGasEstimate = await estimateEVMGasList( [transaction], this.network @@ -516,75 +751,256 @@ class Changelly extends ProviderClass { const [txGaslimit] = accurateGasEstimate.result; transaction.gasLimit = txGaslimit; } - } else { + break; + } + case NetworkType.Solana: { + // TODO: finish implementing support for Solana + debug("getSwap", `Changelly is not supported on Solana at this time`); + if (true as any) return null; + + const latestBlockHash = await ( + this.web3 as Connection + ).getLatestBlockhash(); + + // Create a transaction to transfer this much of that token to that thing + let versionedTx: VersionedTransaction; + if (quote.options.fromToken.address === NATIVE_TOKEN_ADDRESS) { + debug( + "getSwap", + `Preparing Solana Changelly SOL swap transaction` + + ` quote.options.fromAddress=${quote.options.fromAddress}` + + ` latestBlockHash=${latestBlockHash.blockhash}` + + ` lastValidBlockHeight=${latestBlockHash.lastValidBlockHeight}` + + ` payinAddress=${changellyFixedRateTx.payinAddress}` + + ` lamports=${BigInt(quote.options.amount.toString())}` + ); + versionedTx = new VersionedTransaction( + new TransactionMessage({ + payerKey: new PublicKey(quote.options.fromAddress), + recentBlockhash: latestBlockHash.blockhash, + instructions: [ + SystemProgram.transfer({ + fromPubkey: new PublicKey(quote.options.fromAddress), + toPubkey: new PublicKey(changellyFixedRateTx.payinAddress), + lamports: BigInt(quote.options.amount.toString()), + }), + ], + }).compileToV0Message() + ); + } else { + const wallet = new PublicKey(quote.options.fromAddress); + const mint = new PublicKey(quote.options.fromToken.address); + const tokenProgramId = await getTokenProgramOfMint( + this.web3 as Connection, + mint + ); + const walletMintAta = getSPLAssociatedTokenAccountPubkey( + wallet, + mint, + tokenProgramId + ); + // TODO: is payin address an ATA or Wallet address? + const payinAta = new PublicKey(changellyFixedRateTx.payinAddress); + const amount = BigInt(quote.options.amount.toString()); + debug( + "getSwap", + // eslint-disable-next-line prefer-template + `Preparing Solana Changelly SPL token swap transaction` + + ` srcMint=${mint.toBase58()}` + + ` wallet=${wallet.toBase58()}` + + ` walletSrcMintAta=${tokenProgramId.toBase58()}` + + ` dstMintAta=${payinAta.toBase58()}` + + ` tokenProgramId=${tokenProgramId.toBase58()}` + + ` latestBlockHash=${latestBlockHash.blockhash}` + + ` lastValidBlockHeight=${latestBlockHash.lastValidBlockHeight}` + + ` payinAddress=${changellyFixedRateTx.payinAddress}` + + ` amount=${amount}` + ); + + // If the ATA account doesn't exist we need create it + const ataExists = await solAccountExists( + this.web3 as Connection, + payinAta + ); + + const instructions: TransactionInstruction[] = []; + if (ataExists) { + debug( + "getSwap", + `Payin ATA already exists. No need to create it.` + ); + } else { + debug("getSwap", `Payin ATA does not exist. Need to create it.`); + // TODO: finish implementing + const extraRentFee = await ( + this.web3 as Connection + ).getMinimumBalanceForRentExemption( + SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES + ); + const instruction = + getCreateAssociatedTokenAccountIdempotentInstruction({ + payerPubkey: wallet, + ataPubkey: payinAta, // TODO: we'd need to get the owner + ownerPubkey: new PublicKey("!! TODO !!"), + mintPubkey: mint, + systemProgramId: SystemProgram.programId, + tokenProgramId, + associatedTokenProgramId: ASSOCIATED_TOKEN_PROGRAM_ID, + }); + + instructions.push(instruction); + additionalNativeFees = additionalNativeFees.add( + toBN(extraRentFee) + ); + throw new Error("TODO: Finish implementing Changelly on Solana"); + } + + instructions.push( + createSPLTransferInstruction( + /** source */ walletMintAta, + /** destination */ payinAta, + /** owner */ wallet, + /** amount */ amount, + /** multiSigners */ [], + /** programId */ tokenProgramId + ) + ); + + versionedTx = new VersionedTransaction( + new TransactionMessage({ + payerKey: wallet, + recentBlockhash: latestBlockHash.blockhash, + instructions, + }).compileToV0Message() + ); + } + + transaction = { + type: TransactionType.solana, + from: quote.options.fromAddress, + to: changellyFixedRateTx.payinAddress, + serialized: Buffer.from(versionedTx.serialize()).toString("base64"), + kind: "versioned", + signed: false, + }; + break; + } + default: { transaction = { from: quote.options.fromAddress, - to: result.payinAddress, + to: changellyFixedRateTx.payinAddress, value: numberToHex(quote.options.amount), type: TransactionType.generic, }; + break; } - const fee = 1; - const retResponse: ProviderSwapResponse = { - fromTokenAmount: quote.options.amount, - provider: this.name, - toTokenAmount: toBN( - toBase(result.amountExpectedTo, quote.options.toToken.decimals) - ).sub(quote.meta.changellynetworkFee), - additionalNativeFees: toBN(0), - transactions: [transaction], - slippage: quote.meta.slippage || DEFAULT_SLIPPAGE, - fee, - getStatusObject: async ( - options: StatusOptions - ): Promise => ({ - options: { - ...options, - swapId: result.id, - }, - provider: this.name, - }), - }; - debug( - "getSwap", - `Successfully processed Changelly swap response` + - ` took=${(Date.now() - startedAt).toLocaleString()}ms` + } + + // `toBase` fails sometimes because Changelly returns more decimals than the token has + const fee = 1; + let baseToAmount: string; + try { + baseToAmount = toBase( + changellyFixedRateTx.amountExpectedTo, + quote.options.toToken.decimals ); - return retResponse; - }) - .catch((err) => { - debug( - "getSwap", - `Changelly request failed` + - ` method=${method}` + - ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + } catch (err) { + console.warn( + `Changelly "createFixTransaction" "amountExpectedTo" possibly returned more` + + ` decimals than the token has, attempting to trim trailing decimals...` + + ` amountExpectedTo=${changellyFixedRateTx.amountExpectedTo}` + + ` toTokenDecimals=${quote.options.toToken.decimals}` + ` err=${String(err)}` ); - return null; - }); + const original = changellyFixedRateTx.amountExpectedTo; + // eslint-disable-next-line no-use-before-define + const [success, fixed] = trimDecimals( + original, + quote.options.toToken.decimals + ); + if (!success) throw err; + const rounded = ( + BigInt(toBase(fixed, quote.options.toToken.decimals)) - BigInt(1) + ).toString(); + baseToAmount = rounded; + } + + const retResponse: ProviderSwapResponse = { + fromTokenAmount: quote.options.amount, + provider: this.name, + toTokenAmount: toBN(baseToAmount).sub(quote.meta.changellynetworkFee), + additionalNativeFees, + transactions: [transaction], + slippage: quote.meta.slippage || DEFAULT_SLIPPAGE, + fee, + getStatusObject: async ( + options: StatusOptions + ): Promise => ({ + options: { + ...options, + swapId: changellyFixedRateTx.id, + }, + provider: this.name, + }), + }; + debug( + "getSwap", + `Successfully extracted Changelly swap transaction via "createFixTransaction"` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + ); + return retResponse; + } catch (err) { + console.warn( + `Errored processing Changelly swap response, returning no swap` + + ` took=${(Date.now() - startedAt).toLocaleString()}ms` + + ` err=${String(err)}` + ); + return null; + } } - getStatus(options: StatusOptions): Promise { - return this.changellyRequest("getStatus", { + async getStatus(options: StatusOptions): Promise { + const params: ChangellyApiGetStatusParams = { id: options.swapId, - }).then(async (response) => { - if (response.error || !response.result) return TransactionStatus.pending; - const completedStatuses = ["finished"]; - const pendingStatuses = [ - "confirming", - "exchanging", - "sending", - "waiting", - "new", - ]; - const failedStatuses = ["failed", "refunded", "hold", "expired"]; - const status = response.result; - if (pendingStatuses.includes(status)) return TransactionStatus.pending; - if (completedStatuses.includes(status)) return TransactionStatus.success; - if (failedStatuses.includes(status)) return TransactionStatus.failed; - return TransactionStatus.pending; - }); + }; + const response = await this.changellyRequest( + "getStatus", + params + ); + + if (response.error || !response.result) return TransactionStatus.pending; + const completedStatuses = ["finished"]; + const pendingStatuses = [ + "confirming", + "exchanging", + "sending", + "waiting", + "new", + ]; + const failedStatuses = ["failed", "refunded", "hold", "expired"]; + const status = response.result; + if (pendingStatuses.includes(status)) return TransactionStatus.pending; + if (completedStatuses.includes(status)) return TransactionStatus.success; + if (failedStatuses.includes(status)) return TransactionStatus.failed; + return TransactionStatus.pending; } } +function trimDecimals( + value: string, + decimals: number +): [success: boolean, fixed: string] { + const original = value; + const parts = original.split("."); + if (parts.length !== 2) return [false, ""]; // More or less than one decimal, something else is wrong + // Possibly recoverable + const [integerPart, fractionPart] = parts; + if (fractionPart.length <= decimals) return [false, ""]; // Some other issue, decimals should be sufficient + const fractionTrimmed = fractionPart.slice(0, decimals); + const normalised = `${integerPart}.${fractionTrimmed}`; + // Round up one (higher price paid) since we lose precision + const rounded = (BigInt(toBase(normalised, decimals)) + BigInt(1)).toString(); + return [true, rounded]; +} + export default Changelly; diff --git a/packages/swap/src/providers/changelly/supported.ts b/packages/swap/src/providers/changelly/supported.ts index 88c5501c4..0158763c7 100644 --- a/packages/swap/src/providers/changelly/supported.ts +++ b/packages/swap/src/providers/changelly/supported.ts @@ -1,6 +1,6 @@ -import { PublicKey } from "@solana/web3.js"; import { isPolkadotAddress, isEVMAddress } from "../../utils/common"; import { SupportedNetworkName } from "../../types"; +// import { isValidSolanaAddress } from "../../utils/solana"; /** * Blockchain names: @@ -61,18 +61,13 @@ const supportedNetworks: { [SupportedNetworkName.Dogecoin]: { changellyName: "doge", }, - [SupportedNetworkName.Solana]: { - changellyName: "solana", - isAddress: (address: string) => { - try { - // eslint-disable-next-line no-new - new PublicKey(address); - return Promise.resolve(true); - } catch (err) { - return Promise.resolve(false); - } - }, - }, + // TODO: Support Solana + // [SupportedNetworkName.Solana]: { + // changellyName: "solana", + // async isAddress(address: string) { + // return isValidSolanaAddress(address); + // }, + // }, [SupportedNetworkName.Rootstock]: { changellyName: "rootstock", }, diff --git a/packages/swap/src/providers/changelly/types.ts b/packages/swap/src/providers/changelly/types.ts index 91c974f44..77bfe2383 100644 --- a/packages/swap/src/providers/changelly/types.ts +++ b/packages/swap/src/providers/changelly/types.ts @@ -17,3 +17,699 @@ export interface ChangellyCurrency { contractAddress?: string; token?: TokenType; } + +// Changelly's API is Json RPC + +export type ChangellyApiOkResponse = { + id: string | number; + jsonrpc: "2.0"; + result: T; + error?: undefined; +}; +export type ChangellyApiErrResponse = { + id: string | number; + jsonrpc: "2.0"; + result?: undefined; + error: { + message: string; + code: number; + }; +}; + +export type ChangellyApiResponse = + | ChangellyApiOkResponse + | ChangellyApiErrResponse; + +/** + * @see https://docs.changelly.com/validate-address#request + * + * @example + * ```sh + * # Valid address + * curl -sL https://partners.mewapi.io/changelly-v2 -X POST -H Accept:application/json -H Content-Type:application/json --data '{"id":"1","jsonrpc":"2.0","method":"validateAddress","params":{"currency":"sol","address":"CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38"}}' | jq '.' -C | less -R + * # { + * # "jsonrpc": "2.0", + * # "result": { + * # "result": true + * # }, + * # "id": "1" + * # } + * + * # Invalid address + * curl -sL https://partners.mewapi.io/changelly-v2 -X POST -H Accept:application/json -H Content-Type:application/json --data '{"id":"1","jsonrpc":"2.0","method":"validateAddress","params":{"currency":"sol","address":"CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38zzzzzz"}}' | jq '.' -C | less -R + * # { + * # "jsonrpc": "2.0", + * # "result": { + * # "result": false, + * # "message": "Invalid address" + * # }, + * # "id": "1" + * # } + * ``` + */ +export type ChangellyApiValidateAddressParams = { + /** + * Currency ticker (in lowercase). + * + * @example "sol" + */ + currency: string; + + /** + * Wallet address. + * + * @example "CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38" + */ + address: string; + + /** Extra ID. */ + extraId?: string; +}; + +/** @see https://docs.changelly.com/validate-address#response */ +export type ChangellyApiValidateAddressResult = { + /** + * Is true if the given address is valid. + */ + result: boolean; + + /** + * Error message which is returned only if the given address is invalid. + * + * @example "Invalid address" + */ + message?: string; +}; + +/** + * @see https://docs.changelly.com/fix/get-fix-rate#request + * + * @note The method is deprecated. Use getFixRateForAmount instead. + * + * @example + * ```sh + * curl -sL https://partners.mewapi.io/changelly-v2 -X POST -H Accept:application/json -H Content-Type:application/json --data '{"id":"1","jsonrpc":"2.0","method":"getFixRate","params":{"from":"sol","to":"btc"}}' | jq '.' -C | less -R + * # { + * # "jsonrpc": "2.0", + * # "result": [ + * # { + * # "id": "RmELQQZ@MP0WIcD55XEjyVmieqsk@z", + * # "from": "sol", + * # "to": "btc", + * # "result": "0.002190975020", + * # "networkFee": "0.00001909", + * # "max": "700.00000000", + * # "maxFrom": "700.00000000", + * # "maxTo": "1.57946710", + * # "min": "0.80000000", + * # "minFrom": "0.80000000", + * # "minTo": "0.00180510", + * # "expiredAt": 1726539462 + * # } + * # ], + * # "id": "1" + * # } + * ```` + */ +export type ChangellyApiGetFixRateParams = { + /** + * Payin currency code (in lowercase). + * + * @example "sol" + */ + from: string; + + /** + * Payout currency code (in lowercase). + * + * @example "btc" + * */ + to: string; +}; + +/** + * @see https://docs.changelly.com/fix/get-fix-rate#response + * + * @note The method is deprecated. Use getFixRateForAmount instead. + */ +export type ChangellyApiGetFixRateResult = Array<{ + /** + * Rate ID that can be used during 1 minute. + * This time should be enough for user to initiate the exchange. + * Expired rate id cannot be used for creation of the fixed rate transaction. + * + * id has to be stored somewhere. It will be used as rateId value while calling. + * + * @example "LT^rql0B^5QcM^pETcEZaBZ652v#*s" + */ + id: string; + + /** + * Exchange rate before withholding the network fee. + * + * Important. To calculate the exact amount that the user will get, you need + * to multiply the amount that the user wants to send to the result and deduct + * the value of the networkFee. + * + * @example "0.002191084078" + */ + result: string; + + /** + * Payin currency code. + * + * @example "sol" + */ + from: string; + + /** + * Payout currency code. + * + * @example "btc" + */ + to: string; + + /** + * Commission taken by the network from the amount sent to the user. + * For one-step exchange, displayed in pay-out currency. + * For two-step exchanges, displayed in BTC or in USDT. + * + * @example "0.00001909" + */ + networkFee: string; + + /** + * Maximum exchangeable amount. + * + * "700.00000000" + */ + max: string; + + /** + * Maximum payin amount for which we would be able to perform the exchange. + * + * @example "700.00000000" + */ + maxFrom: string; + + /** + * Maximum payout amount for which we would be able to perform the exchange. + * + * @example "1.57912539" + */ + maxTo: string; + + /** + * Minimum exchangeable amount. + * + * @example "0.80000000" + */ + min: string; + + /** + * Minimum payin amount for which we would be able to perform the exchange. + * + * @example "0.80000000" + */ + minFrom: string; + + /** + * Minimum payout amount for which we would be able to perform the exchange. + * + * @example "0.00180472" + */ + minTo: string; + + /** + * Unix timestamp in seconds (10 digits) representing the expiration time of the fixed rate. + * + * @example 1726538857 + */ + expiredAt: number; + + /** + * Exchange fee in pay-out currency. + */ + fee?: string; +}>; + +/** + * @see https://docs.changelly.com/fix/get-fix-rate-for-amount#request + * + * @example + * ```sh + * curl -sL https://partners.mewapi.io/changelly-v2 -X POST -H Accept:application/json -H Content-Type:application/json --data '{"id":"1","jsonrpc":"2.0","method":"getFixRateForAmount","params":{"from":"sol","to":"btc","amountFrom":"1"}}' | jq '.' -C | less -R + * # { + * # "jsonrpc": "2.0", + * # "result": [ + * # { + * # "id": "GhNY6BJBOsjt8UlfEOHI&x0B$m6Dde", + * # "from": "sol", + * # "to": "btc", + * # "result": "0.002191229654", + * # "networkFee": "0.00001909", + * # "max": "700.00000000", + * # "maxFrom": "700.00000000", + * # "maxTo": "1.57946710", + * # "min": "0.80000000", + * # "minFrom": "0.80000000", + * # "minTo": "0.00180510", + * # "amountFrom": "1", + * # "amountTo": "0.00217213", + * # "expiredAt": 1726539734 + * # } + * # ], + * # "id": "1" + * # } + * ``` + */ +export type ChangellyApiGetFixRateForAmountParams = { + /** + * Payin currency code (in lowercase). + * + * @example "sol" + */ + from: string; + + /** + * Payout currency code (in lowercase). + * + * @example "btc" + */ + to: string; + + /** + * Amount that user is going to exchange. + */ + amountFrom?: string; + + /** + * Amount that user is going to receive. + */ + amountTo?: string; + + /** + * Escaped JSON. + * You can use userMetadata to include any additional parameters for customization purposes. + * To use this feature, please contact us at pro@changelly.com. + */ + userMetadata?: string; +}; + +/** + * @see https://docs.changelly.com/fix/get-fix-rate-for-amount#response + */ +export type ChangellyApiGetFixRateForAmountResult = Array<{ + /** + * Rate ID that can be used during 1 minute. + * This time should be enough for user to initiate the exchange. + * Expired rate id cannot be used for creation of the fixed rate transaction. + * + * id has to be stored somewhere. It will be used as rateId value while calling. + * + * @example "FHzP%N~phM2h2&zCS$JilM)tEr!8oj" + */ + id: string; + + /** + * Exchange rate before withholding the network fee. + * + * Important. To calculate the exact amount that the user will get, + * you need to multiply the amount that the user wants to send to + * the result and deduct the value of the networkFee. + * + * @example "0.002191379964" + */ + result: string; + + /** + * Payin currency code. + * + * @example "sol" + */ + from: string; + + /** + * Payout currency code. + * + * @example "btc" + */ + to: string; + + /** + * Commission taken by the network from the amount sent to the user. Displayed in pay-out currency. + * + * @example "0.00001909" + */ + networkFee: string; + + /** + * Maximum exchangeable amount. + * + * @example "700.00000000" + */ + max: string; + + /** + * Maximum payin amount for which we would be able to perform the exchange. + * + * @example "700.00000000" + */ + maxFrom: string; + + /** + * Maximum payout amount for which we would be able to perform the exchange. + * + * @example "1.57946710" + */ + maxTo: string; + + /** + * Minimum exchangeable amount. + * + * @example "0.80000000" + */ + min: string; + + /** + * Minimum payin amount for which we would be able to perform the exchange. + * + * @example "0.80000000" + */ + minFrom: string; + + /** + * Minimum payout amount for which we would be able to perform the exchange. + * + * @example "0.00180510" + */ + minTo: string; + + /** + * Amount of assets that user will exchange after creating a fixed rate transaction. + * + * @example "1" + */ + amountFrom: string; + + /** + * Fixed exchange amount that user will receive after finishing a fixed-rate transaction using current rateId. + * + * @example "0.00217228" + */ + amountTo: string; + + /** + * Unix timestamp in seconds (10 digits) representing the expiration time of the fixed rate. + * + * @example 1726539789 + */ + expiredAt: number; + + /** + * Exchange fee in pay-out currency. + */ + fee?: string; +}>; + +/** + * @see https://docs.changelly.com/fix/create-fix-transaction#request + * + * @example + * ```sh + * # Replace "rateId" with "id" from "getFixRateForAmount" + * curl -sL https://partners.mewapi.io/changelly-v2 -X POST -H Accept:application/json -H Content-Type:application/json --data '{"id":"1","jsonrpc":"2.0","method":"createFixTransaction","params":{"from":"sol","to":"btc","amountFrom":"1","rateId":"l3zsI9C(1TDc5dRYOsG%fjJdu6BEuN","address":"bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y","amountFrom":"1","refundAddress":"CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38"}}' | jq '.' -C | less -R + * # { + * # "jsonrpc": "2.0", + * # "result": { + * # "id": "ze6rnqcnnuxxd6hc", + * # "trackUrl": "https://changelly.com/track/ze6rnqcnnuxxd6hc", + * # "createdAt": 1726540614000000, + * # "type": "fixed", + * # "status": "new", + * # "payTill": "2024-09-17T02:51:54.173+00:00", + * # "currencyFrom": "sol", + * # "currencyTo": "btc", + * # "payinAddress": "CocKqBY2yF6hXDTaM5Y5WgMUHNNjagVzAxUEMfGwUHXm", + * # "amountExpectedFrom": "1", + * # "payoutAddress": "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y", + * # "refundAddress": "CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38", + * # "amountExpectedTo": "0.00219147", + * # "networkFee": "0.00001909" + * # }, + * # "id": "1" + * # } + * ``` + */ +export type ChangellyApiCreateFixedRateTransactionParams = { + /** + * Payin currency code (in lowercase). + * + * @example "btc" + */ + from: string; + + /** + * Payout currency code (in lowercase). + * + * @example "sol" + */ + to: string; + + /** + * Rate ID that you get from getFixRate/getFixRateForAmount requests. + * + * @see https://docs.changelly.com/fix/get-fix-rate + * @see https://docs.changelly.com/fix/get-fix-rate-for-amount + * + * @example "FHzP%N~phM2h2&zCS$JilM)tEr!8oj" + */ + rateId: string; + + /** + * Recipient address. + * + * @example "CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38" + */ + address: string; + + /** + * Amount of currency that user is going to send. + * + * @example "1" + */ + amountFrom?: string; + + /** + * Amount user wants to receive. + */ + amountTo?: string; + + /** + * Additional ID for address for currencies that use additional ID for transaction processing. + */ + extraId?: string; + + /** + * Address of the wallet to refund in case of any technical issues during the exchange. + * The currency of the wallet must match with the from currency. + * + * @example "CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38" + */ + refundAddress: string; + + /** + * extraId for refundAddress. + */ + refundExtraId?: string; + + /** + * Address of the wallet from which the user will send payin. + */ + fromAddress?: string; + + /** + * extraId for fromAddress. + */ + fromExtraId?: string; + + /** + * subaccountId from createSubaccount. + * + * @see https://docs.changelly.com/subaccounts/subaccount + */ + subaccountId?: string; + + /** + * Escaped JSON. + * You can use userMetadata to include any additional parameters for customization purposes. + * To use this feature, please contact us at pro@changelly.com. + */ + userMetadata?: string; +}; + +/** + * @see https://docs.changelly.com/fix/create-fix-transaction#response + */ +export type ChangellyApiCreateFixedRateTransactionResult = { + /** + * Not documented + * + * Contains a URL that you can visit to follow the transaction + * + * @example "https://changelly.com/track/ze6rnqcnnuxxd6hc" + */ + trackUrl: string; + + /** + * Transaction ID. Could be used in getStatus method. + * + * @see https://docs.changelly.com/info/get-status + * + * @example "ze6rnqcnnuxxd6hc" + */ + id: string; + + /** + * Type of transaction. Always fixed in this method. + * + * @example "fixed" + */ + type: string; + + /** + * Address for a user to send coins to. + * + * @example "CocKqBY2yF6hXDTaM5Y5WgMUHNNjagVzAxUEMfGwUHXm" + */ + payinAddress: string; + + /** + * Extra ID for payinAddress in case it is required. + * Note: If the payinExtraId parameter is returned in the response and is not null, + * it is required for user to send the funds to the payinAddress specifying extraId. + * Otherwise, the transactions will not be processed and the user will need to get a + * refund through technical support. + */ + payinExtraId?: string; + + /** + * Address where the exchange result will be sent to. + * + * @example "bc1puzz9tmxawd7zdd7klfgtywrgpma3u22fz5ecxhucd4j8tygqe5ms2vdd9y" + */ + payoutAddress: string; + + /** + * Extra ID for payoutAddress in case it is required. + */ + payoutExtraId?: string; + + /** + * Address of the wallet to refund in case of any technical issues during the exchange. + * The currency of the wallet must match with the from currency. + * + * @example "CMGoYEKM8kSXwN9HzYiwRiZRXoMtEAQ98ZiPE9y67T38" + */ + refundAddress: string; + + /** + * Extra ID for refundAddress. + */ + refundExtraId?: string; + + /** + * The amountFrom value from createFixTransaction request. + * + * @example "1" + */ + amountExpectedFrom: number; + + /** + * The amountTo value from getFixRateForAmount response. + * This is the estimated payout amount of currency before withholding the network fee. + * + * @see https://docs.changelly.com/fix/get-fix-rate-for-amount + * + * @example "0.00219147" + */ + amountExpectedTo: string; + + /** + * Transaction status. + * Will always be new when transaction is created. + * If you reference the same transaction using the getStatus or getTransactions method, + * you'll get the waiting status as an equivalent to new. + * + * @example "new" + */ + status: string; + + /** + * Indicates time until which user needs to make the payment. + * + * @example "2024-09-17T02:51:54.173+00:00" + */ + payTill: string; + + /** + * Payout currency code. + * + * @example "btc" + */ + currencyTo: string; + + /** + * Payin currency code. + * + * @example "sol" + */ + currencyFrom: string; + + /** + * Time in timestamp format (microseconds) when the transaction was created. + * + * @example 1726540614000000 + */ + createdAt: number; + + /** + * Commission taken by the network from the amount sent to the user. Displayed in payout currency. + * + * @example "0.00001909" + */ + networkFee: string; +}; + +/** + * @see https://docs.changelly.com/info/get-status#request + * + * @example + * ```sh + * # Replace "id" with "id" from "createFixTransaction" + * curl -sL https://partners.mewapi.io/changelly-v2 -X POST -H Accept:application/json -H Content-Type:application/json --data '{"id":"1","jsonrpc":"2.0","method":"getStatus","params":{"id":"ze6rnqcnnuxxd6hc"}}' | jq '.' -C | less -R + * # { + * # "jsonrpc": "2.0", + * # "result": "waiting", + * # "id": "1" + * # } + * ``` + */ + +export type ChangellyApiGetStatusParams = { + /** + * Transaction ID. + * + * @example "ze6rnqcnnuxxd6hc" + */ + id: string; +}; + +/** + * @see https://docs.changelly.com/info/get-status#response + * + * Transaction status. + * + * @example "waiting" + */ +export type ChangellyApiGetStatusResult = string; diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 1edfefb9b..39c8c6c38 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -2,19 +2,27 @@ import { NetworkNames } from "@enkryptcom/types"; import { - AddressLookupTableAccount, - ComputeBudgetProgram, Connection, PublicKey, SystemProgram, TransactionInstruction, - TransactionMessage, VersionedTransaction, } from "@solana/web3.js"; import { toBN } from "web3-utils"; import fetch from "node-fetch"; import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "../../utils/approvals"; -import { extractComputeBudget } from "../../utils/solana"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + extractComputeBudget, + getCreateAssociatedTokenAccountIdempotentInstruction, + getSPLAssociatedTokenAccountPubkey, + getTokenProgramOfMint, + insertInstructionsAtStartOfTransaction, + isValidSolanaAddressAsync, + solAccountExists, + SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES, + WRAPPED_SOL_ADDRESS, +} from "../../utils/solana"; import { ProviderClass, ProviderName, @@ -39,6 +47,12 @@ import { FEE_CONFIGS, NATIVE_TOKEN_ADDRESS, } from "../../configs"; +import { + JupiterQuoteResponse, + JupiterSwapParams, + JupiterSwapResponse, + JupiterTokenInfo, +} from "./types"; /** Enables debug logging in this file */ const DEBUG = false; @@ -96,12 +110,6 @@ const JUPITER_TOKENS_URL = "https://tokens.jup.ag/tokens?tags=verified"; */ const JUPITER_API_URL = "https://quote-api.jup.ag/v6/"; -/** - * Wrapped SOL address - * @see https://solscan.io/token/So11111111111111111111111111111111111111112 - */ -const WRAPPED_SOL_ADDRESS = "So11111111111111111111111111111111111111112"; - /** * @see https://solscan.io/account/45ruCyfdRkWpRNGEqWzjCiXRHkZs8WXCLQ67Pnpye7Hp * @@ -120,35 +128,6 @@ const JUPITER_REFERRAL_PROGRAM_PUBKEY = new PublicKey( "REFER4ZgmyYx9c6He5XfaTMiGfdLwRnkV4RPp9t9iF3" ); -/** - * Address of the SPL Token program - * - * @see https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA - */ -export const TOKEN_PROGRAM_ID = new PublicKey( - "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" -); - -/** - * Address of the SPL Token 2022 program - * - * @see https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb - */ -export const TOKEN_2022_PROGRAM_ID = new PublicKey( - "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" -); - -/** - * Address of the SPL Associated Token Account program - * - * (Creates Associated Token Accounts (ATA)) - * - * @see https://solscan.io/account/ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL - */ -export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey( - "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" -); - /** * Storage of a token ATA * @@ -156,8 +135,6 @@ export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey( */ const JUPITER_REFERRAL_ATA_ACCOUNT_SIZE_BYTES = 165; -const SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES = 165; - let debug: (context: string, message: string, ...args: any[]) => void; if (DEBUG) { debug = (context: string, message: string, ...args: any[]): void => { @@ -189,137 +166,6 @@ if (DEBUG) { // Jupiter API Tokens -/** - * curl -sL https://tokens.jup.ag/tokens?tags=verified | jq -C | less -N - */ -type JupiterTokenInfo = { - address: string; - name: string; - symbol: string; - decimals: string; -}; - -// Jupiter API Quote - -/** - * see https://station.jup.ag/api-v6/get-quote - * - * ```sh - * curl -sL -H 'Accept: application/json' 'https://quote-api.jup.ag/v6/quote?inputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&outputMint=So11111111111111111111111111111111111111112&amount=5' - * ``` - */ -type JupiterQuoteResponse = { - /** @example "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" */ - inputMint: string; - /** @example "5" */ - inAmount: string; - /** @example "So11111111111111111111111111111111111111112" */ - outputMint: string; - /** @example "35" */ - outAmount: string; - /** @example "35" */ - otherAmountThreshold: string; - /** @example "ExactIn" */ - swapMode: string; - /** @example 50 */ - slippageBps: number; - /** @example {"amount":"1","feeBps":1} */ - platformFee: null | { - /** @example '1' */ - amount: string; - /** @example 1 */ - feeBps: number; - }; - /** @example "0" */ - priceImpactPct: string; - routePlan: { - swapInfo: { - /** @example "5URw47pYHN9heEQFKtUFeHzTskHwN78bBvKefV5C98fe" */ - ammKey: string; - /** @example "Oasis" */ - label: string; - /** @example "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" */ - inputMint: string; - /** @example "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" */ - outputMint: string; - /** @example "5" */ - inAmount: string; - /** @e xample "28679" */ - outAmount: string; - /** @exampl e "115" */ - feeAmount: string; - /** @example "DezXAZ8z7Pn rnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" */ - feeMint: string; - }; - /** @example 100 */ - percent: number; - }[]; - /** @example 284606533 */ - contextSlot: number; - /** @example 0.743937514 */ - timeTaken: number; -}; - -// Jupiter API Swap - -/** - * @see https://station.jup.ag/api-v6/post-swap - * - * HTTP request JSON body to request a Swap transaction for a given quote - */ -type JupiterSwapParams = { - userPublicKey: string; - /** Default: true */ - wrapAndUnwrapSol?: boolean; - useSharedAccounts?: boolean; - /** Referral address */ - feeAccount?: string; - /** Public key used to track transactions */ - trackingAccount?: string; - /** Integer */ - computeUnitPriceMicroLamports?: number; - prioritizationFeeLamports?: number; - /** Default: false */ - asLegacyTransaction?: boolean; - /** Default: false */ - useTokenLedger?: boolean; - /** Public key of key of token receiver. Default: user's own ATA. */ - destinationTokenAccount?: string; - /** - * Simulate the swap to get the compute units (like gas in the EVM) & - * set in ComputeBudget's compute unit limit. - * - * Default: false - */ - dynamicComputeUnitLimit?: boolean; - /** Do not do RPC calls to check on user's account. Default: false. */ - skipUserAccountRpcCalls?: boolean; - /** Response from the Jupiter API quote endpoint */ - quoteResponse: JupiterQuoteResponse; -}; - -/** - * @see https://station.jup.ag/api-v6/post-swap - */ -type JupiterSwapResponse = { - /** Base64 encoded versioned transaction */ - swapTransaction: string; - /** @example 265642441 */ - lastValidBlockHeight: number; - /** @example 99999 */ - prioritizationFeeLamports?: number; - /** @example 1400000 */ - computeUnitLimit?: number; - prioritizationType?: { - computeBudget?: { - microLamports: 71428; - estimatedMicroLamports: 142856; - }; - }; - dynamicSlippageReport: null; - simulationError: null; -}; - /** * Jupiter is a DEX on Solana * @@ -379,7 +225,6 @@ export class Jupiter extends ProviderClass { /** Intersection of token list & jupiter tokens */ this.toTokens[this.network] ??= {}; for (let i = 0, len = enkryptTokenList.length; i < len; i++) { - // TODO: handle native address const enkryptToken = enkryptTokenList[i]; let isTradeable = false; if (enkryptToken.address === NATIVE_TOKEN_ADDRESS) { @@ -399,7 +244,7 @@ export class Jupiter extends ProviderClass { ...enkryptToken, networkInfo: { name: SupportedNetworkName.Solana, - isAddress: isValidSolanaAddress, + isAddress: isValidSolanaAddressAsync, } satisfies TokenNetworkType, }; } @@ -434,8 +279,9 @@ export class Jupiter extends ProviderClass { const feeConf = FEE_CONFIGS[this.name][meta.walletIdentifier]; - if (!feeConf) + if (!feeConf) { throw new Error("Something went wrong: no fee config for Jupiter swap"); + } const referrerPubkey = new PublicKey(feeConf.referrer); @@ -692,6 +538,8 @@ export class Jupiter extends ProviderClass { to: quote.options.toAddress, serialized: base64SwapTransaction, type: TransactionType.solana, + kind: "versioned", + signed: false, }; debug( @@ -743,12 +591,10 @@ export class Jupiter extends ProviderClass { } if (txResponse.meta == null) { - // TODO: verify that `ConfirmedTransactionMeta` == null means pending return TransactionStatus.pending; } if (txResponse.meta.err != null) { - // TODO: verify that `err` != null means failed return TransactionStatus.failed; } @@ -756,39 +602,6 @@ export class Jupiter extends ProviderClass { } } -/** - * Is the address a valid Solana address? (32 byte base58 string) - * - * @param address hopefully 32 byte base58 string - * @returns true if `address` is a 32 byte base58 string - */ -function isValidSolanaAddress(address: string): Promise { - try { - new PublicKey(address); - return Promise.resolve(true); - } catch (err) { - return Promise.resolve(false); - } -} - -/** - * Does the Solana account exist? - * - * Checks if the account has been created - * - * @param conn Solana connection - * @param address Address to check - * @returns `true` if there's an account at `address` - */ -async function solAccountExists( - conn: Connection, - address: PublicKey -): Promise { - const account = await conn.getAccountInfo(address, "max"); - const exists = account != null; - return exists; -} - /** * Request all verified tokens available on Jupiter swap * @@ -1321,135 +1134,6 @@ function getJupiterReferrerAssociatedTokenAccount( return referrerATAPubkey; } -/** - * Construct a CreateAssociatedTokenAccountIdempotent instruction - * - * @param payer Payer of the initialization fees - * @param associatedToken New associated token account - * @param owner Owner of the new account - * @param mint Token mint account - * @param programId SPL Token program account - * @param associatedTokenProgramId SPL Associated Token program account - * - * @return Instruction to add to a transaction - */ -export function createAssociatedTokenAccountIdempotentInstruction( - payer: PublicKey, - associatedToken: PublicKey, - owner: PublicKey, - mint: PublicKey, - programId = TOKEN_PROGRAM_ID, - associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID -): TransactionInstruction { - return buildAssociatedTokenAccountInstruction( - payer, - associatedToken, - owner, - mint, - Buffer.from([1]), - programId, - associatedTokenProgramId - ); -} - -/** - * Create a transaction instruction that creates the given ATA for the owner and mint. - * - * Does nothing if the mint already exists. - * - * @see https://github.com/solana-labs/solana-program-library/blob/e018a30e751e759e62e17ad01864d4c57d090c26/token/js/src/instructions/associatedTokenAccount.ts#L49 - * @see https://github.com/solana-labs/solana-program-library/blob/e018a30e751e759e62e17ad01864d4c57d090c26/token/js/src/instructions/associatedTokenAccount.ts#L100 - */ -function getCreateAssociatedTokenAccountIdempotentInstruction(params: { - /** Payer of initialization / rent fees */ - payerPubkey: PublicKey; - /** Address of the Associated Token Account of `ownerPubkey` with `mintPubkey` @see `getSPLAssociatedTokenAccountPubkey` */ - ataPubkey: PublicKey; - /** Owner of the new SPL Associated Token Account */ - ownerPubkey: PublicKey; - /** - * SPL token address - * - * @example new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v') // USDC - * @example new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB') // USDT - * @example new PublicKey('So11111111111111111111111111111111111111112') // Wrapped SOL - * - * USDC @see https://solscan.io/token/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v - * USDT @see https://solscan.io/token/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB - * Wrapped SOL @see https://solscan.io/token/So11111111111111111111111111111111111111112 - */ - mintPubkey: PublicKey; - /** - * @example new PublicKey('11111111111111111111111111111111') - */ - systemProgramId: PublicKey; - /** - * SPL Token Program or 2022 SPL token program - * - * @example new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA') - * @example new PublicKey('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb') - */ - tokenProgramId: PublicKey; - /** - * SPL Associated Token Program account, - * - * @example new PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL') - * - * @see https://solscan.io/account/ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL - */ - associatedTokenProgramId: PublicKey; -}): TransactionInstruction { - const { - payerPubkey, - ataPubkey, - ownerPubkey, - mintPubkey, - systemProgramId, - tokenProgramId, - associatedTokenProgramId, - } = params; - - const keys = [ - { pubkey: payerPubkey, isSigner: true, isWritable: true }, - { pubkey: ataPubkey, isSigner: false, isWritable: true }, - { pubkey: ownerPubkey, isSigner: false, isWritable: false }, - { pubkey: mintPubkey, isSigner: false, isWritable: false }, - { pubkey: systemProgramId, isSigner: false, isWritable: false }, - { pubkey: tokenProgramId, isSigner: false, isWritable: false }, - ]; - - return new TransactionInstruction({ - keys, - programId: associatedTokenProgramId, - data: Buffer.from([1]), - }); -} - -function buildAssociatedTokenAccountInstruction( - payer: PublicKey, - associatedToken: PublicKey, - owner: PublicKey, - mint: PublicKey, - instructionData: Buffer, - programId = TOKEN_PROGRAM_ID, - associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID -): TransactionInstruction { - const keys = [ - { pubkey: payer, isSigner: true, isWritable: true }, - { pubkey: associatedToken, isSigner: false, isWritable: true }, - { pubkey: owner, isSigner: false, isWritable: false }, - { pubkey: mint, isSigner: false, isWritable: false }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - { pubkey: programId, isSigner: false, isWritable: false }, - ]; - - return new TransactionInstruction({ - keys, - programId: associatedTokenProgramId, - data: instructionData, - }); -} - /** * Links: * - [Jupiter Referral GitHub](https://github.com/TeamRaccoons/referral) @@ -1538,151 +1222,3 @@ function getJupiterInitialiseReferralTokenAccountInstruction(params: { return instruction; } - -/** - * Insert new instructions at the start of a transaction, after compute budget and compute limit instructions - */ -async function insertInstructionsAtStartOfTransaction( - conn: Connection, - tx: VersionedTransaction, - instructions: TransactionInstruction[] -): Promise { - if (instructions.length === 0) return tx; - - // Now we need to: - // 1. Decompile the transaction - // 2. Put our instructions in it - // 3. Recompile it - - // Request lookup accounts so that we can decompile the message - // - // Lookup accounts store arrays of addresses. These accounts let compiled transaction messages reference indexes - // in the lookup account rather than by the pubkey, saving lots of space (~4 byte integer index vs 32 byte pubkey). - // - // To decompile a message we first need all the lookup accounts that it includes so that we can get the - // the addresses that our message needs. - // - // We can also use the lookup accounts when re-compiling the transaction. - const lookupAccountsCount = tx.message.addressTableLookups.length; - const addressLookupTableAccounts: AddressLookupTableAccount[] = new Array( - lookupAccountsCount - ); - - for (let i = 0; i < lookupAccountsCount; i++) { - const lookup = tx.message.addressTableLookups[i]; - const result = await conn.getAddressLookupTable(lookup.accountKey); - const addressLookupTableAccount = result.value; - if (addressLookupTableAccount == null) - throw new Error( - `Failed to get address lookup table for ${lookup.accountKey}` - ); - debug( - "insertInstructionsAtStartOfTransaction", - `Fetching lookup account ${i + 1}. ${lookup.accountKey.toBase58()}` - ); - addressLookupTableAccounts[i] = addressLookupTableAccount; - } - - // Decompile the transaction message so we can modify it - const decompiledTransactionMessage = TransactionMessage.decompile( - tx.message, - { addressLookupTableAccounts } - ); - - // Insert our instruction to create an account directly after compute budget - // program instructions that compute limits and priority fees - const computeBudgetProgramAddr = ComputeBudgetProgram.programId.toBase58(); - let inserted = false; - instructionLoop: for ( - let i = 0, len = decompiledTransactionMessage.instructions.length; - i < len; - i++ - ) { - // As soon as we hit a non compute budget program, insert our instruction to create the account - const existingInstruction = decompiledTransactionMessage.instructions[i]; - switch (existingInstruction.programId.toBase58()) { - case computeBudgetProgramAddr: - // do nothing - break; - default: { - // insert our instruction here & continue - debug( - "insertInstructionsAtStartOfTransaction", - `Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` - ); - inserted = true; - decompiledTransactionMessage.instructions.splice(i, 0, ...instructions); - break instructionLoop; - } - } - } - - if (!inserted) { - // If there were no compute budget instructions then just add it at the start - debug( - "insertInstructionsAtStartOfTransaction", - `Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` - ); - for (let len = instructions.length - 1, i = len - 1; i >= 0; i--) { - decompiledTransactionMessage.instructions.unshift(instructions[i]); - } - } - - // Switch to using this modified transaction - debug("insertInstructionsAtStartOfTransaction", `Re-compiling transaction`); - const modifiedTx = new VersionedTransaction( - decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts) - ); - - return modifiedTx; -} - -/** - * Get the SPL token program that owns (/created) the given mint (token). Either the SPL token program - * or the 2022 SPL token program - * - * @returns Pubkey of the SPL token token owner program - * @throws If the account does not exist or if it's not owned by one of the SPL token programs - */ -async function getTokenProgramOfMint( - conn: Connection, - mint: PublicKey -): Promise { - debug("getTokenProgramOfMint", `Checking mint account of ${mint.toBase58()}`); - const srcMintAcc = await conn.getAccountInfo(mint); - - if (srcMintAcc == null) { - throw new Error( - `There is no SPL token account at address ${mint.toBase58()}` - ); - } - - switch (srcMintAcc.owner.toBase58()) { - case TOKEN_PROGRAM_ID.toBase58(): - case TOKEN_2022_PROGRAM_ID.toBase58(): - return srcMintAcc.owner; - default: - throw new Error( - `Mint address is not a valid SPL token, must either have owner` + - ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + - ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` - ); - } -} - -/** - * Get the SPL token ATA pubkey for a wallet with a mint - */ -function getSPLAssociatedTokenAccountPubkey( - wallet: PublicKey, - mint: PublicKey, - /** Either the SPL token program or the 2022 SPL token program */ - tokenProgramId: PublicKey -): PublicKey { - const SEED = [wallet.toBuffer(), tokenProgramId.toBuffer(), mint.toBuffer()]; - const [associatedTokenAddress] = PublicKey.findProgramAddressSync( - SEED, - ASSOCIATED_TOKEN_PROGRAM_ID - ); - return associatedTokenAddress; -} diff --git a/packages/swap/src/providers/jupiter/types.ts b/packages/swap/src/providers/jupiter/types.ts new file mode 100644 index 000000000..6848441fb --- /dev/null +++ b/packages/swap/src/providers/jupiter/types.ts @@ -0,0 +1,130 @@ +/** + * curl -sL https://tokens.jup.ag/tokens?tags=verified | jq -C | less -N + */ +export type JupiterTokenInfo = { + address: string; + name: string; + symbol: string; + decimals: string; +}; + +// Jupiter API Quote + +/** + * see https://station.jup.ag/api-v6/get-quote + * + * ```sh + * curl -sL -H 'Accept: application/json' 'https://quote-api.jup.ag/v6/quote?inputMint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&outputMint=So11111111111111111111111111111111111111112&amount=5' + * ``` + */ +export type JupiterQuoteResponse = { + /** @example "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" */ + inputMint: string; + /** @example "5" */ + inAmount: string; + /** @example "So11111111111111111111111111111111111111112" */ + outputMint: string; + /** @example "35" */ + outAmount: string; + /** @example "35" */ + otherAmountThreshold: string; + /** @example "ExactIn" */ + swapMode: string; + /** @example 50 */ + slippageBps: number; + /** @example {"amount":"1","feeBps":1} */ + platformFee: null | { + /** @example '1' */ + amount: string; + /** @example 1 */ + feeBps: number; + }; + /** @example "0" */ + priceImpactPct: string; + routePlan: { + swapInfo: { + /** @example "5URw47pYHN9heEQFKtUFeHzTskHwN78bBvKefV5C98fe" */ + ammKey: string; + /** @example "Oasis" */ + label: string; + /** @example "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" */ + inputMint: string; + /** @example "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" */ + outputMint: string; + /** @example "5" */ + inAmount: string; + /** @e xample "28679" */ + outAmount: string; + /** @exampl e "115" */ + feeAmount: string; + /** @example "DezXAZ8z7Pn rnRJjz3wXBoRgixCa6xjnB7YaB1pPB263" */ + feeMint: string; + }; + /** @example 100 */ + percent: number; + }[]; + /** @example 284606533 */ + contextSlot: number; + /** @example 0.743937514 */ + timeTaken: number; +}; + +// Jupiter API Swap + +/** + * @see https://station.jup.ag/api-v6/post-swap + * + * HTTP request JSON body to request a Swap transaction for a given quote + */ +export type JupiterSwapParams = { + userPublicKey: string; + /** Default: true */ + wrapAndUnwrapSol?: boolean; + useSharedAccounts?: boolean; + /** Referral address */ + feeAccount?: string; + /** Public key used to track transactions */ + trackingAccount?: string; + /** Integer */ + computeUnitPriceMicroLamports?: number; + prioritizationFeeLamports?: number; + /** Default: false */ + asLegacyTransaction?: boolean; + /** Default: false */ + useTokenLedger?: boolean; + /** Public key of key of token receiver. Default: user's own ATA. */ + destinationTokenAccount?: string; + /** + * Simulate the swap to get the compute units (like gas in the EVM) & + * set in ComputeBudget's compute unit limit. + * + * Default: false + */ + dynamicComputeUnitLimit?: boolean; + /** Do not do RPC calls to check on user's account. Default: false. */ + skipUserAccountRpcCalls?: boolean; + /** Response from the Jupiter API quote endpoint */ + quoteResponse: JupiterQuoteResponse; +}; + +/** + * @see https://station.jup.ag/api-v6/post-swap + */ +export type JupiterSwapResponse = { + /** Base64 encoded versioned transaction */ + swapTransaction: string; + /** @example 265642441 */ + lastValidBlockHeight: number; + /** @example 99999 */ + prioritizationFeeLamports?: number; + /** @example 1400000 */ + computeUnitLimit?: number; + prioritizationType?: { + computeBudget?: { + microLamports: 71428; + estimatedMicroLamports: 142856; + }; + }; + dynamicSlippageReport: null; + simulationError: null; +}; diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index 69cb67244..95f9119d3 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -10,8 +10,16 @@ import { RoutingResultType, TransactionType as RangoTransactionType, } from "rango-sdk-basic"; -import { Connection, VersionedTransaction } from "@solana/web3.js"; -import { extractComputeBudget } from "../../utils/solana"; +import { + Connection, + PublicKey, + TransactionInstruction, + TransactionMessage, + VersionedTransaction, + Transaction as SolanaLegacyTransaction, +} from "@solana/web3.js"; +import bs58 from "bs58"; +import { extractComputeBudget, isValidSolanaAddress } from "../../utils/solana"; import { EVMTransaction, getQuoteOptions, @@ -24,6 +32,7 @@ import { ProviderSwapResponse, ProviderToTokenResponse, QuoteMetaOptions, + SolanaTransaction, StatusOptions, StatusOptionsResponse, SupportedNetworkName, @@ -43,11 +52,12 @@ import { TOKEN_AMOUNT_INFINITY_AND_BEYOND } from "../../utils/approvals"; import estimateEVMGasList from "../../common/estimateGasList"; import { isEVMAddress } from "../../utils/common"; +/** Enables debug logging in this file */ +const DEBUG = false; + const RANGO_PUBLIC_API_KEY = "ee7da377-0ed8-4d42-aaf9-fa978a32b18d"; const rangoClient = new RangoClient(RANGO_PUBLIC_API_KEY); -const DEBUG = false; - let debug: (context: string, message: string, ...args: any[]) => void; if (DEBUG) { debug = (context: string, message: string, ...args: any[]): void => { @@ -260,13 +270,16 @@ class Rango extends ProviderClass { rangoToNetwork[supportedNetworks[net].name] = net as unknown as SupportedNetworkName; }); + tokens?.forEach((t) => { + // Unrecognised network if (!supportedCRangoNames.includes(t.blockchain)) return; - if (!this.toTokens[rangoToNetwork[t.blockchain]]) - this.toTokens[rangoToNetwork[t.blockchain]] = {}; - this.toTokens[rangoToNetwork[t.blockchain]][ - t.address || NATIVE_TOKEN_ADDRESS - ] = { + + const network = rangoToNetwork[t.blockchain]; + + this.toTokens[network] ??= {}; + + this.toTokens[network][t.address || NATIVE_TOKEN_ADDRESS] = { ...t, name: t.name || t.symbol, logoURI: t.image, @@ -274,8 +287,8 @@ class Rango extends ProviderClass { price: t.usdPrice, networkInfo: { name: rangoToNetwork[t.blockchain], - isAddress: (address: string) => - Promise.resolve(isEVMAddress(address)), + // eslint-disable-next-line no-use-before-define + isAddress: getIsAddressAsync(network), }, }; }); @@ -478,59 +491,6 @@ class Rango extends ProviderClass { let networkTransactions: RangoNetworkedTransactions; switch (rangoSwapResponse.tx?.type) { - // Process Rango swap Solana transaction - case RangoTransactionType.SOLANA: { - debug("getRangoSwap", "Received Solana transaction"); - - let versionedTransaction: VersionedTransaction; - if (rangoSwapResponse.tx.serializedMessage == null) { - // TODO: When how and why does this happen? - debug( - "getRangoSwap", - "Dropping rango swap transaction: Rango SDK returned a Solana transaction without any serializedMessage" - ); - return null; - } - switch (rangoSwapResponse.tx.txType) { - case "VERSIONED": { - debug("getRangoSwap", `Deserializing Solana versioned transaction`); - versionedTransaction = VersionedTransaction.deserialize( - new Uint8Array(rangoSwapResponse.tx.serializedMessage) - ); - break; - } - case "LEGACY": { - debug("getRangoSwap", `Deserializing Solana legacy transaction`); - // TODO: does this work? versionedTransaction.version has type `'legacy' | 0` so maybe? - versionedTransaction = VersionedTransaction.deserialize( - new Uint8Array(rangoSwapResponse.tx.serializedMessage) - ); - break; - } - default: - rangoSwapResponse.tx.txType satisfies never; - throw new Error( - `Unhandled Rango Solana transaction type: ${rangoSwapResponse.tx.txType}` - ); - } - - networkTransactions = { - type: NetworkType.Solana, - transactions: [ - { - type: TransactionType.solana, - from: rangoSwapResponse.tx.from, - // TODO: is this right? - to: options.toToken.address, - serialized: Buffer.from( - versionedTransaction.serialize() - ).toString("base64"), - }, - ], - }; - break; - } - // Process Rango swap EVM transaction case RangoTransactionType.EVM: { debug("getRangoSwap", `Received EVM transaction`); @@ -580,6 +540,277 @@ class Rango extends ProviderClass { break; } + // Process Rango swap Solana transaction + case RangoTransactionType.SOLANA: { + debug("getRangoSwap", "Received Solana transaction"); + + let enkSolTx: SolanaTransaction; + + switch (rangoSwapResponse.tx.txType) { + case "VERSIONED": { + if (rangoSwapResponse.tx.serializedMessage) { + debug( + "getRangoSwap", + `Deserializing Solana versioned unsigned transaction` + ); + + // Versioned transaction, not signed (we can modify it) + // > When serialized message appears, there is no need for other fields and you just sign and send it + // @see (2024-09-17) https://docs.rango.exchange/api-integration/main-api-multi-step/sample-transactions#solana-sample-transaction-test + + // Sanity checks + if (rangoSwapResponse.tx.instructions.length) { + console.warn( + "Expected Rango Solana unsigned versioned transaction NOT to have instructions but instructions array is not empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (rangoSwapResponse.tx.signatures.length) { + console.warn( + "Expected Rango Solana unsigned versioned transaction NOT to have signatures but signatures array is not empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (rangoSwapResponse.tx.recentBlockhash) { + console.warn( + "Expected Rango Solana unsigned versioned transaction NOT to have a recent blockhash but recentBlockhash is defined", + { ...rangoSwapResponse.tx } + ); + return null; + } + + const vtx = VersionedTransaction.deserialize( + new Uint8Array(rangoSwapResponse.tx.serializedMessage) + ); + + enkSolTx = { + type: TransactionType.solana, + from: rangoSwapResponse.tx.from, + to: options.toToken.address, + kind: "versioned", + signed: false, + serialized: Buffer.from(vtx.serialize()).toString("base64"), + }; + } else { + debug( + "getRangoSwap", + `Deserializing Solana versioned signed transaction` + ); + + // Versioned transaction signed by Rango + // We are unable to alter this transaction + // Since the recent block hash gets signed too, this transaction will need to be consumed quickly + + // Sanity checks + if (!rangoSwapResponse.tx.instructions.length) { + console.warn( + "Expected Rango Solana signed versioned transaction to have instructions but instructions array is empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (!rangoSwapResponse.tx.signatures.length) { + console.warn( + "Expected Rango Solana signed versioned transaction to have signatures but signatures array is empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (!rangoSwapResponse.tx.recentBlockhash) { + console.warn( + "Expected Rango Solana signed versioned transaction to have a recent blockhash but recentBlockhash is not defined", + { ...rangoSwapResponse.tx } + ); + return null; + } + + const vtx = new VersionedTransaction( + new TransactionMessage({ + instructions: rangoSwapResponse.tx.instructions.map( + (instr) => + new TransactionInstruction({ + keys: instr.keys.map( + ({ pubkey, isSigner, isWritable }) => ({ + pubkey: new PublicKey(pubkey), + isSigner, + isWritable, + }) + ), + // For some reason Rango returns instruction data as signed 8 bit array + // so we convert to unsigned + data: Buffer.from( + instr.data.map((int8) => (int8 + 256) % 256) + ), + programId: new PublicKey(instr.programId), + }) + ), + recentBlockhash: rangoSwapResponse.tx.recentBlockhash, + payerKey: new PublicKey(options.fromAddress), + }).compileToV0Message(), + rangoSwapResponse.tx.signatures.map( + // For some reason Rango returns signatures as a signed 8 bit array + // so we convert to unsigned + ({ signature }) => + new Uint8Array(signature.map((int8) => (int8 + 256) % 256)) + ) + ); + + enkSolTx = { + type: TransactionType.solana, + from: rangoSwapResponse.tx.from, + to: options.toToken.address, + kind: "versioned", + signed: true, + serialized: Buffer.from(vtx.serialize()).toString("base64"), + }; + } + break; + } + case "LEGACY": { + if (rangoSwapResponse.tx.serializedMessage) { + debug( + "getRangoSwap", + `Deserializing Solana legacy unsigned transaction` + ); + + // Legacy transaction, not signed (we can modify it) + // > When serialized message appears, there is no need for other fields and you just sign and send it + // @see (2024-09-17) https://docs.rango.exchange/api-integration/main-api-multi-step/sample-transactions#solana-sample-transaction-test + + // Sanity checks + if (rangoSwapResponse.tx.instructions.length) { + console.warn( + "Expected Rango Solana unsigned legacy transaction NOT to have instructions but instructions array is not empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (rangoSwapResponse.tx.signatures.length) { + console.warn( + "Expected Rango Solana unsigned legacy transaction NOT to have signatures but signatures array is not empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (rangoSwapResponse.tx.recentBlockhash) { + console.warn( + "Expected Rango Solana unsigned legacy transaction NOT to have a recent blockhash but recentBlockhash is defined", + { ...rangoSwapResponse.tx } + ); + return null; + } + const ltx = SolanaLegacyTransaction.from( + rangoSwapResponse.tx.serializedMessage + ); + + enkSolTx = { + type: TransactionType.solana, + from: rangoSwapResponse.tx.from, + to: options.toToken.address, + kind: "legacy", + signed: false, + serialized: ltx.serialize().toString("base64"), + }; + } else { + debug( + "getRangoSwap", + `Deserializing Solana legacy signed transaction` + ); + + // Legacy transaction signed by Rango + // We are unable to alter this transaction + // Since the recent block hash gets signed too, this transaction will need to be consumed quickly + + // Sanity checks + if (!rangoSwapResponse.tx.instructions.length) { + console.warn( + "Expected Rango Solana signed legacy transaction to have instructions but instructions array is empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (!rangoSwapResponse.tx.signatures.length) { + console.warn( + "Expected Rango Solana signed legacy transaction to have signatures but signatures array is empty", + { ...rangoSwapResponse.tx } + ); + return null; + } + if (!rangoSwapResponse.tx.recentBlockhash) { + console.warn( + "Expected Rango Solana signed legacy transaction to have a recent blockhash but recentBlockhash is not defined", + { ...rangoSwapResponse.tx } + ); + return null; + } + + console.log("===== 1"); + console.log({ ...rangoSwapResponse }); + const ltx = SolanaLegacyTransaction.populate( + new TransactionMessage({ + instructions: rangoSwapResponse.tx.instructions.map( + (instr) => + new TransactionInstruction({ + keys: instr.keys.map( + ({ pubkey, isSigner, isWritable }) => ({ + pubkey: new PublicKey(pubkey), + isSigner, + isWritable, + }) + ), + // For some reason Rango returns instruction data as signed 8 bit array + // so we convert to unsigned + data: Buffer.from( + instr.data.map((int8) => (int8 + 256) % 256) + ), + programId: new PublicKey(instr.programId), + }) + ), + recentBlockhash: rangoSwapResponse.tx.recentBlockhash, + payerKey: new PublicKey(options.fromAddress), + }).compileToLegacyMessage(), + rangoSwapResponse.tx.signatures.map(({ signature }) => + // For some reason Rango returns signatures as a signed 8 bit array + // so we convert to unsigned + bs58.encode( + Buffer.from(signature.map((int8) => (int8 + 256) % 256)) + ) + ) + ); + console.log("===== 2"); + + enkSolTx = { + type: TransactionType.solana, + from: rangoSwapResponse.tx.from, + to: options.toToken.address, + kind: "legacy", + signed: true, + // We'll provide our own signature later + serialized: ltx + .serialize({ requireAllSignatures: false }) + .toString("base64"), + }; + + console.log("===== 3"); + } + break; + } + default: + rangoSwapResponse.tx.txType satisfies never; + throw new Error( + `Unhandled Rango Solana transaction type: ${rangoSwapResponse.tx.txType}` + ); + } + + networkTransactions = { + type: NetworkType.Solana, + transactions: [enkSolTx], + }; + break; + } + case undefined: case null: { throw new Error(`Rango did not return a transaction type`); @@ -791,4 +1022,22 @@ class Rango extends ProviderClass { } } +async function isEVMAddressAsync(address: string): Promise { + return isEVMAddress(address); +} +async function isSolanaAddressAsync(address: string): Promise { + return isValidSolanaAddress(address); +} + +function getIsAddressAsync( + network: SupportedNetworkName +): (address: string) => Promise { + switch (network) { + case SupportedNetworkName.Solana: + return isSolanaAddressAsync; + default: + return isEVMAddressAsync; + } +} + export default Rango; diff --git a/packages/swap/src/types/index.ts b/packages/swap/src/types/index.ts index 8f2a71a76..69ece51a1 100644 --- a/packages/swap/src/types/index.ts +++ b/packages/swap/src/types/index.ts @@ -165,8 +165,11 @@ export interface SolanaTransaction { from: string; /** TODO: document what this is for, I think it's just for UI */ to: string; + kind: "legacy" | "versioned"; /** base64 serialized unsigned solana transaction */ serialized: string; + /** If the transaction is signed (by a third party like Rango) then we can't change it's recentblock hash */ + signed: boolean; type: TransactionType.solana; } diff --git a/packages/swap/src/utils/solana.ts b/packages/swap/src/utils/solana.ts index 0dc8d6b7c..183924da0 100644 --- a/packages/swap/src/utils/solana.ts +++ b/packages/swap/src/utils/solana.ts @@ -1,11 +1,54 @@ import { AccountMeta, + AddressLookupTableAccount, ComputeBudgetInstruction, ComputeBudgetProgram, + Connection, + PublicKey, + SystemProgram, TransactionInstruction, + TransactionMessage, VersionedTransaction, } from "@solana/web3.js"; +/** + * Address of the SPL Token program + * + * @see https://solscan.io/account/TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA + */ +export const TOKEN_PROGRAM_ID = new PublicKey( + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" +); + +/** + * Address of the SPL Token 2022 program + * + * @see https://solscan.io/account/TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb + */ +export const TOKEN_2022_PROGRAM_ID = new PublicKey( + "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb" +); + +/** + * Address of the SPL Associated Token Account program + * + * (Creates Associated Token Accounts (ATA)) + * + * @see https://solscan.io/account/ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL + */ +export const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey( + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" +); + +export const SPL_TOKEN_ATA_ACCOUNT_SIZE_BYTES = 165; + +/** + * Wrapped SOL address + * @see https://solscan.io/token/So11111111111111111111111111111111111111112 + */ +export const WRAPPED_SOL_ADDRESS = + "So11111111111111111111111111111111111111112"; + /** * @see https://solana.com/docs/core/fees#prioritization-fees * @@ -18,6 +61,8 @@ export function extractComputeBudget( tx: VersionedTransaction ): undefined | number { // extract the compute budget + + /** Compute units */ let computeBudget: undefined | number; // eslint-disable-next-line no-restricted-syntax, no-labels @@ -62,6 +107,333 @@ export function extractComputeBudget( } } - // (default of 200_000 from Google) - return computeBudget ?? 200_000; + /** + * @see https://solanacookbook.com/references/basic-transactions.html#how-to-change-compute-budget-fee-priority-for-a-transaction + * + * Default is minimum of 14m and 200_000 * instruction count + */ + return ( + computeBudget ?? + Math.min(1_400_000, 200_000 * tx.message.compiledInstructions.length) + ); +} + +/** + * Insert new instructions at the start of a transaction, after compute budget and compute limit instructions + */ +export async function insertInstructionsAtStartOfTransaction( + conn: Connection, + tx: VersionedTransaction, + instructions: TransactionInstruction[] +): Promise { + if (instructions.length === 0) return tx; + + // Now we need to: + // 1. Decompile the transaction + // 2. Put our instructions in it + // 3. Recompile it + + // Request lookup accounts so that we can decompile the message + // + // Lookup accounts store arrays of addresses. These accounts let compiled transaction messages reference indexes + // in the lookup account rather than by the pubkey, saving lots of space (~4 byte integer index vs 32 byte pubkey). + // + // To decompile a message we first need all the lookup accounts that it includes so that we can get the + // the addresses that our message needs. + // + // We can also use the lookup accounts when re-compiling the transaction. + const lookupAccountsCount = tx.message.addressTableLookups.length; + const addressLookupTableAccounts: AddressLookupTableAccount[] = new Array( + lookupAccountsCount + ); + + for (let i = 0; i < lookupAccountsCount; i++) { + const lookup = tx.message.addressTableLookups[i]; + const result = await conn.getAddressLookupTable(lookup.accountKey); + const addressLookupTableAccount = result.value; + if (addressLookupTableAccount == null) + throw new Error( + `Failed to get address lookup table for ${lookup.accountKey}` + ); + // debug( + // "insertInstructionsAtStartOfTransaction", + // `Fetching lookup account ${i + 1}. ${lookup.accountKey.toBase58()}` + // ); + addressLookupTableAccounts[i] = addressLookupTableAccount; + } + + // Decompile the transaction message so we can modify it + const decompiledTransactionMessage = TransactionMessage.decompile( + tx.message, + { addressLookupTableAccounts } + ); + + // Insert our instruction to create an account directly after compute budget + // program instructions that compute limits and priority fees + const computeBudgetProgramAddr = ComputeBudgetProgram.programId.toBase58(); + let inserted = false; + // eslint-disable-next-line no-restricted-syntax, no-labels + instructionLoop: for ( + let i = 0, len = decompiledTransactionMessage.instructions.length; + i < len; + i++ + ) { + // As soon as we hit a non compute budget program, insert our instruction to create the account + const existingInstruction = decompiledTransactionMessage.instructions[i]; + switch (existingInstruction.programId.toBase58()) { + case computeBudgetProgramAddr: + // do nothing + break; + default: { + // insert our instruction here & continue + // debug( + // "insertInstructionsAtStartOfTransaction", + // `Inserting instruction to create an ATA account for Jupiter referrer with mint at instruction index ${i}` + // ); + inserted = true; + decompiledTransactionMessage.instructions.splice(i, 0, ...instructions); + // eslint-disable-next-line no-labels + break instructionLoop; + } + } + } + + if (!inserted) { + // If there were no compute budget instructions then just add it at the start + // debug( + // "insertInstructionsAtStartOfTransaction", + // `Inserting instruction to create an ATA account for Jupiter referrer with mint at start of instructions` + // ); + for (let len = instructions.length - 1, i = len - 1; i >= 0; i--) { + decompiledTransactionMessage.instructions.unshift(instructions[i]); + } + } + + // Switch to using this modified transaction + // debug("insertInstructionsAtStartOfTransaction", `Re-compiling transaction`); + const modifiedTx = new VersionedTransaction( + decompiledTransactionMessage.compileToV0Message(addressLookupTableAccounts) + ); + + return modifiedTx; +} + +/** + * Get the SPL token program that owns (/created) the given mint (token). Either the SPL token program + * or the 2022 SPL token program + * + * @returns Pubkey of the SPL token token owner program + * @throws If the account does not exist or if it's not owned by one of the SPL token programs + */ +export async function getTokenProgramOfMint( + conn: Connection, + mint: PublicKey +): Promise { + // debug("getTokenProgramOfMint", `Checking mint account of ${mint.toBase58()}`); + const srcMintAcc = await conn.getAccountInfo(mint); + + if (srcMintAcc == null) { + throw new Error( + `There is no SPL token account at address ${mint.toBase58()}` + ); + } + + switch (srcMintAcc.owner.toBase58()) { + case TOKEN_PROGRAM_ID.toBase58(): + case TOKEN_2022_PROGRAM_ID.toBase58(): + return srcMintAcc.owner; + default: + throw new Error( + `Mint address is not a valid SPL token, must either have owner` + + ` TOKEN_PROGRAM_ID (${TOKEN_PROGRAM_ID.toBase58()})` + + ` or TOKEN_2022_PROGRAM_ID (${TOKEN_2022_PROGRAM_ID.toBase58()})` + ); + } +} + +/** + * Get the SPL token ATA pubkey for a wallet with a mint + */ +export function getSPLAssociatedTokenAccountPubkey( + wallet: PublicKey, + mint: PublicKey, + /** Either the SPL token program or the 2022 SPL token program */ + tokenProgramId: PublicKey +): PublicKey { + const SEED = [wallet.toBuffer(), tokenProgramId.toBuffer(), mint.toBuffer()]; + const [associatedTokenAddress] = PublicKey.findProgramAddressSync( + SEED, + ASSOCIATED_TOKEN_PROGRAM_ID + ); + return associatedTokenAddress; +} + +/** + * Construct a CreateAssociatedTokenAccountIdempotent instruction + * + * @param payer Payer of the initialization fees + * @param associatedToken New associated token account + * @param owner Owner of the new account + * @param mint Token mint account + * @param programId SPL Token program account + * @param associatedTokenProgramId SPL Associated Token program account + * + * @return Instruction to add to a transaction + */ +export function createAssociatedTokenAccountIdempotentInstruction( + payer: PublicKey, + associatedToken: PublicKey, + owner: PublicKey, + mint: PublicKey, + programId = TOKEN_PROGRAM_ID, + associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID +): TransactionInstruction { + // eslint-disable-next-line no-use-before-define + return buildAssociatedTokenAccountInstruction( + payer, + associatedToken, + owner, + mint, + Buffer.from([1]), + programId, + associatedTokenProgramId + ); +} + +export function buildAssociatedTokenAccountInstruction( + payer: PublicKey, + associatedToken: PublicKey, + owner: PublicKey, + mint: PublicKey, + instructionData: Buffer, + programId = TOKEN_PROGRAM_ID, + associatedTokenProgramId = ASSOCIATED_TOKEN_PROGRAM_ID +): TransactionInstruction { + const keys = [ + { pubkey: payer, isSigner: true, isWritable: true }, + { pubkey: associatedToken, isSigner: false, isWritable: true }, + { pubkey: owner, isSigner: false, isWritable: false }, + { pubkey: mint, isSigner: false, isWritable: false }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + { pubkey: programId, isSigner: false, isWritable: false }, + ]; + + return new TransactionInstruction({ + keys, + programId: associatedTokenProgramId, + data: instructionData, + }); +} + +/** + * Create a transaction instruction that creates the given ATA for the owner and mint. + * + * Does nothing if the mint already exists. + * + * @see https://github.com/solana-labs/solana-program-library/blob/e018a30e751e759e62e17ad01864d4c57d090c26/token/js/src/instructions/associatedTokenAccount.ts#L49 + * @see https://github.com/solana-labs/solana-program-library/blob/e018a30e751e759e62e17ad01864d4c57d090c26/token/js/src/instructions/associatedTokenAccount.ts#L100 + */ +export function getCreateAssociatedTokenAccountIdempotentInstruction(params: { + /** Payer of initialization / rent fees */ + payerPubkey: PublicKey; + /** Address of the Associated Token Account of `ownerPubkey` with `mintPubkey` @see `getSPLAssociatedTokenAccountPubkey` */ + ataPubkey: PublicKey; + /** Owner of the new SPL Associated Token Account */ + ownerPubkey: PublicKey; + /** + * SPL token address + * + * @example new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v') // USDC + * @example new PublicKey('Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB') // USDT + * @example new PublicKey('So11111111111111111111111111111111111111112') // Wrapped SOL + * + * USDC @see https://solscan.io/token/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v + * USDT @see https://solscan.io/token/Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB + * Wrapped SOL @see https://solscan.io/token/So11111111111111111111111111111111111111112 + */ + mintPubkey: PublicKey; + /** + * @example new PublicKey('11111111111111111111111111111111') + */ + systemProgramId: PublicKey; + /** + * SPL Token Program or 2022 SPL token program + * + * @example new PublicKey('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA') + * @example new PublicKey('TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb') + */ + tokenProgramId: PublicKey; + /** + * SPL Associated Token Program account, + * + * @example new PublicKey('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL') + * + * @see https://solscan.io/account/ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL + */ + associatedTokenProgramId: PublicKey; +}): TransactionInstruction { + const { + payerPubkey, + ataPubkey, + ownerPubkey, + mintPubkey, + systemProgramId, + tokenProgramId, + associatedTokenProgramId, + } = params; + + const keys = [ + { pubkey: payerPubkey, isSigner: true, isWritable: true }, + { pubkey: ataPubkey, isSigner: false, isWritable: true }, + { pubkey: ownerPubkey, isSigner: false, isWritable: false }, + { pubkey: mintPubkey, isSigner: false, isWritable: false }, + { pubkey: systemProgramId, isSigner: false, isWritable: false }, + { pubkey: tokenProgramId, isSigner: false, isWritable: false }, + ]; + + return new TransactionInstruction({ + keys, + programId: associatedTokenProgramId, + data: Buffer.from([1]), + }); +} + +/** + * Is the address a valid Solana address? (32 byte base58 string) + * + * @param address hopefully 32 byte base58 string + * @returns true if `address` is a 32 byte base58 string + */ +export function isValidSolanaAddress(address: string): boolean { + try { + // eslint-disable-next-line no-new + new PublicKey(address); + return true; + } catch (err) { + return false; + } +} + +export async function isValidSolanaAddressAsync( + address: string +): Promise { + return isValidSolanaAddress(address); +} + +/** + * Does the Solana account exist? + * + * Checks if the account has been created + * + * @param conn Solana connection + * @param address Address to check + * @returns `true` if there's an account at `address` + */ +export async function solAccountExists( + conn: Connection, + address: PublicKey +): Promise { + const account = await conn.getAccountInfo(address, "max"); + const exists = account != null; + return exists; } diff --git a/yarn.lock b/yarn.lock index 72cdbd5c1..764f967ad 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3286,6 +3286,7 @@ __metadata: dependencies: "@enkryptcom/types": "workspace:^" "@enkryptcom/utils": "workspace:^" + "@solana/spl-token": ^0.4.8 "@solana/web3.js": ^1.95.3 "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 From c50ec46fd875dd637c205d0bf99effd8cf996663 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Mon, 23 Sep 2024 18:43:29 -0500 Subject: [PATCH 327/375] chore: types --- packages/swap/src/providers/jupiter/types.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/swap/src/providers/jupiter/types.ts b/packages/swap/src/providers/jupiter/types.ts index 6848441fb..c776f6c14 100644 --- a/packages/swap/src/providers/jupiter/types.ts +++ b/packages/swap/src/providers/jupiter/types.ts @@ -121,10 +121,19 @@ export type JupiterSwapResponse = { computeUnitLimit?: number; prioritizationType?: { computeBudget?: { - microLamports: 71428; - estimatedMicroLamports: 142856; + /** @example 71428 */ + microLamports: number; + /** @example 142856 */ + estimatedMicroLamports: number; }; }; - dynamicSlippageReport: null; + // TODO: Narrow down + dynamicSlippageReport: null | { + slippageBps?: null | string | number; + otherAmount?: null | string | number; + simulatedIncurredSlippageBps?: null | string | number; + amplificationRatio?: null | string | number; + }; + // TODO: Type simulationError: null; }; From 84e4e7f7cafc3158c9532bf961e3168e44382633 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:17:11 -0700 Subject: [PATCH 328/375] devop: update types package version --- packages/types/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/types/package.json b/packages/types/package.json index 2f74b5667..00ee84caf 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@enkryptcom/types", - "version": "0.0.4", + "version": "0.0.5", "description": "typescript types for enkrypt packages", "main": "dist/index.js", "types": "dist/index.d.ts", From 9a69fbe5eba508363eeaa44abe5449946affdbd8 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 24 Sep 2024 16:28:49 -0500 Subject: [PATCH 329/375] fix: rango swap native currencies --- packages/swap/src/index.ts | 4 +-- packages/swap/src/providers/jupiter/index.ts | 2 +- packages/swap/src/providers/rango/index.ts | 33 +++++++++++++++----- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/packages/swap/src/index.ts b/packages/swap/src/index.ts index c8b692ad3..7048caf91 100644 --- a/packages/swap/src/index.ts +++ b/packages/swap/src/index.ts @@ -73,9 +73,7 @@ class Swap extends EventEmitter { this.network = options.network; this.evmOptions = options.evmOptions ? options.evmOptions - : { - infiniteApproval: true, - }; + : { infiniteApproval: true }; this.api = options.api; this.walletId = options.walletIdentifier; this.topTokenInfo = { diff --git a/packages/swap/src/providers/jupiter/index.ts b/packages/swap/src/providers/jupiter/index.ts index 39c8c6c38..d78340f4b 100644 --- a/packages/swap/src/providers/jupiter/index.ts +++ b/packages/swap/src/providers/jupiter/index.ts @@ -155,7 +155,7 @@ if (DEBUG) { "." + now.getMilliseconds().toString().padStart(3, "0"); console.info( - `\x1b[90m${ymdhms}\x1b[0m \x1b[32mRangoSwapProvider.${context}\x1b[0m: ${message}`, + `\x1b[90m${ymdhms}\x1b[0m \x1b[32mJupiterSwapProvider.${context}\x1b[0m: ${message}`, ...args ); }; diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index 95f9119d3..a79e7ed1c 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -281,6 +281,7 @@ class Rango extends ProviderClass { this.toTokens[network][t.address || NATIVE_TOKEN_ADDRESS] = { ...t, + address: t.address || NATIVE_TOKEN_ADDRESS, name: t.name || t.symbol, logoURI: t.image, type: NetworkType.EVM, @@ -301,11 +302,19 @@ class Rango extends ProviderClass { * For cross-chain tokens like Ethereum (ETH) on the Binance Smart Chain (BSC) network, * it returns the corresponding symbol like WETH. */ - private getSymbol(token: TokenType) { + private getSymbol(token: TokenType): string | undefined { const { tokens } = this.rangoMeta; if (this.isNativeToken(token.address)) return token.symbol; + if (token.address == null) { + console.warn( + `Cannot get Rango token symbol: Token address is not defined` + + ` for token ${token.name} (${token.symbol}) - ${token.address}` + ); + return undefined; + } + const lc = token.address?.toLowerCase(); return Object.values(tokens || []).find( - (t) => t.address?.toLowerCase() === token.address?.toLowerCase() + (t) => t.address?.toLowerCase() === lc )?.symbol; } @@ -458,7 +467,20 @@ class Rango extends ProviderClass { disableEstimate: true, }; - debug("getRangoSwap", `Requesting quote from rango sdk...`); + debug( + "getRangoSwap", + `Requesting quote from rango sdk...` + + ` fromBlockchain=${fromBlockchain}` + + ` toBlockchain=${toBlockchain}` + + ` fromToken=${fromSymbol}` + + ` toToken=${toSymbol}` + + ` fromAddress=${options.fromAddress}` + + ` toAddress=${options.toAddress}` + + ` amount=${options.amount.toString()}` + + ` slippage=${slippage}` + + ` referrerFee=${params.referrerFee}`, + { ...params } + ); const rangoSwapResponse = await rangoClient.swap(params); if ( @@ -746,8 +768,6 @@ class Rango extends ProviderClass { return null; } - console.log("===== 1"); - console.log({ ...rangoSwapResponse }); const ltx = SolanaLegacyTransaction.populate( new TransactionMessage({ instructions: rangoSwapResponse.tx.instructions.map( @@ -779,7 +799,6 @@ class Rango extends ProviderClass { ) ) ); - console.log("===== 2"); enkSolTx = { type: TransactionType.solana, @@ -792,8 +811,6 @@ class Rango extends ProviderClass { .serialize({ requireAllSignatures: false }) .toString("base64"), }; - - console.log("===== 3"); } break; } From 24b3210d01d9997ffa54be52a9206e494b7bdc99 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 24 Sep 2024 16:30:48 -0500 Subject: [PATCH 330/375] chore: cleanup --- packages/swap/src/providers/rango/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/swap/src/providers/rango/index.ts b/packages/swap/src/providers/rango/index.ts index a79e7ed1c..2855491fc 100644 --- a/packages/swap/src/providers/rango/index.ts +++ b/packages/swap/src/providers/rango/index.ts @@ -312,7 +312,7 @@ class Rango extends ProviderClass { ); return undefined; } - const lc = token.address?.toLowerCase(); + const lc = token.address.toLowerCase(); return Object.values(tokens || []).find( (t) => t.address?.toLowerCase() === lc )?.symbol; From e76a861e7c7b11d7373435e1fe96800eb24447e9 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 24 Sep 2024 16:51:33 -0500 Subject: [PATCH 331/375] fix: changelly tests --- packages/swap/tests/changelly.test.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/swap/tests/changelly.test.ts b/packages/swap/tests/changelly.test.ts index 729998293..9ccaba78c 100644 --- a/packages/swap/tests/changelly.test.ts +++ b/packages/swap/tests/changelly.test.ts @@ -1,4 +1,6 @@ +import { Connection } from "@solana/web3.js"; import { expect } from "chai"; +import Web3Eth from "web3-eth"; import { NATIVE_TOKEN_ADDRESS } from "../src/configs"; import Changelly from "../src/providers/changelly"; import { @@ -13,11 +15,15 @@ import { amount, fromAddress, toAddress, + nodeURL as ethNodeURL, } from "./fixtures/mainnet/configs"; +import { nodeURL as solNodeURL } from "./fixtures/solana/configs"; describe("Changelly Provider", () => { // @ts-ignore - const changelly = new Changelly(SupportedNetworkName.Ethereum); + const web3eth = new Web3Eth(ethNodeURL); + const solConn = new Connection(solNodeURL); + const changelly = new Changelly(web3eth, SupportedNetworkName.Ethereum); const init = changelly.init(); it("it should return a quote ", async () => { await init; @@ -67,7 +73,7 @@ describe("Changelly Provider", () => { }); it("it should initialize other networks: Bitcoin", async () => { - const changelly2 = new Changelly(SupportedNetworkName.Bitcoin); + const changelly2 = new Changelly(web3eth, SupportedNetworkName.Bitcoin); await changelly2.init(); const fromTokens = changelly2.getFromTokens(); expect(Object.values(fromTokens).length).to.be.eq(1); @@ -75,10 +81,18 @@ describe("Changelly Provider", () => { }); it("it should initialize other networks: Polkadot", async () => { - const changelly2 = new Changelly(SupportedNetworkName.Polkadot); + const changelly2 = new Changelly(web3eth, SupportedNetworkName.Polkadot); await changelly2.init(); const fromTokens = changelly2.getFromTokens(); expect(Object.values(fromTokens).length).to.be.eq(1); expect(fromTokens[NATIVE_TOKEN_ADDRESS].name).to.be.eq("Polkadot"); }); + // TODO: switch this test to assert that Solana DOES initialise + // once we enable Changelly on Solana + it("it NOT should initialize other networks: Solana", async () => { + const changelly2 = new Changelly(solConn, SupportedNetworkName.Solana); + await changelly2.init(); + const fromTokens = changelly2.getFromTokens(); + expect(Object.values(fromTokens).length).to.be.eq(0); + }); }); From 76905d2b06228333d3a9082ccc2193e4df6bf310 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 24 Sep 2024 17:03:21 -0500 Subject: [PATCH 332/375] chore: update celo logo --- .../providers/ethereum/networks/icons/celo.svg | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/packages/extension/src/providers/ethereum/networks/icons/celo.svg b/packages/extension/src/providers/ethereum/networks/icons/celo.svg index 4a06f6f73..b2a7a51b2 100644 --- a/packages/extension/src/providers/ethereum/networks/icons/celo.svg +++ b/packages/extension/src/providers/ethereum/networks/icons/celo.svg @@ -1,16 +1 @@ - - -Artboard 1 - - - - + \ No newline at end of file From 04896b460b1f5b184973eb3b8cfd8efc8e7abf38 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 24 Sep 2024 17:03:23 -0700 Subject: [PATCH 333/375] devop: partial work --- .../bitcoin/libs/bip322-message-sign.ts | 67 +++++++++++++++++++ .../providers/bitcoin/ui/btc-sign-message.vue | 8 ++- .../src/providers/bitcoin/ui/libs/signer.ts | 33 ++++++++- .../hw-wallets/src/ledger/ethereum/index.ts | 9 +-- packages/hw-wallets/src/types.ts | 1 + 5 files changed, 104 insertions(+), 14 deletions(-) diff --git a/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts b/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts index 60f62d723..baa8963f7 100644 --- a/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts +++ b/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts @@ -159,3 +159,70 @@ export async function signMessageOfBIP322Simple({ return signature; } + +export function getPSBTMessageOfBIP322Simple({ + message, + address, + network, +}: { + message: string; + address: string; + network: BitcoinNetwork; +}) { + const outputScript = BTCAddress.toOutputScript( + network.displayAddress(address), + network.networkInfo + ); + const addressType = network.networkInfo.paymentType; + const supportedTypes = [PaymentType.P2WPKH]; + if (supportedTypes.includes(addressType) == false) { + throw new Error("Not support address type to sign"); + } + + const prevoutHash = Buffer.from( + "0000000000000000000000000000000000000000000000000000000000000000", + "hex" + ); + const prevoutIndex = 0xffffffff; + const sequence = 0; + const scriptSig = Buffer.concat([ + Buffer.from("0020", "hex"), + Buffer.from(bip0322_hash(message), "hex"), + ]); + + const txToSpend = new Transaction(); + txToSpend.version = 0; + txToSpend.addInput(prevoutHash, prevoutIndex, sequence, scriptSig); + txToSpend.addOutput(outputScript, 0); + + const psbtToSign = new Psbt(); + psbtToSign.setVersion(0); + psbtToSign.addInput({ + hash: txToSpend.getHash(), + index: 0, + sequence: 0, + witnessUtxo: { + script: outputScript, + value: 0, + }, + }); + psbtToSign.addOutput({ script: Buffer.from("6a", "hex"), value: 0 }); + + return psbtToSign; + // await psbtToSign.signAllInputsAsync(Signer); + // psbtToSign.finalizeAllInputs(); + // const txToSign = psbtToSign.extractTransaction(); + + // const encodeVarString = (b: Buffer) => { + // return Buffer.concat([encode(b.byteLength), b]); + // }; + + // const len = encode(txToSign.ins[0].witness.length); + // const result = Buffer.concat([ + // len, + // ...txToSign.ins[0].witness.map((w) => encodeVarString(w)), + // ]); + // const signature = result.toString("base64"); + + // return signature; +} diff --git a/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue b/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue index 219ff065e..045fe0aa8 100644 --- a/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue +++ b/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue @@ -82,6 +82,7 @@ const Options = ref({ const message = ref(""); const type = ref(""); +console.log("hellooooooo"); onBeforeMount(async () => { const { Request, options } = await windowPromise; network.value = (await getNetworkByName( @@ -92,6 +93,7 @@ onBeforeMount(async () => { Options.value = options; message.value = Request.value.params![0]; type.value = Request.value.params![1]; + console.log(Request.value); }); const approve = async () => { @@ -102,9 +104,9 @@ const approve = async () => { network: network.value as BitcoinNetwork, payload: Buffer.from(msg, "utf8"), type: type.value, - }) - .then(Resolve.value) - .catch(Resolve.value); + }); + // .then(Resolve.value) + // .catch(Resolve.value); }; const deny = async () => { const { Resolve } = await windowPromise; diff --git a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts index 9c79b48ab..98bd667ce 100644 --- a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts +++ b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts @@ -5,7 +5,10 @@ import { hexToBuffer, bufferToHex } from "@enkryptcom/utils"; import { Psbt, Transaction } from "bitcoinjs-lib"; import { BitcoinNetwork, PaymentType } from "../../types/bitcoin-network"; import { EnkryptAccount, HWwalletType } from "@enkryptcom/types"; -import { signMessageOfBIP322Simple } from "../../libs/bip322-message-sign"; +import { + getPSBTMessageOfBIP322Simple, + signMessageOfBIP322Simple, +} from "../../libs/bip322-message-sign"; import { magicHash, toCompact } from "../../libs/sign-message-utils"; import HWwallet from "@enkryptcom/hw-wallets"; import type BitcoinAPI from "@/providers/bitcoin/libs/api"; @@ -84,7 +87,7 @@ const TransactionSigner = async ( }, wallet: account.walletType as unknown as HWwalletType, }) - .then((strTx) => { + .then((strTx: string) => { return Transaction.fromHex(strTx); }); } else { @@ -100,8 +103,32 @@ const MessageSigner = ( options: SignerMessageOptions ): Promise => { const { account, payload, network } = options; + console.log(options); if (account.isHardware) { - throw new Error("btc-hardware not implemented"); + const psbtToSign = getPSBTMessageOfBIP322Simple({ + address: account.address, + message: payload.toString(), + network: network, + }); + const hwwallets = new HWwallet(); + return hwwallets + .signTransaction({ + transaction: { + rawTxs: [], + psbtTx: psbtToSign, + }, + networkName: network.name, + pathIndex: account.pathIndex.toString(), + pathType: { + basePath: account.basePath, + path: account.HWOptions!.pathTemplate, + }, + wallet: account.walletType as unknown as HWwalletType, + }) + .then((strTx: string) => { + console.log(Transaction.fromHex(strTx)); + throw new Error("not supported"); + }); } else { if (options.type === "bip322-simple") { const signer = PSBTSigner(account, network); diff --git a/packages/hw-wallets/src/ledger/ethereum/index.ts b/packages/hw-wallets/src/ledger/ethereum/index.ts index 85ec45ab9..5fa8a2155 100644 --- a/packages/hw-wallets/src/ledger/ethereum/index.ts +++ b/packages/hw-wallets/src/ledger/ethereum/index.ts @@ -93,14 +93,7 @@ class LedgerEthereum implements HWWalletProvider { options.pathType.path.replace(`{index}`, options.pathIndex), options.message.toString("hex") ) - .then((result) => { - const v = result.v - 27; - let vs = v.toString(16); - if (vs.length < 2) { - vs = `0${v}`; - } - return `0x${result.r}${result.s}${vs}`; - }); + .then((result) => `0x${result.r}${result.s}${result.v.toString(16)}`); } async signTransaction(options: SignTransactionRequest): Promise { diff --git a/packages/hw-wallets/src/types.ts b/packages/hw-wallets/src/types.ts index 42fe695ba..2469dc194 100644 --- a/packages/hw-wallets/src/types.ts +++ b/packages/hw-wallets/src/types.ts @@ -41,6 +41,7 @@ export interface BaseRequest { } export interface SignMessageRequest extends BaseRequest { message: Buffer; + type?: string; } export interface BTCSignTransaction { From f228ededbaf5ccdc6c075358b8514d95c081c424 Mon Sep 17 00:00:00 2001 From: nickkelly1 Date: Tue, 24 Sep 2024 20:14:19 -0500 Subject: [PATCH 334/375] devop: add linea daps --- packages/extension/src/libs/dapp-list/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/extension/src/libs/dapp-list/index.ts b/packages/extension/src/libs/dapp-list/index.ts index 2453be4fd..685af8246 100644 --- a/packages/extension/src/libs/dapp-list/index.ts +++ b/packages/extension/src/libs/dapp-list/index.ts @@ -97,6 +97,8 @@ const lists: Partial> = { "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/dapps/rari.json", [NetworkNames.Solana]: "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/dapps/sol.json", + [NetworkNames.Linea]: + "https://raw.githubusercontent.com/enkryptcom/dynamic-data/main/dapps/linea.json", }; export default lists; From d5fb9dc8821642bdcd6eb5ace4a196fd987969da Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Thu, 26 Sep 2024 12:39:00 -0700 Subject: [PATCH 335/375] devop: partial changes --- .../bitcoin/libs/bip322-message-sign.ts | 34 ++++-- .../providers/bitcoin/ui/btc-sign-message.vue | 8 +- .../src/providers/bitcoin/ui/libs/signer.ts | 23 ++-- packages/hw-wallets/package.json | 2 + .../hw-wallets/src/ledger/bitcoin/index.ts | 70 +++++++++++- packages/hw-wallets/src/types.ts | 12 +- yarn.lock | 108 +++++++++++++++--- 7 files changed, 221 insertions(+), 36 deletions(-) diff --git a/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts b/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts index baa8963f7..ac616dbb5 100644 --- a/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts +++ b/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts @@ -7,7 +7,7 @@ import { BitcoinNetwork, PaymentType } from "../types/bitcoin-network"; import { address as BTCAddress, Transaction, Psbt } from "bitcoinjs-lib"; import { sha256 } from "ethereum-cryptography/sha256"; import { PSBTSigner } from "../ui/libs/signer"; -import { bufferToHex } from "@enkryptcom/utils"; +import { bufferToHex, hexToBuffer } from "@enkryptcom/utils"; const bip0322_hash = (message: string) => { const tag = "BIP0322-signed-message"; @@ -92,6 +92,10 @@ export const decode = (buffer: Buffer, offset: number) => { } }; +const encodeVarString = (b: Buffer) => { + return Buffer.concat([encode(b.byteLength), b]); +}; + export async function signMessageOfBIP322Simple({ message, address, @@ -128,7 +132,6 @@ export async function signMessageOfBIP322Simple({ txToSpend.version = 0; txToSpend.addInput(prevoutHash, prevoutIndex, sequence, scriptSig); txToSpend.addOutput(outputScript, 0); - const psbtToSign = new Psbt(); psbtToSign.setVersion(0); psbtToSign.addInput({ @@ -146,10 +149,6 @@ export async function signMessageOfBIP322Simple({ psbtToSign.finalizeAllInputs(); const txToSign = psbtToSign.extractTransaction(); - const encodeVarString = (b: Buffer) => { - return Buffer.concat([encode(b.byteLength), b]); - }; - const len = encode(txToSign.ins[0].witness.length); const result = Buffer.concat([ len, @@ -160,6 +159,17 @@ export async function signMessageOfBIP322Simple({ return signature; } +export function getSignatureFromSignedTransaction(strTx: string): string { + const txToSign = Transaction.fromHex(strTx); + const len = encode(txToSign.ins[0].witness.length); + const result = Buffer.concat([ + len, + ...txToSign.ins[0].witness.map((w) => encodeVarString(w)), + ]); + const signature = result.toString("base64"); + + return signature; +} export function getPSBTMessageOfBIP322Simple({ message, address, @@ -205,10 +215,20 @@ export function getPSBTMessageOfBIP322Simple({ script: outputScript, value: 0, }, + bip32Derivation: [ + { + masterFingerprint: Buffer.from("4ab28551", "hex"), + pubkey: hexToBuffer(address), + path: "m/84'/0'/0'/0/0", + }, + ], }); psbtToSign.addOutput({ script: Buffer.from("6a", "hex"), value: 0 }); - return psbtToSign; + return { + psbtToSign, + txdata: txToSpend.toHex(), + }; // await psbtToSign.signAllInputsAsync(Signer); // psbtToSign.finalizeAllInputs(); // const txToSign = psbtToSign.extractTransaction(); diff --git a/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue b/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue index 045fe0aa8..219ff065e 100644 --- a/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue +++ b/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue @@ -82,7 +82,6 @@ const Options = ref({ const message = ref(""); const type = ref(""); -console.log("hellooooooo"); onBeforeMount(async () => { const { Request, options } = await windowPromise; network.value = (await getNetworkByName( @@ -93,7 +92,6 @@ onBeforeMount(async () => { Options.value = options; message.value = Request.value.params![0]; type.value = Request.value.params![1]; - console.log(Request.value); }); const approve = async () => { @@ -104,9 +102,9 @@ const approve = async () => { network: network.value as BitcoinNetwork, payload: Buffer.from(msg, "utf8"), type: type.value, - }); - // .then(Resolve.value) - // .catch(Resolve.value); + }) + .then(Resolve.value) + .catch(Resolve.value); }; const deny = async () => { const { Resolve } = await windowPromise; diff --git a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts index 98bd667ce..15f628e63 100644 --- a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts +++ b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts @@ -7,6 +7,7 @@ import { BitcoinNetwork, PaymentType } from "../../types/bitcoin-network"; import { EnkryptAccount, HWwalletType } from "@enkryptcom/types"; import { getPSBTMessageOfBIP322Simple, + getSignatureFromSignedTransaction, signMessageOfBIP322Simple, } from "../../libs/bip322-message-sign"; import { magicHash, toCompact } from "../../libs/sign-message-utils"; @@ -112,11 +113,10 @@ const MessageSigner = ( }); const hwwallets = new HWwallet(); return hwwallets - .signTransaction({ - transaction: { - rawTxs: [], - psbtTx: psbtToSign, - }, + .signPersonalMessage({ + message: payload, + type: options.type as any, + psbtTx: psbtToSign.psbtToSign, networkName: network.name, pathIndex: account.pathIndex.toString(), pathType: { @@ -126,8 +126,17 @@ const MessageSigner = ( wallet: account.walletType as unknown as HWwalletType, }) .then((strTx: string) => { - console.log(Transaction.fromHex(strTx)); - throw new Error("not supported"); + const sig = getSignatureFromSignedTransaction(strTx); + console.log(sig); + return { + result: JSON.stringify(sig), + }; + }) + .catch((e: any) => { + console.log(e); + return { + error: e.message, + }; }); } else { if (options.type === "bip322-simple") { diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 273f39dbe..85220f424 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -61,7 +61,9 @@ "@trezor/connect-web": "^9.4.0", "@zondax/ledger-substrate": "^1.0.0", "bitcoinjs-lib": "^6.1.6", + "bs58": "^6.0.0", "hdkey": "^2.1.0", + "ledger-bitcoin": "^0.2.3", "webextension-polyfill": "^0.12.0" } } diff --git a/packages/hw-wallets/src/ledger/bitcoin/index.ts b/packages/hw-wallets/src/ledger/bitcoin/index.ts index 33fe32948..12157094f 100644 --- a/packages/hw-wallets/src/ledger/bitcoin/index.ts +++ b/packages/hw-wallets/src/ledger/bitcoin/index.ts @@ -1,18 +1,25 @@ import type Transport from "@ledgerhq/hw-transport"; import webUsbTransport from "@ledgerhq/hw-transport-webusb"; +import bs58 from "bs58"; +import { AppClient, DefaultWalletPolicy } from "ledger-bitcoin"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; import BtcApp from "@ledgerhq/hw-app-btc"; import HDKey from "hdkey"; import type { CreateTransactionArg } from "@ledgerhq/hw-app-btc/lib/createTransaction"; import { serializeTransactionOutputs } from "@ledgerhq/hw-app-btc/lib/serializeTransaction"; import { bufferToHex } from "@enkryptcom/utils"; +import { + pathStringToArray, + pathArrayToString, + // pubkeyFromXpub, +} from "@ledgerhq/hw-app-btc/lib/bip32"; import { AddressResponse, + BitcoinSignMessage, BTCSignTransaction, getAddressRequest, HWWalletProvider, PathType, - SignMessageRequest, SignTransactionRequest, } from "../../types"; import { supportedPaths } from "./configs"; @@ -94,7 +101,66 @@ class LedgerBitcoin implements HWWalletProvider { }); } - signPersonalMessage(options: SignMessageRequest): Promise { + async signPersonalMessage(options: BitcoinSignMessage): Promise { + if (options.type === "bip322-simple") { + if (!options.psbtTx) { + return Promise.reject( + new Error("ledger-bitcoin: psbt not set for message signing") + ); + } + const client = new AppClient(this.transport as any); + const fpr = await client.getMasterFingerprint(); + const pathElems: number[] = pathStringToArray( + options.pathType.path.replace(`{index}`, options.pathIndex) + ); + const rootPath = pathElems.slice(0, -2); + const accountRootPubkey = await client.getExtendedPubkey( + pathArrayToString(rootPath), + false + ); + options.psbtTx.data.inputs[0].bip32Derivation[0].masterFingerprint = + Buffer.from(fpr, "hex"); + options.psbtTx.data.inputs[0].bip32Derivation[0].path = + options.pathType.path.replace(`{index}`, options.pathIndex); + + options.psbtTx.updateGlobal({ + globalXpub: [ + { + extendedPubkey: Buffer.from(bs58.decode(accountRootPubkey)).slice( + 0, + -4 + ), + masterFingerprint: Buffer.from(fpr, "hex"), + path: options.pathType.path.replace(`{index}`, options.pathIndex), + }, + ], + }); + console.log(options.psbtTx); + console.log( + fpr, + pathArrayToString(rootPath), + pathArrayToString(rootPath).replace("/m", "") + ); + // eslint-disable-next-line @typescript-eslint/no-empty-function + const accountPolicy = new DefaultWalletPolicy( + "wpkh(@0/**)", + `[${fpr}/${pathArrayToString(rootPath).replace( + "m/", + "" + )}]${accountRootPubkey}` + ); + console.log(accountPolicy); + const sigs = await client.signPsbt( + options.psbtTx.toBase64(), + accountPolicy, + null + ); + options.psbtTx.updateInput(0, { + partialSig: [sigs[0][1]], + }); + options.psbtTx.finalizeAllInputs(); + return options.psbtTx.extractTransaction().toHex(); + } const connection = new BtcApp({ transport: this.transport }); return connection .signMessage( diff --git a/packages/hw-wallets/src/types.ts b/packages/hw-wallets/src/types.ts index 2469dc194..5c6e5dfe9 100644 --- a/packages/hw-wallets/src/types.ts +++ b/packages/hw-wallets/src/types.ts @@ -39,11 +39,19 @@ export interface BaseRequest { wallet: HWwalletType; networkName: NetworkNames; } -export interface SignMessageRequest extends BaseRequest { + +export interface GenericSignMessage extends BaseRequest { message: Buffer; - type?: string; } +export interface BitcoinSignMessage extends BaseRequest { + message: Buffer; + type: "bip322-simple" | "classic"; + psbtTx?: Psbt; +} + +export type SignMessageRequest = GenericSignMessage | BitcoinSignMessage; + export interface BTCSignTransaction { rawTxs: string[]; psbtTx: Psbt; diff --git a/yarn.lock b/yarn.lock index 72cdbd5c1..1a2a1ab15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1847,6 +1847,43 @@ __metadata: languageName: node linkType: hard +"@bitcoinerlab/descriptors@npm:^1.0.2": + version: 1.1.1 + resolution: "@bitcoinerlab/descriptors@npm:1.1.1" + dependencies: + "@bitcoinerlab/miniscript": ^1.2.1 + "@bitcoinerlab/secp256k1": ^1.0.5 + bip32: ^4.0.0 + bitcoinjs-lib: ^6.1.3 + ecpair: ^2.1.0 + peerDependencies: + ledger-bitcoin: ^0.2.2 + peerDependenciesMeta: + ledger-bitcoin: + optional: true + checksum: 32c89e90fd0521db615ead50ea9a32cbbe0d698ad99b4d68e4ac8bd8165032993a739b2cfc327638406f4b30f0003e3bbef2c1cd7a9f5586f4312d2265084290 + languageName: node + linkType: hard + +"@bitcoinerlab/miniscript@npm:^1.2.1": + version: 1.4.0 + resolution: "@bitcoinerlab/miniscript@npm:1.4.0" + dependencies: + bip68: ^1.0.4 + checksum: af708962cbfa3d0f40c5d502d6c1e9c4f4c2f35887d6f6b125147f79cb1415362fd8b39848bd97d0c4b482cbe1c1eed371ded592a33ec3135fc3b50245084587 + languageName: node + linkType: hard + +"@bitcoinerlab/secp256k1@npm:^1.0.5": + version: 1.1.1 + resolution: "@bitcoinerlab/secp256k1@npm:1.1.1" + dependencies: + "@noble/hashes": ^1.1.5 + "@noble/secp256k1": ^1.7.1 + checksum: 01f23cb05553ceb3783513b9c79b3303289bf55cd694150967b15ce60a35821cad68794ae958088cbe6b8a2b02c9294ebff78fd6b53d6fd78662eeda7bc742f1 + languageName: node + linkType: hard + "@cardano-foundation/ledgerjs-hw-app-cardano@npm:^6.0.1": version: 6.0.1 resolution: "@cardano-foundation/ledgerjs-hw-app-cardano@npm:6.0.1" @@ -2981,8 +3018,8 @@ __metadata: "@ledgerhq/live-common": ^34.1.0 "@polkadot/types": ^12.4.2 "@polkadot/util": ^13.0.2 - "@trezor/connect": ^9.4.0 - "@trezor/connect-web": ^9.4.0 + "@trezor/connect": 9.4.0 + "@trezor/connect-web": 9.4.0 "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 "@types/node": ^20.16.5 @@ -2990,6 +3027,7 @@ __metadata: "@typescript-eslint/parser": ^5.62.0 "@zondax/ledger-substrate": ^1.0.0 bitcoinjs-lib: ^6.1.6 + bs58: ^6.0.0 chai: ^4.5.0 eslint: ^8.57.0 eslint-config-airbnb-base: ^15.0.0 @@ -2998,6 +3036,7 @@ __metadata: eslint-plugin-import: ^2.30.0 eslint-plugin-module-resolver: ^1.5.0 hdkey: ^2.1.0 + ledger-bitcoin: ^0.2.3 mocha: ^10.7.3 prettier: ^2.8.8 ts-mocha: ^10.0.0 @@ -9256,7 +9295,7 @@ __metadata: languageName: node linkType: hard -"@trezor/connect-web@npm:^9.4.0": +"@trezor/connect-web@npm:9.4.0": version: 9.4.0 resolution: "@trezor/connect-web@npm:9.4.0" dependencies: @@ -9269,7 +9308,7 @@ __metadata: languageName: node linkType: hard -"@trezor/connect@npm:9.4.0, @trezor/connect@npm:^9.4.0": +"@trezor/connect@npm:9.4.0": version: 9.4.0 resolution: "@trezor/connect@npm:9.4.0" dependencies: @@ -12750,6 +12789,18 @@ __metadata: languageName: node linkType: hard +"bip32@npm:^4.0.0": + version: 4.0.0 + resolution: "bip32@npm:4.0.0" + dependencies: + "@noble/hashes": ^1.2.0 + "@scure/base": ^1.1.1 + typeforce: ^1.11.5 + wif: ^2.0.6 + checksum: a36253ac164db50a25e88effce84aec1eaba2ec2fbd7a19bc1f836f9b1c934fa148c3a01ddece7f136596330074d98c6b2a441e51914c302d130f56f0f893d0d + languageName: node + linkType: hard + "bip39@npm:3.0.2": version: 3.0.2 resolution: "bip39@npm:3.0.2" @@ -12787,6 +12838,13 @@ __metadata: languageName: node linkType: hard +"bip68@npm:^1.0.4": + version: 1.0.4 + resolution: "bip68@npm:1.0.4" + checksum: 0955c87f73cb7ae627558c476ce885af635bbbb43f9d12dc54f3b6adb4e2b47a451215ff50d5e25628fa889b10a88cd59dd1fd5a31d900eaeaf262456b87e5da + languageName: node + linkType: hard + "bitcoin-ops@npm:^1.3.0, bitcoin-ops@npm:^1.4.0, bitcoin-ops@npm:^1.4.1": version: 1.4.1 resolution: "bitcoin-ops@npm:1.4.1" @@ -12817,7 +12875,7 @@ __metadata: languageName: node linkType: hard -"bitcoinjs-lib@npm:^6.1.6": +"bitcoinjs-lib@npm:^6.1.3, bitcoinjs-lib@npm:^6.1.6": version: 6.1.6 resolution: "bitcoinjs-lib@npm:6.1.6" dependencies: @@ -15884,6 +15942,17 @@ __metadata: languageName: node linkType: hard +"ecpair@npm:^2.1.0": + version: 2.1.0 + resolution: "ecpair@npm:2.1.0" + dependencies: + randombytes: ^2.1.0 + typeforce: ^1.18.0 + wif: ^2.0.6 + checksum: 924a776808f91d2fdd33a7033f84e3bbfe668ae98c0b9764c7b923e018accd8de57012bf20e419e0a5ef73ec3ec3738a654e71abe12f537b2fd7bcf02b93659f + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -20815,6 +20884,19 @@ __metadata: languageName: node linkType: hard +"ledger-bitcoin@npm:^0.2.3": + version: 0.2.3 + resolution: "ledger-bitcoin@npm:0.2.3" + dependencies: + "@bitcoinerlab/descriptors": ^1.0.2 + "@bitcoinerlab/secp256k1": ^1.0.5 + "@ledgerhq/hw-transport": ^6.20.0 + bip32-path: ^0.4.2 + bitcoinjs-lib: ^6.1.3 + checksum: da54d4a88f29b1f2e1b61207456495eb7cb319cc525d6c9272b120915b7a7113205e0318d9c958610bebac3a2f2a3f9b3fe4a748dacfacc5edc9b6858ab0938f + languageName: node + linkType: hard + "less-loader@npm:^12.2.0": version: 12.2.0 resolution: "less-loader@npm:12.2.0" @@ -22404,12 +22486,12 @@ __metadata: languageName: node linkType: hard -"node-addon-api@npm:^7.0.0": - version: 7.0.0 - resolution: "node-addon-api@npm:7.0.0" +"node-addon-api@npm:^8.0.0": + version: 8.1.0 + resolution: "node-addon-api@npm:8.1.0" dependencies: node-gyp: latest - checksum: 4349465d737e284b280fc0e5fd2384f9379bca6b7f2a5a1460bea676ba5b90bf563e7d02a9254c35b9ed808641c81d9b4ca9e1da17d2849cd07727660b00b332 + checksum: a30398fa9bb029f164b57d77aac1dc57e62e46cf1a5c468e1a762e34b442ae9d3ee007a87de58e5866df19446f08d556a2dc261a39240d10f6512ed50acf8210 languageName: node linkType: hard @@ -28910,14 +28992,14 @@ __metadata: linkType: hard "usb@npm:^2.11.0": - version: 2.11.0 - resolution: "usb@npm:2.11.0" + version: 2.14.0 + resolution: "usb@npm:2.14.0" dependencies: "@types/w3c-web-usb": ^1.0.6 - node-addon-api: ^7.0.0 + node-addon-api: ^8.0.0 node-gyp: latest node-gyp-build: ^4.5.0 - checksum: c1c12140e8c93a76d15a0aecf84de19990694d57b568124f8eafe729e09b41293933a93856c3f37a9059c71f1fbd030b334f7392b868225243c1c5c99f0b2730 + checksum: e04a61943536db2d7041a1c27db23212dac9b14660bf0d103902a087d4265f9160771776811ed7ef9ff527b0d4844016288258723cfd4af530205c8ba29ab837 languageName: node linkType: hard From 275283aa6e970aaf06b31c43badf5a2f8cb2daa6 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:20:31 -0700 Subject: [PATCH 336/375] devop: add bip322 support for ledger --- .../public/vendor/trezor-content-script.js | 1262 ++++++++++++++++- packages/extension/src/manifest/base.json | 2 +- .../src/manifest/manifest-edge-opera.json | 2 +- .../src/manifest/manifest-firefox.json | 2 +- .../bitcoin/libs/bip322-message-sign.ts | 108 +- .../providers/bitcoin/ui/btc-sign-message.vue | 7 +- .../src/providers/bitcoin/ui/libs/signer.ts | 4 +- .../ethereum/ui/eth-sign-message.vue | 8 +- packages/hw-wallets/package.json | 4 +- .../hw-wallets/src/ledger/bitcoin/index.ts | 27 +- .../hw-wallets/src/trezor/bitcoin/index.ts | 37 +- .../hw-wallets/src/trezor/ethereum/index.ts | 25 +- packages/hw-wallets/src/types.ts | 3 +- 13 files changed, 1338 insertions(+), 153 deletions(-) diff --git a/packages/extension/public/vendor/trezor-content-script.js b/packages/extension/public/vendor/trezor-content-script.js index bf959adb8..f045b8a6d 100644 --- a/packages/extension/public/vendor/trezor-content-script.js +++ b/packages/extension/public/vendor/trezor-content-script.js @@ -1,17 +1,1251 @@ -let port = chrome.runtime.connect({ name: "trezor-connect" }); -port.onMessage.addListener((message) => { - window.postMessage(message, window.location.origin); -}); -port.onDisconnect.addListener((d) => { - port = null; -}); - -/* -Passing messages from popup to background script +// let port = chrome.runtime.connect({ name: "trezor-connect" }); +// port.onMessage.addListener((message) => { +// window.postMessage(message, window.location.origin); +// }); +// port.onDisconnect.addListener((d) => { +// port = null; +// }); + +// /* +// Passing messages from popup to background script +// */ + +// window.addEventListener("message", (event) => { +// if (port && event.source === window && event.data) { +// port.postMessage({ data: event.data }); +// } +// }); + +/******/ (() => { + // webpackBootstrap + /******/ "use strict"; + /******/ var __webpack_modules__ = { + /***/ 46: /***/ (module) => { + // Copyright Joyent, Inc. and other Node contributors. + // + // Permission is hereby granted, free of charge, to any person obtaining a + // copy of this software and associated documentation files (the + // "Software"), to deal in the Software without restriction, including + // without limitation the rights to use, copy, modify, merge, publish, + // distribute, sublicense, and/or sell copies of the Software, and to permit + // persons to whom the Software is furnished to do so, subject to the + // following conditions: + // + // The above copyright notice and this permission notice shall be included + // in all copies or substantial portions of the Software. + // + // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN + // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + + var R = typeof Reflect === "object" ? Reflect : null; + var ReflectApply = + R && typeof R.apply === "function" + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; + + var ReflectOwnKeys; + if (R && typeof R.ownKeys === "function") { + ReflectOwnKeys = R.ownKeys; + } else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target).concat( + Object.getOwnPropertySymbols(target) + ); + }; + } else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; + } + + function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); + } + + var NumberIsNaN = + Number.isNaN || + function NumberIsNaN(value) { + return value !== value; + }; + + function EventEmitter() { + EventEmitter.init.call(this); + } + module.exports = EventEmitter; + module.exports.once = once; + + // Backwards-compat with node 0.10.x + EventEmitter.EventEmitter = EventEmitter; + + EventEmitter.prototype._events = undefined; + EventEmitter.prototype._eventsCount = 0; + EventEmitter.prototype._maxListeners = undefined; + + // By default EventEmitters will print a warning if more than 10 listeners are + // added to it. This is a useful default which helps finding memory leaks. + var defaultMaxListeners = 10; + + function checkListener(listener) { + if (typeof listener !== "function") { + throw new TypeError( + 'The "listener" argument must be of type Function. Received type ' + + typeof listener + ); + } + } + + Object.defineProperty(EventEmitter, "defaultMaxListeners", { + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError( + 'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + + arg + + "." + ); + } + defaultMaxListeners = arg; + }, + }); + + EventEmitter.init = function () { + if ( + this._events === undefined || + this._events === Object.getPrototypeOf(this)._events + ) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; + }; + + // Obviously not all Emitters should be limited to 10. This function allows + // that to be increased. Set to zero for unlimited. + EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { + throw new RangeError( + 'The value of "n" is out of range. It must be a non-negative number. Received ' + + n + + "." + ); + } + this._maxListeners = n; + return this; + }; + + function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; + } + + EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); + }; + + EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = type === "error"; + + var events = this._events; + if (events !== undefined) + doError = doError && events.error === undefined; + else if (!doError) return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error( + "Unhandled error." + (er ? " (" + er.message + ")" : "") + ); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) return false; + + if (typeof handler === "function") { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); + } + + return true; + }; + + function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit( + "newListener", + type, + listener.listener ? listener.listener : listener + ); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === "function") { + // Adding the second element, need to change to array. + existing = events[type] = prepend + ? [listener, existing] + : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error( + "Possible EventEmitter memory leak detected. " + + existing.length + + " " + + String(type) + + " listeners " + + "added. Use emitter.setMaxListeners() to " + + "increase limit" + ); + w.name = "MaxListenersExceededWarning"; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; + } + + EventEmitter.prototype.addListener = function addListener( + type, + listener + ) { + return _addListener(this, type, listener, false); + }; + + EventEmitter.prototype.on = EventEmitter.prototype.addListener; + + EventEmitter.prototype.prependListener = function prependListener( + type, + listener + ) { + return _addListener(this, type, listener, true); + }; + + function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } + } + + function _onceWrap(target, type, listener) { + var state = { + fired: false, + wrapFn: undefined, + target: target, + type: type, + listener: listener, + }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; + } + + EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; + + EventEmitter.prototype.prependOnceListener = function prependOnceListener( + type, + listener + ) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + + // Emits a 'removeListener' event if and only if the listener was removed. + EventEmitter.prototype.removeListener = function removeListener( + type, + listener + ) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) return this; + + list = events[type]; + if (list === undefined) return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit("removeListener", type, list.listener || listener); + } + } else if (typeof list !== "function") { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) return this; + + if (position === 0) list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit("removeListener", type, originalListener || listener); + } + + return this; + }; + + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + + EventEmitter.prototype.removeAllListeners = function removeAllListeners( + type + ) { + var listeners, events, i; + + events = this._events; + if (events === undefined) return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === "removeListener") continue; + this.removeAllListeners(key); + } + this.removeAllListeners("removeListener"); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === "function") { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; + }; + + function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) return []; + + var evlistener = events[type]; + if (evlistener === undefined) return []; + + if (typeof evlistener === "function") + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap + ? unwrapListeners(evlistener) + : arrayClone(evlistener, evlistener.length); + } + + EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); + }; + + EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); + }; + + EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === "function") { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } + }; + + EventEmitter.prototype.listenerCount = listenerCount; + function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === "function") { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; + } + + EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; + }; + + function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) copy[i] = arr[i]; + return copy; + } + + function spliceOne(list, index) { + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; + list.pop(); + } + + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + + function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === "function") { + emitter.removeListener("error", errorListener); + } + resolve([].slice.call(arguments)); + } + + eventTargetAgnosticAddListener(emitter, name, resolver, { + once: true, + }); + if (name !== "error") { + addErrorHandlerIfEventEmitter(emitter, errorListener, { + once: true, + }); + } + }); + } + + function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === "function") { + eventTargetAgnosticAddListener(emitter, "error", handler, flags); + } + } + + function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === "function") { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === "function") { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError( + 'The "emitter" argument must be of type EventEmitter. Received type ' + + typeof emitter + ); + } + } + + /***/ + }, + + /******/ + }; + /************************************************************************/ + /******/ // The module cache + /******/ var __webpack_module_cache__ = {}; + /******/ + /******/ // The require function + /******/ function __webpack_require__(moduleId) { + /******/ // Check if module is in cache + /******/ var cachedModule = __webpack_module_cache__[moduleId]; + /******/ if (cachedModule !== undefined) { + /******/ return cachedModule.exports; + /******/ + } + /******/ // Create a new module (and put it into the cache) + /******/ var module = (__webpack_module_cache__[moduleId] = { + /******/ // no module.id needed + /******/ // no module.loaded needed + /******/ exports: {}, + /******/ + }); + /******/ + /******/ // Execute the module function + /******/ __webpack_modules__[moduleId]( + module, + module.exports, + __webpack_require__ + ); + /******/ + /******/ // Return the exports of the module + /******/ return module.exports; + /******/ + } + /******/ + /************************************************************************/ + /******/ /* webpack/runtime/global */ + /******/ (() => { + /******/ __webpack_require__.g = (function () { + /******/ if (typeof globalThis === "object") return globalThis; + /******/ try { + /******/ return this || new Function("return this")(); + /******/ + } catch (e) { + /******/ if (typeof window === "object") return window; + /******/ + } + /******/ + })(); + /******/ + })(); + /******/ + /************************************************************************/ + + // EXTERNAL MODULE: ../../node_modules/events/events.js + var events = __webpack_require__(46); // CONCATENATED MODULE: ../utils/src/typedEventEmitter.ts + /* +Usage example: +type EventMap = { + obj: { id: string }; + primitive: boolean | number | string | symbol; + noArgs: undefined; + multipleArgs: (a: number, b: string, c: boolean) => void; + [type: `dynamic/${string}`]: boolean; +}; */ -window.addEventListener("message", (event) => { - if (port && event.source === window && event.data) { - port.postMessage({ data: event.data }); + // NOTE: case 1. looks like case 4. but works differently. the order matters + + // 4. default + + // eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging + class TypedEmitter extends events.EventEmitter { + // implement at least one function + listenerCount(eventName) { + return super.listenerCount(eventName); + } + } // CONCATENATED MODULE: ../connect-common/src/storage.ts + // https://github.com/trezor/connect/blob/develop/src/js/storage/index.js + + const storageVersion = 2; + const storageName = `storage_v${storageVersion}`; + + /** + * remembered: + * - physical device from webusb pairing dialogue + * - passphrase to be used + */ + + // TODO: move storage somewhere else. Having it here brings couple of problems: + // - We can not import types from connect (would cause cyclic dependency) + // - it has here dependency on window object, not good + + const getEmptyState = () => ({ + origin: {}, + }); + let memoryStorage = getEmptyState(); + const getPermanentStorage = () => { + const ls = localStorage.getItem(storageName); + return ls ? JSON.parse(ls) : getEmptyState(); + }; + class Storage extends TypedEmitter { + save(getNewState, temporary = false) { + if (temporary || !__webpack_require__.g.window) { + memoryStorage = getNewState(memoryStorage); + return; + } + try { + const newState = getNewState(getPermanentStorage()); + localStorage.setItem(storageName, JSON.stringify(newState)); + this.emit("changed", newState); + } catch (err) { + // memory storage is fallback of the last resort + console.warn("long term storage not available"); + memoryStorage = getNewState(memoryStorage); + } + } + saveForOrigin(getNewState, origin, temporary = false) { + this.save( + (state) => ({ + ...state, + origin: { + ...state.origin, + [origin]: getNewState(state.origin?.[origin] || {}), + }, + }), + temporary + ); + } + load(temporary = false) { + if (temporary || !__webpack_require__.g?.window?.localStorage) { + return memoryStorage; + } + try { + return getPermanentStorage(); + } catch (err) { + // memory storage is fallback of the last resort + console.warn("long term storage not available"); + return memoryStorage; + } + } + loadForOrigin(origin, temporary = false) { + const state = this.load(temporary); + return state.origin?.[origin] || {}; + } + } + const storage = new Storage(); // CONCATENATED MODULE: ../utils/src/createDeferred.ts + + // unwrap promise response from Deferred + + const createDeferred = (id) => { + let localResolve = () => {}; + let localReject = () => {}; + const promise = new Promise((resolve, reject) => { + localResolve = resolve; + localReject = reject; + }); + return { + id, + resolve: localResolve, + reject: localReject, + promise, + }; + }; // CONCATENATED MODULE: ../utils/src/scheduleAction.ts + // Ignored when attempts is AttemptParams[] + + const isArray = (attempts) => Array.isArray(attempts); + const abortedBySignal = () => new Error("Aborted by signal"); + const abortedByDeadline = () => new Error("Aborted by deadline"); + const abortedByTimeout = () => new Error("Aborted by timeout"); + const resolveAfterMs = (ms, clear) => + new Promise((resolve, reject) => { + if (clear.aborted) return reject(); + if (ms === undefined) return resolve(); + let timeout; + const onClear = () => { + clearTimeout(timeout); + clear.removeEventListener("abort", onClear); + reject(); + }; + timeout = setTimeout(() => { + clear.removeEventListener("abort", onClear); + resolve(); + }, ms); + clear.addEventListener("abort", onClear); + }); + const rejectAfterMs = (ms, reason, clear) => + new Promise((_, reject) => { + if (clear.aborted) return reject(); + let timeout; + const onClear = () => { + clearTimeout(timeout); + clear.removeEventListener("abort", onClear); + reject(); + }; + timeout = setTimeout(() => { + clear.removeEventListener("abort", onClear); + reject(reason()); + }, ms); + clear.addEventListener("abort", onClear); + }); + const maybeRejectAfterMs = (ms, reason, clear) => + ms === undefined ? [] : [rejectAfterMs(ms, reason, clear)]; + const rejectWhenAborted = (signal, clear) => + new Promise((_, reject) => { + if (clear.aborted) return reject(); + if (signal?.aborted) return reject(abortedBySignal()); + const onAbort = () => reject(abortedBySignal()); + signal?.addEventListener("abort", onAbort); + const onClear = () => { + signal?.removeEventListener("abort", onAbort); + clear.removeEventListener("abort", onClear); + reject(); + }; + clear.addEventListener("abort", onClear); + }); + const resolveAction = async (action, clear) => { + const aborter = new AbortController(); + if (clear.aborted) aborter.abort(); + const onClear = () => { + clear.removeEventListener("abort", onClear); + aborter.abort(); + }; + clear.addEventListener("abort", onClear); + try { + return await new Promise((resolve) => resolve(action(aborter.signal))); + } finally { + if (!clear.aborted) clear.removeEventListener("abort", onClear); + } + }; + const attemptLoop = async (attempts, attempt, failure, clear) => { + // Tries only (attempts - 1) times, because the last attempt throws its error + for (let a = 0; a < attempts - 1; a++) { + if (clear.aborted) break; + const aborter = new AbortController(); + const onClear = () => aborter.abort(); + clear.addEventListener("abort", onClear); + try { + return await attempt(a, aborter.signal); + } catch (error) { + onClear(); + await failure(a, error); + } finally { + clear.removeEventListener("abort", onClear); + } + } + return clear.aborted ? Promise.reject() : attempt(attempts - 1, clear); + }; + const scheduleAction = async (action, params) => { + const { + signal, + delay, + attempts, + timeout, + deadline, + gap, + attemptFailureHandler, + } = params; + const deadlineMs = deadline && deadline - Date.now(); + const attemptCount = isArray(attempts) + ? attempts.length + : attempts ?? (deadline ? Infinity : 1); + const clearAborter = new AbortController(); + const clear = clearAborter.signal; + const getParams = isArray(attempts) + ? (attempt) => attempts[attempt] + : () => ({ + timeout, + gap, + }); + try { + return await Promise.race([ + rejectWhenAborted(signal, clear), + ...maybeRejectAfterMs(deadlineMs, abortedByDeadline, clear), + resolveAfterMs(delay, clear).then(() => + attemptLoop( + attemptCount, + (attempt, abort) => + Promise.race([ + ...maybeRejectAfterMs( + getParams(attempt).timeout, + abortedByTimeout, + clear + ), + resolveAction(action, abort), + ]), + (attempt, error) => { + const errorHandlerResult = attemptFailureHandler?.(error); + return errorHandlerResult + ? Promise.reject(errorHandlerResult) + : resolveAfterMs(getParams(attempt).gap ?? 0, clear); + }, + clear + ) + ), + ]); + } finally { + clearAborter.abort(); + } + }; // CONCATENATED MODULE: ../connect-common/src/messageChannel/abstract.ts + /** + * IMPORTS WARNING + * this file is bundled into content script so be careful what you are importing not to bloat the bundle + */ + + // TODO: so logger should be probably moved to connect common, or this file should be moved to connect + // import type { Log } from '@trezor/connect/src/utils/debug'; + + /** + * concepts: + * - it handshakes automatically with the other side of the channel + * - it queues messages fired before handshake and sends them after handshake is done + */ + class AbstractMessageChannel extends TypedEmitter { + messagePromises = {}; + /** queue of messages that were scheduled before handshake */ + messagesQueue = []; + messageID = 0; + isConnected = false; + handshakeMaxRetries = 5; + handshakeRetryInterval = 2000; + + /** + * function that passes data to the other side of the channel + */ + + /** + * channel identifiers that pairs AbstractMessageChannel instances on sending and receiving end together + */ + + constructor({ + sendFn, + channel, + logger, + lazyHandshake = false, + legacyMode = false, + }) { + super(); + this.channel = channel; + this.sendFn = sendFn; + this.lazyHandshake = lazyHandshake; + this.legacyMode = legacyMode; + this.logger = logger; + } + + /** + * initiates handshake sequence with peer. resolves after communication with peer is established + */ + init() { + if (!this.handshakeFinished) { + this.handshakeFinished = createDeferred(); + if (this.legacyMode) { + // Bypass handshake for communication with legacy components + // We add a delay for enough time for the other side to be ready + setTimeout(() => { + this.handshakeFinished?.resolve(); + }, 500); + } + if (!this.lazyHandshake) { + // When `lazyHandshake` handshakeWithPeer will start when received channel-handshake-request. + this.handshakeWithPeer(); + } + } + return this.handshakeFinished.promise; + } + + /** + * handshake between both parties of the channel. + * both parties initiate handshake procedure and keep asking over time in a loop until they time out or receive confirmation from peer + */ + handshakeWithPeer() { + this.logger?.log(this.channel.here, "handshake"); + return scheduleAction( + async () => { + this.postMessage( + { + type: "channel-handshake-request", + data: { + success: true, + payload: undefined, + }, + }, + { + usePromise: false, + useQueue: false, + } + ); + await this.handshakeFinished?.promise; + }, + { + attempts: this.handshakeMaxRetries, + timeout: this.handshakeRetryInterval, + } + ) + .then(() => { + this.logger?.log(this.channel.here, "handshake confirmed"); + this.messagesQueue.forEach((message) => { + message.channel = this.channel; + this.sendFn(message); + }); + this.messagesQueue = []; + }) + .catch(() => { + this.handshakeFinished?.reject(new Error("handshake failed")); + this.handshakeFinished = undefined; + }); + } + + /** + * message received from communication channel in descendants of this class + * should be handled by this common onMessage method + */ + onMessage(_message) { + // Older code used to send message as a data property of the message object. + // This is a workaround to keep backward compatibility. + let message = _message; + if ( + this.legacyMode && + message.type === undefined && + "data" in message && + typeof message.data === "object" && + message.data !== null && + "type" in message.data && + typeof message.data.type === "string" + ) { + // @ts-expect-error + message = message.data; + } + const { channel, id, type, payload, success } = message; + + // Don't verify channel in legacy mode + if (!this.legacyMode) { + if (!channel?.peer || channel.peer !== this.channel.here) { + // To wrong peer + return; + } + if (!channel?.here || this.channel.peer !== channel.here) { + // From wrong peer + return; + } + } + if (type === "channel-handshake-request") { + this.postMessage( + { + type: "channel-handshake-confirm", + data: { + success: true, + payload: undefined, + }, + }, + { + usePromise: false, + useQueue: false, + } + ); + if (this.lazyHandshake) { + // When received channel-handshake-request in lazyHandshake mode we start from this side. + this.handshakeWithPeer(); + } + return; + } + if (type === "channel-handshake-confirm") { + this.handshakeFinished?.resolve(undefined); + return; + } + if (this.messagePromises[id]) { + this.messagePromises[id].resolve({ + id, + payload, + success, + }); + delete this.messagePromises[id]; + } + const messagePromisesLength = Object.keys(this.messagePromises).length; + if (messagePromisesLength > 5) { + this.logger?.warn( + `too many message promises (${messagePromisesLength}). this feels unexpected!` + ); + } + + // @ts-expect-error TS complains for odd reasons + this.emit("message", message); + } + + // todo: outgoing messages should be typed + postMessage(message, { usePromise = true, useQueue = true } = {}) { + message.channel = this.channel; + if (!usePromise) { + try { + this.sendFn(message); + } catch (err) { + if (useQueue) { + this.messagesQueue.push(message); + } + } + return; + } + this.messageID++; + message.id = this.messageID; + this.messagePromises[message.id] = createDeferred(); + try { + this.sendFn(message); + } catch (err) { + if (useQueue) { + this.messagesQueue.push(message); + } + } + return this.messagePromises[message.id].promise; + } + resolveMessagePromises(resolvePayload) { + // This is used when we know that the connection has been interrupted but there might be something waiting for it. + Object.keys(this.messagePromises).forEach((id) => + this.messagePromises[id].resolve({ + id, + payload: resolvePayload, + }) + ); + } + clear() { + this.handshakeFinished = undefined; + } + } // CONCATENATED MODULE: ../connect-common/src/index.ts // CONCATENATED MODULE: ../connect-web/src/channels/window-serviceworker.ts + /** + * Communication channel between: + * - here: chrome message port (in service worker) + * - peer: window.onMessage in trezor-content-script + */ + + class WindowServiceWorkerChannel extends AbstractMessageChannel { + constructor({ name, channel }) { + super({ + channel, + sendFn: (message) => { + if (!this.port) throw new Error("port not assigned"); + this.port.postMessage(message); + }, + }); + const port = chrome.runtime.connect({ + name, + }); + this.port = port; + this.connect(); + } + connect() { + this.port?.onMessage.addListener((message) => { + if (message.channel.here === this.channel.here) return; + this.onMessage(message); + }); + this.isConnected = true; + } + disconnect() { + if (!this.isConnected) return; + this.port?.disconnect(); + this.isConnected = false; + } + } // CONCATENATED MODULE: ../connect/src/events/popup.ts + const POPUP = { + // Message called from popup.html inline script before "window.onload" event. This is first message from popup to window.opener. + BOOTSTRAP: "popup-bootstrap", + // Message from popup.js to window.opener, called after "window.onload" event. This is second message from popup to window.opener. + LOADED: "popup-loaded", + // Message from popup run in "core" mode. Connect core has been loaded, popup is ready to handle messages + // This is similar to IFRAME.LOADED message which signals the same but core is loaded in different context + CORE_LOADED: "popup-core-loaded", + // Message from window.opener to popup.js. Send settings to popup. This is first message from window.opener to popup. + INIT: "popup-init", + // Error message from popup to window.opener. Could be thrown during popup initialization process (POPUP.INIT) + ERROR: "popup-error", + // Message to webextensions, opens "trezor-usb-permission.html" within webextension + EXTENSION_USB_PERMISSIONS: "open-usb-permissions", + // Message called from both [popup > iframe] then [iframe > popup] in this exact order. + // Firstly popup call iframe to resolve popup promise in Core + // Then iframe reacts to POPUP.HANDSHAKE message and sends ConnectSettings, transport information and requested method details back to popup + HANDSHAKE: "popup-handshake", + // Event emitted from PopupManager at the end of popup closing process. + // Sent from popup thru window.opener to an iframe because message channel between popup and iframe is no longer available + CLOSED: "popup-closed", + // Message called from iframe to popup, it means that popup will not be needed (example: Blockchain methods are not using popup at all) + // This will close active popup window and/or clear opening process in PopupManager (maybe popup wasn't opened yet) + CANCEL_POPUP_REQUEST: "ui-cancel-popup-request", + // Message called from inline element in popup.html (window.closeWindow), this is used only with webextensions to properly handle popup close event + CLOSE_WINDOW: "window.close", + // todo: shouldn't it be UI_RESPONSE? + ANALYTICS_RESPONSE: "popup-analytics-response", + /** webextension injected content script and content script notified popup */ + CONTENT_SCRIPT_LOADED: "popup-content-script-loaded", + /** method.info async getter result passed from core to popup */ + METHOD_INFO: "popup-method-info", + }; + const createPopupMessage = (type, payload) => ({ + event: UI_EVENT, + type, + payload, + }); // CONCATENATED MODULE: ../connect/src/data/version.ts + const VERSION = "9.4.1"; + const versionN = VERSION.split(".").map((s) => parseInt(s, 10)); + const isBeta = VERSION.includes("beta"); + const DEFAULT_DOMAIN = + /* unused pure expression or super */ null && + (isBeta + ? `https://connect.trezor.io/${VERSION}/` + : `https://connect.trezor.io/${versionN[0]}/`); + + // Increment with content script changes + const CONTENT_SCRIPT_VERSION = 1; // CONCATENATED MODULE: ./src/contentScript.ts + function trezorContentScript() { + // Check if extension ID matches the popup URL + const urlParams = new URLSearchParams(window.location.search); + const targetExtensionId = urlParams.get("extension-id"); + if (targetExtensionId && targetExtensionId !== chrome.runtime.id) { + return; + } + + /** + * communication between service worker and both webextension and popup manager + */ + const channel = new WindowServiceWorkerChannel({ + name: "trezor-connect", + channel: { + here: "@trezor/connect-content-script", + peer: "@trezor/connect-webextension", + }, + }); + + /** + * messages that were sent before the channel was initialized + */ + const messagesQueue = []; + let channelReady = false; + + /** + * Firefox enforces some restrictions on the content script that force us to use clones of objects when passing them between the content script and the background script + */ + function clone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + + /* + * Passing messages from popup to service worker + */ + window.addEventListener("message", (event) => { + if (event.data?.channel?.here === "@trezor/connect-webextension") { + return; + } + if (event.data?.type === POPUP.LOADED) { + window.postMessage( + { + type: POPUP.CONTENT_SCRIPT_LOADED, + payload: { + ...chrome.runtime.getManifest(), + id: chrome.runtime.id, + contentScriptVersion: CONTENT_SCRIPT_VERSION, + }, + }, + window.location.origin + ); + } + if (event.source === window && event.data) { + if (channelReady) { + channel.postMessage(clone(event.data), { + usePromise: false, + }); + } else { + messagesQueue.push(event.data); + } + } + }); + channel.init().then(() => { + channelReady = true; + + /** + * Passing messages from service worker to popup + */ + channel.on("message", (message) => { + window.postMessage(clone(message), window.location.origin); + }); + + // Send messages that have gathered before the channel was initialized + while (messagesQueue.length > 0) { + const message = messagesQueue.shift(); + channel.postMessage(clone(message), { + usePromise: false, + }); + } + window.addEventListener("beforeunload", () => { + window.postMessage( + { + type: POPUP.CLOSED, + }, + window.location.origin + ); + }); + }); } -}); + trezorContentScript(); + /******/ +})(); diff --git a/packages/extension/src/manifest/base.json b/packages/extension/src/manifest/base.json index 78b5e608a..3527039c4 100644 --- a/packages/extension/src/manifest/base.json +++ b/packages/extension/src/manifest/base.json @@ -36,7 +36,7 @@ "all_frames": false }, { - "matches": ["*://connect.trezor.io/*/popup.html"], + "matches": ["*://connect.trezor.io/*/*"], "js": ["vendor/trezor-content-script.js"], "run_at": "document_start" } diff --git a/packages/extension/src/manifest/manifest-edge-opera.json b/packages/extension/src/manifest/manifest-edge-opera.json index a01078f32..42d62a514 100644 --- a/packages/extension/src/manifest/manifest-edge-opera.json +++ b/packages/extension/src/manifest/manifest-edge-opera.json @@ -22,7 +22,7 @@ "all_frames": false }, { - "matches": ["*://connect.trezor.io/*/popup.html"], + "matches": ["*://connect.trezor.io/*/*"], "js": ["vendor/trezor-content-script.js"], "run_at": "document_start" } diff --git a/packages/extension/src/manifest/manifest-firefox.json b/packages/extension/src/manifest/manifest-firefox.json index 79e361684..778079076 100644 --- a/packages/extension/src/manifest/manifest-firefox.json +++ b/packages/extension/src/manifest/manifest-firefox.json @@ -32,7 +32,7 @@ "all_frames": false }, { - "matches": ["*://connect.trezor.io/*/popup.html"], + "matches": ["*://connect.trezor.io/*/*"], "js": ["vendor/trezor-content-script.js"], "run_at": "document_start" } diff --git a/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts b/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts index ac616dbb5..7b318c871 100644 --- a/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts +++ b/packages/extension/src/providers/bitcoin/libs/bip322-message-sign.ts @@ -96,16 +96,14 @@ const encodeVarString = (b: Buffer) => { return Buffer.concat([encode(b.byteLength), b]); }; -export async function signMessageOfBIP322Simple({ +export function getPSBTMessageOfBIP322Simple({ message, address, network, - Signer, }: { message: string; address: string; network: BitcoinNetwork; - Signer: ReturnType; }) { const outputScript = BTCAddress.toOutputScript( network.displayAddress(address), @@ -132,6 +130,7 @@ export async function signMessageOfBIP322Simple({ txToSpend.version = 0; txToSpend.addInput(prevoutHash, prevoutIndex, sequence, scriptSig); txToSpend.addOutput(outputScript, 0); + const psbtToSign = new Psbt(); psbtToSign.setVersion(0); psbtToSign.addInput({ @@ -142,21 +141,20 @@ export async function signMessageOfBIP322Simple({ script: outputScript, value: 0, }, + bip32Derivation: [ + { + masterFingerprint: Buffer.from("4ab28551", "hex"), // this will be replaced in hw signer + pubkey: hexToBuffer(address), + path: "m/84'/0'/0'/0/0", // this will be replaced in hw signer + }, + ], }); psbtToSign.addOutput({ script: Buffer.from("6a", "hex"), value: 0 }); - await psbtToSign.signAllInputsAsync(Signer); - psbtToSign.finalizeAllInputs(); - const txToSign = psbtToSign.extractTransaction(); - - const len = encode(txToSign.ins[0].witness.length); - const result = Buffer.concat([ - len, - ...txToSign.ins[0].witness.map((w) => encodeVarString(w)), - ]); - const signature = result.toString("base64"); - - return signature; + return { + psbtToSign, + txdata: txToSpend, + }; } export function getSignatureFromSignedTransaction(strTx: string): string { @@ -170,79 +168,25 @@ export function getSignatureFromSignedTransaction(strTx: string): string { return signature; } -export function getPSBTMessageOfBIP322Simple({ + +export async function signMessageOfBIP322Simple({ message, address, network, + Signer, }: { message: string; address: string; network: BitcoinNetwork; + Signer: ReturnType; }) { - const outputScript = BTCAddress.toOutputScript( - network.displayAddress(address), - network.networkInfo - ); - const addressType = network.networkInfo.paymentType; - const supportedTypes = [PaymentType.P2WPKH]; - if (supportedTypes.includes(addressType) == false) { - throw new Error("Not support address type to sign"); - } - - const prevoutHash = Buffer.from( - "0000000000000000000000000000000000000000000000000000000000000000", - "hex" - ); - const prevoutIndex = 0xffffffff; - const sequence = 0; - const scriptSig = Buffer.concat([ - Buffer.from("0020", "hex"), - Buffer.from(bip0322_hash(message), "hex"), - ]); - - const txToSpend = new Transaction(); - txToSpend.version = 0; - txToSpend.addInput(prevoutHash, prevoutIndex, sequence, scriptSig); - txToSpend.addOutput(outputScript, 0); - - const psbtToSign = new Psbt(); - psbtToSign.setVersion(0); - psbtToSign.addInput({ - hash: txToSpend.getHash(), - index: 0, - sequence: 0, - witnessUtxo: { - script: outputScript, - value: 0, - }, - bip32Derivation: [ - { - masterFingerprint: Buffer.from("4ab28551", "hex"), - pubkey: hexToBuffer(address), - path: "m/84'/0'/0'/0/0", - }, - ], - }); - psbtToSign.addOutput({ script: Buffer.from("6a", "hex"), value: 0 }); - - return { - psbtToSign, - txdata: txToSpend.toHex(), - }; - // await psbtToSign.signAllInputsAsync(Signer); - // psbtToSign.finalizeAllInputs(); - // const txToSign = psbtToSign.extractTransaction(); - - // const encodeVarString = (b: Buffer) => { - // return Buffer.concat([encode(b.byteLength), b]); - // }; - - // const len = encode(txToSign.ins[0].witness.length); - // const result = Buffer.concat([ - // len, - // ...txToSign.ins[0].witness.map((w) => encodeVarString(w)), - // ]); - // const signature = result.toString("base64"); - - // return signature; + const psbtToSign = getPSBTMessageOfBIP322Simple({ + message, + address, + network, + }).psbtToSign; + await psbtToSign.signAllInputsAsync(Signer); + psbtToSign.finalizeAllInputs(); + const txToSign = psbtToSign.extractTransaction(); + return getSignatureFromSignedTransaction(txToSign.toHex()); } diff --git a/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue b/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue index 219ff065e..5d43e8a1b 100644 --- a/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue +++ b/packages/extension/src/providers/bitcoin/ui/btc-sign-message.vue @@ -6,7 +6,7 @@ @@ -55,6 +55,7 @@ import SignLogo from "@action/icons/common/sign-logo.vue"; import BaseButton from "@action/components/base-button/index.vue"; import CommonPopup from "@action/views/common-popup/index.vue"; +import HardwareWalletMsg from "@/providers/common/ui/verify-transaction/hardware-wallet-msg.vue"; import { getError } from "@/libs/error"; import { ErrorCodes } from "@/providers/ethereum/types"; import { WindowPromiseHandler } from "@/libs/window-promise"; @@ -82,6 +83,7 @@ const Options = ref({ const message = ref(""); const type = ref(""); +const isProcessing = ref(false); onBeforeMount(async () => { const { Request, options } = await windowPromise; network.value = (await getNetworkByName( @@ -97,6 +99,7 @@ onBeforeMount(async () => { const approve = async () => { const { Request, Resolve } = await windowPromise; const msg = Request.value.params![0] as string; + isProcessing.value = true; MessageSigner({ account: account.value, network: network.value as BitcoinNetwork, diff --git a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts index 15f628e63..93a654124 100644 --- a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts +++ b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts @@ -104,7 +104,6 @@ const MessageSigner = ( options: SignerMessageOptions ): Promise => { const { account, payload, network } = options; - console.log(options); if (account.isHardware) { const psbtToSign = getPSBTMessageOfBIP322Simple({ address: account.address, @@ -117,6 +116,7 @@ const MessageSigner = ( message: payload, type: options.type as any, psbtTx: psbtToSign.psbtToSign, + inputTx: psbtToSign.txdata, networkName: network.name, pathIndex: account.pathIndex.toString(), pathType: { @@ -127,13 +127,11 @@ const MessageSigner = ( }) .then((strTx: string) => { const sig = getSignatureFromSignedTransaction(strTx); - console.log(sig); return { result: JSON.stringify(sig), }; }) .catch((e: any) => { - console.log(e); return { error: e.message, }; diff --git a/packages/extension/src/providers/ethereum/ui/eth-sign-message.vue b/packages/extension/src/providers/ethereum/ui/eth-sign-message.vue index b8c42e44f..d90808237 100644 --- a/packages/extension/src/providers/ethereum/ui/eth-sign-message.vue +++ b/packages/extension/src/providers/ethereum/ui/eth-sign-message.vue @@ -6,7 +6,7 @@ @@ -55,6 +55,7 @@ import { hexToUtf8 } from "web3-utils"; import { DEFAULT_EVM_NETWORK, getNetworkByName } from "@/libs/utils/networks"; import { ProviderRequestOptions } from "@/types/provider"; import { isUtf8 } from "@polkadot/util"; +import HardwareWalletMsg from "@/providers/common/ui/verify-transaction/hardware-wallet-msg.vue"; import { EvmNetwork } from "../types/evm-network"; import { EnkryptAccount } from "@enkryptcom/types"; import { MessageSigner } from "./libs/signer"; @@ -73,7 +74,7 @@ const Options = ref({ url: "", tabId: 0, }); - +const isProcessing = ref(false); const message = ref(""); onBeforeMount(async () => { const { Request, options } = await windowPromise; @@ -91,6 +92,7 @@ onBeforeMount(async () => { const approve = async () => { const { Request, Resolve } = await windowPromise; const msg = Request.value.params![0] as `0x{string}`; + isProcessing.value = true; MessageSigner({ account: account.value, network: network.value, diff --git a/packages/hw-wallets/package.json b/packages/hw-wallets/package.json index 85220f424..4faf4ffb3 100644 --- a/packages/hw-wallets/package.json +++ b/packages/hw-wallets/package.json @@ -57,8 +57,8 @@ "@ledgerhq/live-common": "^34.1.0", "@polkadot/types": "^12.4.2", "@polkadot/util": "^13.0.2", - "@trezor/connect": "^9.4.0", - "@trezor/connect-web": "^9.4.0", + "@trezor/connect": "^9.4.1", + "@trezor/connect-webextension": "^9.4.1", "@zondax/ledger-substrate": "^1.0.0", "bitcoinjs-lib": "^6.1.6", "bs58": "^6.0.0", diff --git a/packages/hw-wallets/src/ledger/bitcoin/index.ts b/packages/hw-wallets/src/ledger/bitcoin/index.ts index 12157094f..42b2d649d 100644 --- a/packages/hw-wallets/src/ledger/bitcoin/index.ts +++ b/packages/hw-wallets/src/ledger/bitcoin/index.ts @@ -110,9 +110,11 @@ class LedgerBitcoin implements HWWalletProvider { } const client = new AppClient(this.transport as any); const fpr = await client.getMasterFingerprint(); - const pathElems: number[] = pathStringToArray( - options.pathType.path.replace(`{index}`, options.pathIndex) + const accountPath = options.pathType.path.replace( + `{index}`, + options.pathIndex ); + const pathElems: number[] = pathStringToArray(accountPath); const rootPath = pathElems.slice(0, -2); const accountRootPubkey = await client.getExtendedPubkey( pathArrayToString(rootPath), @@ -120,28 +122,18 @@ class LedgerBitcoin implements HWWalletProvider { ); options.psbtTx.data.inputs[0].bip32Derivation[0].masterFingerprint = Buffer.from(fpr, "hex"); - options.psbtTx.data.inputs[0].bip32Derivation[0].path = - options.pathType.path.replace(`{index}`, options.pathIndex); - + options.psbtTx.data.inputs[0].bip32Derivation[0].path = accountPath; options.psbtTx.updateGlobal({ globalXpub: [ { - extendedPubkey: Buffer.from(bs58.decode(accountRootPubkey)).slice( - 0, - -4 - ), + extendedPubkey: Buffer.from( + bs58.decode(accountRootPubkey) + ).subarray(0, -4), masterFingerprint: Buffer.from(fpr, "hex"), - path: options.pathType.path.replace(`{index}`, options.pathIndex), + path: accountPath, }, ], }); - console.log(options.psbtTx); - console.log( - fpr, - pathArrayToString(rootPath), - pathArrayToString(rootPath).replace("/m", "") - ); - // eslint-disable-next-line @typescript-eslint/no-empty-function const accountPolicy = new DefaultWalletPolicy( "wpkh(@0/**)", `[${fpr}/${pathArrayToString(rootPath).replace( @@ -149,7 +141,6 @@ class LedgerBitcoin implements HWWalletProvider { "" )}]${accountRootPubkey}` ); - console.log(accountPolicy); const sigs = await client.signPsbt( options.psbtTx.toBase64(), accountPolicy, diff --git a/packages/hw-wallets/src/trezor/bitcoin/index.ts b/packages/hw-wallets/src/trezor/bitcoin/index.ts index e2b46dc78..28156c76d 100644 --- a/packages/hw-wallets/src/trezor/bitcoin/index.ts +++ b/packages/hw-wallets/src/trezor/bitcoin/index.ts @@ -1,15 +1,15 @@ -import TrezorConnect from "@trezor/connect-web"; +import TrezorConnect from "@trezor/connect-webextension"; import { getHDPath } from "@trezor/connect/lib/utils/pathUtils"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; import HDKey from "hdkey"; import { bufferToHex } from "@enkryptcom/utils"; import { AddressResponse, + BitcoinSignMessage, BTCSignTransaction, getAddressRequest, HWWalletProvider, PathType, - SignMessageRequest, SignTransactionRequest, } from "../../types"; import { supportedPaths, TrezorNetworkConfigs } from "./configs"; @@ -25,9 +25,14 @@ class TrezorEthereum implements HWWalletProvider { } async init(): Promise { - TrezorConnect.manifest({ - email: "info@enkrypt.com", - appUrl: "https://www.enkrypt.com", + TrezorConnect.init({ + manifest: { + email: "info@enkrypt.com", + appUrl: "https://www.enkrypt.com", + }, + transports: ["BridgeTransport", "WebUsbTransport"], + connectSrc: "https://connect.trezor.io/9/", + _extendWebextensionLifetime: true, }); return true; } @@ -40,7 +45,7 @@ class TrezorEthereum implements HWWalletProvider { const rootPub = await TrezorConnect.getPublicKey({ path: options.pathType.basePath, showOnTrezor: options.confirmAddress, - }); + } as any); if (!rootPub.payload) { throw new Error("popup failed to open"); } @@ -73,12 +78,15 @@ class TrezorEthereum implements HWWalletProvider { return Promise.resolve(true); } - async signPersonalMessage(options: SignMessageRequest): Promise { + async signPersonalMessage(options: BitcoinSignMessage): Promise { + if (options.type === "bip322-simple") { + throw new Error("trezor-bitcoin: bip322 signing not supported"); + } const result = await TrezorConnect.signMessage({ path: options.pathType.path.replace(`{index}`, options.pathIndex), message: options.message.toString("hex"), hex: true, - }); + } as any); if (!result.success) throw new Error((result.payload as any).error as string); return bufferToHex(Buffer.from(result.payload.signature, "base64")); @@ -100,11 +108,14 @@ class TrezorEthereum implements HWWalletProvider { ? "SPENDWITNESS" : "SPENDADDRESS", })), - outputs: transactionOptions.psbtTx.txOutputs.map((out) => ({ - amount: out.value, - address: out.address, - script_type: "PAYTOADDRESS", - })), + outputs: transactionOptions.psbtTx.txOutputs.map( + (out) => + ({ + amount: out.value, + address: out.address, + script_type: "PAYTOADDRESS", + } as any) + ), }).then((res) => { if (!res.success) throw new Error((res.payload as any).error as string); return res.payload.serializedTx; diff --git a/packages/hw-wallets/src/trezor/ethereum/index.ts b/packages/hw-wallets/src/trezor/ethereum/index.ts index 402f7e9aa..0ec432f3c 100644 --- a/packages/hw-wallets/src/trezor/ethereum/index.ts +++ b/packages/hw-wallets/src/trezor/ethereum/index.ts @@ -1,4 +1,4 @@ -import TrezorConnect from "@trezor/connect-web"; +import TrezorConnect from "@trezor/connect-webextension"; import { HWwalletCapabilities, NetworkNames } from "@enkryptcom/types"; import HDKey from "hdkey"; import { bigIntToHex, bufferToHex, hexToBuffer } from "@enkryptcom/utils"; @@ -25,9 +25,14 @@ class TrezorEthereum implements HWWalletProvider { } async init(): Promise { - TrezorConnect.manifest({ - email: "info@enkrypt.com", - appUrl: "https://www.enkrypt.com", + TrezorConnect.init({ + manifest: { + email: "info@enkrypt.com", + appUrl: "https://www.enkrypt.com", + }, + transports: ["BridgeTransport", "WebUsbTransport"], + connectSrc: "https://connect.trezor.io/9/", + _extendWebextensionLifetime: true, }); return true; } @@ -44,8 +49,7 @@ class TrezorEthereum implements HWWalletProvider { if (!rootPub.payload) { throw new Error("popup failed to open"); } - if (!rootPub.success) - throw new Error((rootPub.payload as any).error as string); + if (!rootPub.success) throw new Error(rootPub.payload.error as string); const hdKey = new HDKey(); hdKey.publicKey = Buffer.from(rootPub.payload.publicKey, "hex"); @@ -79,8 +83,7 @@ class TrezorEthereum implements HWWalletProvider { message: options.message.toString("hex"), hex: true, }); - if (!result.success) - throw new Error((result.payload as any).error as string); + if (!result.success) throw new Error(result.payload.error as string); return bufferToHex(hexToBuffer(result.payload.signature)); } @@ -104,8 +107,7 @@ class TrezorEthereum implements HWWalletProvider { gasPrice: bigIntToHex(tx.gasPrice), }, }).then((result) => { - if (!result.success) - throw new Error((result.payload as any).error as string); + if (!result.success) throw new Error(result.payload.error as string); const rv = BigInt(parseInt(result.payload.v, 16)); const cv = tx.common.chainId() * 2n + 35n; return toRpcSig( @@ -125,8 +127,7 @@ class TrezorEthereum implements HWWalletProvider { maxPriorityFeePerGas: bigIntToHex(tx.maxPriorityFeePerGas), }, }).then((result) => { - if (!result.success) - throw new Error((result.payload as any).error as string); + if (!result.success) throw new Error(result.payload.error as string); return toRpcSig( BigInt(result.payload.v), hexToBuffer(result.payload.r), diff --git a/packages/hw-wallets/src/types.ts b/packages/hw-wallets/src/types.ts index 5c6e5dfe9..6a5e71aee 100644 --- a/packages/hw-wallets/src/types.ts +++ b/packages/hw-wallets/src/types.ts @@ -4,7 +4,7 @@ import type { LegacyTransaction, } from "@ethereumjs/tx"; import type { ExtrinsicPayload } from "@polkadot/types/interfaces"; -import type { Psbt } from "bitcoinjs-lib"; +import type { Psbt, Transaction } from "bitcoinjs-lib"; export type WalletConfigs = Record; @@ -48,6 +48,7 @@ export interface BitcoinSignMessage extends BaseRequest { message: Buffer; type: "bip322-simple" | "classic"; psbtTx?: Psbt; + inputTx?: Transaction; } export type SignMessageRequest = GenericSignMessage | BitcoinSignMessage; From 2d0c3e3092c7706568e1327ab396cff96d3e43e7 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:32:06 -0700 Subject: [PATCH 337/375] devop: add bip322 support for ledger --- .../extension/src/providers/bitcoin/ui/libs/signer.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts index 93a654124..2ef9ba2ab 100644 --- a/packages/extension/src/providers/bitcoin/ui/libs/signer.ts +++ b/packages/extension/src/providers/bitcoin/ui/libs/signer.ts @@ -133,7 +133,10 @@ const MessageSigner = ( }) .catch((e: any) => { return { - error: e.message, + error: { + message: e.message, + code: -1, + }, }; }); } else { @@ -152,7 +155,10 @@ const MessageSigner = ( }) .catch((e) => { return { - error: e.message, + error: { + message: e.message, + code: -1, + }, }; }); } else { From 268f71fe1dbb39f1f6ea8b0db9eb2420234d8b7b Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:33:46 -0700 Subject: [PATCH 338/375] devop: update yarn lock --- yarn.lock | 280 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 164 insertions(+), 116 deletions(-) diff --git a/yarn.lock b/yarn.lock index 098cfb039..49d5ec760 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3018,8 +3018,8 @@ __metadata: "@ledgerhq/live-common": ^34.1.0 "@polkadot/types": ^12.4.2 "@polkadot/util": ^13.0.2 - "@trezor/connect": 9.4.0 - "@trezor/connect-web": 9.4.0 + "@trezor/connect": ^9.4.1 + "@trezor/connect-webextension": ^9.4.1 "@types/chai": ^4.3.19 "@types/mocha": ^10.0.7 "@types/node": ^20.16.5 @@ -8033,10 +8033,10 @@ __metadata: languageName: node linkType: hard -"@sinclair/typebox@npm:^0.31.28": - version: 0.31.28 - resolution: "@sinclair/typebox@npm:0.31.28" - checksum: 0dd8e11bb608a28f8db6aa6166a354453126249e5bbf4442654ba1c520bd10a55d0beb4cb294f4834a7619efa833a870a31902933a46548bfc24d0e0710576d2 +"@sinclair/typebox@npm:^0.33.7": + version: 0.33.12 + resolution: "@sinclair/typebox@npm:0.33.12" + checksum: 1aed993c9308ffc9c2a4b64da5ca76536fcd66f43a97879bb85c3cdee0b44d2f315003f74510a4e82160ee05a77d6dd6210d7052f1237bf52478df97806321b3 languageName: node linkType: hard @@ -9212,128 +9212,143 @@ __metadata: languageName: node linkType: hard -"@trezor/analytics@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/analytics@npm:1.2.0" +"@trezor/analytics@npm:1.2.1": + version: 1.2.1 + resolution: "@trezor/analytics@npm:1.2.1" dependencies: "@trezor/env-utils": 1.2.0 - "@trezor/utils": 9.2.0 + "@trezor/utils": 9.2.1 peerDependencies: tslib: ^2.6.2 - checksum: 652dea1b54515c10931fe67671a5043b22557629224da3ae8fff153a4a9af45eb27c7cc2cdef68e0dbfab53b7544df0dce1a903adf4e0c0c27531a6abc1d2a19 + checksum: 3fd7bbb524547fde1918d85021e02fbb1f07c82207b1c7dceda9687de9cdbec48eb954a9a5ee5054198eef6cb6f3ec58c36c3d289352a80e0e7bc55657a416de languageName: node linkType: hard -"@trezor/blockchain-link-types@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/blockchain-link-types@npm:1.2.0" +"@trezor/blockchain-link-types@npm:1.2.1": + version: 1.2.1 + resolution: "@trezor/blockchain-link-types@npm:1.2.1" dependencies: "@solana/web3.js": ^1.95.0 "@trezor/type-utils": 1.1.0 - "@trezor/utxo-lib": 2.2.0 + "@trezor/utxo-lib": 2.2.1 socks-proxy-agent: 6.1.1 peerDependencies: tslib: ^2.6.2 - checksum: 622c2b23cc4f9c9f660f676cea43292c4b0ea9af0abb5b7879bc28bdece24f0ecaaa46492a13f4ffc3791113fc9342c695fc2838db690727b7273f74559d21b7 + checksum: 29a0628fad9dab931e8f8444f80e328274327c04bdd5118652d11dc018858aa8c35ebdb20c1e21de5942ded11a89728ca90c59921e5ee6c69af9f4226aa80610 languageName: node linkType: hard -"@trezor/blockchain-link-utils@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/blockchain-link-utils@npm:1.2.0" +"@trezor/blockchain-link-utils@npm:1.2.1": + version: 1.2.1 + resolution: "@trezor/blockchain-link-utils@npm:1.2.1" dependencies: "@mobily/ts-belt": ^3.13.1 "@solana/web3.js": ^1.95.0 "@trezor/env-utils": 1.2.0 - "@trezor/utils": 9.2.0 + "@trezor/utils": 9.2.1 peerDependencies: tslib: ^2.6.2 - checksum: 172f0d52470048af0cd6af19e5f05a718c3dc78a087bc311ab7a24445cfc495a63f447a542d49746b3d31f4cb6377190a32f5fccbed98db17cc8e36999c6945b + checksum: 49856fd7cbc4deac6c2d8ef8e2419546631832e9811b87944ed528adfa4710606e88db92d8b4547489739549a6ed48ba6d687f7291517dd04c32425be95f20ee languageName: node linkType: hard -"@trezor/blockchain-link@npm:2.3.0": - version: 2.3.0 - resolution: "@trezor/blockchain-link@npm:2.3.0" +"@trezor/blockchain-link@npm:2.3.1": + version: 2.3.1 + resolution: "@trezor/blockchain-link@npm:2.3.1" dependencies: "@solana/buffer-layout": ^4.0.1 "@solana/web3.js": ^1.95.0 - "@trezor/blockchain-link-types": 1.2.0 - "@trezor/blockchain-link-utils": 1.2.0 - "@trezor/utils": 9.2.0 - "@trezor/utxo-lib": 2.2.0 - "@types/web": ^0.0.138 + "@trezor/blockchain-link-types": 1.2.1 + "@trezor/blockchain-link-utils": 1.2.1 + "@trezor/utils": 9.2.1 + "@trezor/utxo-lib": 2.2.1 + "@types/web": ^0.0.162 events: ^3.3.0 ripple-lib: ^1.10.1 socks-proxy-agent: 6.1.1 ws: ^8.18.0 peerDependencies: tslib: ^2.6.2 - checksum: d2f5cee0c58e30d8c1ce153f4d0fbce5222897d73850896e328d79f817bf56f2df29929e9627b289d9d08d85eea170c91a097b86a2d8a850cd3c8ae72edbe804 + checksum: 9eccc6f1850ff80b1d10eb9177310d0b29d62a55a5ebf3bb316be3d40631a09364c77a5b8b69c21be1758593f529a70c78ce5ea811e06df1824af144ac4720f2 languageName: node linkType: hard -"@trezor/connect-analytics@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/connect-analytics@npm:1.2.0" +"@trezor/connect-analytics@npm:1.2.1": + version: 1.2.1 + resolution: "@trezor/connect-analytics@npm:1.2.1" dependencies: - "@trezor/analytics": 1.2.0 + "@trezor/analytics": 1.2.1 peerDependencies: tslib: ^2.6.2 - checksum: 15763dc7ddd3c8b8033c9e14cce2104639b47b1e5c4f1faabe61d4275ad2ab00368216949d1085d17b6ba1c106ab2ee3627a0afb4923152e71eb9f92db5c4459 + checksum: 5982184c4551ae8767e193402a01ea1852a27e05a8278eb710646dfaefd923d5edc7d078fb52d283b156a0d7544f71b3b99d72fadb6eaba93c125a1d7787aea4 languageName: node linkType: hard -"@trezor/connect-common@npm:0.2.0": - version: 0.2.0 - resolution: "@trezor/connect-common@npm:0.2.0" +"@trezor/connect-common@npm:0.2.1": + version: 0.2.1 + resolution: "@trezor/connect-common@npm:0.2.1" dependencies: "@trezor/env-utils": 1.2.0 - "@trezor/utils": 9.2.0 + "@trezor/utils": 9.2.1 peerDependencies: tslib: ^2.6.2 - checksum: 684b5c0ca2c360856d557dabf6be4175d6675847cdab22fdcc630c8d4d5815e9aacbaf52d825415120bf1f61871486d1794e7ddbe6505600c8c2d2a764618bd1 + checksum: 1f95a1d904158119df4327a0dc860dc887751b950b3e6aadadbd24ba8ccd8979ffbff54de6a4c837558d316ac76b187965b83ce49190c5cd2306deed7a6a6c4d languageName: node linkType: hard -"@trezor/connect-web@npm:9.4.0": - version: 9.4.0 - resolution: "@trezor/connect-web@npm:9.4.0" +"@trezor/connect-web@npm:9.4.1": + version: 9.4.1 + resolution: "@trezor/connect-web@npm:9.4.1" dependencies: - "@trezor/connect": 9.4.0 - "@trezor/connect-common": 0.2.0 - "@trezor/utils": 9.2.0 + "@trezor/connect": 9.4.1 + "@trezor/connect-common": 0.2.1 + "@trezor/utils": 9.2.1 peerDependencies: tslib: ^2.6.2 - checksum: 608762153034ca63e89a0723b44d99f59d9efffddb5f29152f26ed7d9bdf56ab230cce68919982b8e7eb266367a7f16cc65a38a9b61c7c676c54735060f9e1a0 + checksum: e984d2e55a0a1e84d83280ae32b68a9284e155798f491dc0aec65a3395dbb18834392555c8030e51e958d957aafb932916bd7fbdc857e19cd8d5ff3eb1c60089 languageName: node linkType: hard -"@trezor/connect@npm:9.4.0": - version: 9.4.0 - resolution: "@trezor/connect@npm:9.4.0" +"@trezor/connect-webextension@npm:^9.4.1": + version: 9.4.1 + resolution: "@trezor/connect-webextension@npm:9.4.1" + dependencies: + "@trezor/connect": 9.4.1 + "@trezor/connect-common": 0.2.1 + "@trezor/connect-web": 9.4.1 + "@trezor/utils": 9.2.1 + events: ^3.3.0 + peerDependencies: + tslib: ^2.6.2 + checksum: b13de0a5effd4e80fe1fc5c2b4870b20b80733ceed7f149af342f1cb81e32c8215eee140ab016fe78167811cc00e3a3d164a4d8aa5adfd49877b9f3f8e041bc3 + languageName: node + linkType: hard + +"@trezor/connect@npm:9.4.1, @trezor/connect@npm:^9.4.1": + version: 9.4.1 + resolution: "@trezor/connect@npm:9.4.1" dependencies: "@babel/preset-typescript": ^7.24.7 "@ethereumjs/common": ^4.3.0 "@ethereumjs/tx": ^5.3.0 "@fivebinaries/coin-selection": 2.2.1 - "@trezor/blockchain-link": 2.3.0 - "@trezor/blockchain-link-types": 1.2.0 - "@trezor/connect-analytics": 1.2.0 - "@trezor/connect-common": 0.2.0 - "@trezor/protobuf": 1.2.0 - "@trezor/protocol": 1.2.0 - "@trezor/schema-utils": 1.2.0 - "@trezor/transport": 1.3.0 - "@trezor/utils": 9.2.0 - "@trezor/utxo-lib": 2.2.0 + "@trezor/blockchain-link": 2.3.1 + "@trezor/blockchain-link-types": 1.2.1 + "@trezor/connect-analytics": 1.2.1 + "@trezor/connect-common": 0.2.1 + "@trezor/protobuf": 1.2.1 + "@trezor/protocol": 1.2.1 + "@trezor/schema-utils": 1.2.1 + "@trezor/transport": 1.3.1 + "@trezor/utils": 9.2.1 + "@trezor/utxo-lib": 2.2.1 blakejs: ^1.2.1 - bs58: ^5.0.0 - bs58check: ^3.0.1 + bs58: ^6.0.0 + bs58check: ^4.0.0 cross-fetch: ^4.0.0 peerDependencies: tslib: ^2.6.2 - checksum: acb5a7bbbd82ffb0be580536fb74ea8ed3dc898801bd004f89d39f3ed1955806e3f24b4d4a5fbc116e67a5f33db6bdd0fb523d8abbed6da3dd1ef64c05494b53 + checksum: 1f6a3e25e1129448e2375a363edd48808008c03b280154166e86ef127e8d31b94fd41c47cecab1bbff4beffc96e20a844b38ea68013d6e754ad5d3a77eafad93 languageName: node linkType: hard @@ -9358,53 +9373,53 @@ __metadata: languageName: node linkType: hard -"@trezor/protobuf@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/protobuf@npm:1.2.0" +"@trezor/protobuf@npm:1.2.1": + version: 1.2.1 + resolution: "@trezor/protobuf@npm:1.2.1" dependencies: - "@trezor/schema-utils": 1.2.0 - protobufjs: 7.2.6 + "@trezor/schema-utils": 1.2.1 + protobufjs: 7.4.0 peerDependencies: tslib: ^2.6.2 - checksum: d7bf82db7022de26b4536ebf187e54f696f61b3b488ace8f7c9a4f8b52868b318e844daa446e80bddf31f4136f56dabf5a51bd0fccd87d40d3f6803305cbb268 + checksum: 6263008cac0da62d79223e1d8ebe69baf17f694565fecf57a641ff1c731b90119199197fb9cdf8aa42254f63bf0226c4e753a093cf64fbb0e77f3dc4c1ec980b languageName: node linkType: hard -"@trezor/protocol@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/protocol@npm:1.2.0" +"@trezor/protocol@npm:1.2.1": + version: 1.2.1 + resolution: "@trezor/protocol@npm:1.2.1" peerDependencies: tslib: ^2.6.2 - checksum: 4440973bc20cc3f58c489f7a90292591c8994bace7477205287b504947d0a1e4ea7bf9e029e6a6bdd438281a8d9ff7ea54567dc377b39b8eaa7028522d12adca + checksum: e9e01a3f60b5d33927f484cf2890433c26feff5eac2358801ae0c05263c7ea5eb497fbb752af4fb94785c957d2187b41134843ec09f019a078ff01ffb31ffae3 languageName: node linkType: hard -"@trezor/schema-utils@npm:1.2.0": - version: 1.2.0 - resolution: "@trezor/schema-utils@npm:1.2.0" +"@trezor/schema-utils@npm:1.2.1": + version: 1.2.1 + resolution: "@trezor/schema-utils@npm:1.2.1" dependencies: - "@sinclair/typebox": ^0.31.28 + "@sinclair/typebox": ^0.33.7 ts-mixer: ^6.0.3 peerDependencies: tslib: ^2.6.2 - checksum: 1e5f0627fa87be591e4d6e78469764305e38af1abf5fa65058a0e018d97525244fe5b1f86db29ec905bfb2e8a37290dafb9ef2a874819424148112b18507b383 + checksum: a560f7a6cb692bf23fe709261c1a569ad43a3df48817f1d8a6b0aae623b16b354e66317dffd091f122c7f96ffe1299b65169c8404ae5f37165fa21c3c0b2b03f languageName: node linkType: hard -"@trezor/transport@npm:1.3.0": - version: 1.3.0 - resolution: "@trezor/transport@npm:1.3.0" +"@trezor/transport@npm:1.3.1": + version: 1.3.1 + resolution: "@trezor/transport@npm:1.3.1" dependencies: - "@trezor/protobuf": 1.2.0 - "@trezor/protocol": 1.2.0 - "@trezor/utils": 9.2.0 + "@trezor/protobuf": 1.2.1 + "@trezor/protocol": 1.2.1 + "@trezor/utils": 9.2.1 cross-fetch: ^4.0.0 long: ^4.0.0 - protobufjs: 7.2.6 - usb: ^2.11.0 + protobufjs: 7.4.0 + usb: ^2.13.0 peerDependencies: tslib: ^2.6.2 - checksum: b7158f36732e75065235dc31e1015c1d6d9ec9f7235da28e2883e650cd8626f5e9906fcf8032c24763f3a0501a48935c36dcc7f1302b12a1104cd3a8dfc6fbcf + checksum: 1b3fff5d624bf9b6abf8f9061b831e867135bee374e0359c2b63e8f0912c5283a645ebfff3becd506f588bdc8b7f66a99eff10db4907c694d375e8882664fd4f languageName: node linkType: hard @@ -9415,41 +9430,41 @@ __metadata: languageName: node linkType: hard -"@trezor/utils@npm:9.2.0": - version: 9.2.0 - resolution: "@trezor/utils@npm:9.2.0" +"@trezor/utils@npm:9.2.1": + version: 9.2.1 + resolution: "@trezor/utils@npm:9.2.1" dependencies: bignumber.js: ^9.1.2 peerDependencies: tslib: ^2.6.2 - checksum: 755c80193391c9f69a0fc0ef0147d7ca8d8c794cf6cf44ef91a022231075806b92364baca61dcb35c95c47a091359a10b72ca06e8d96c8f810178084ee25786c + checksum: aef5b7d76a9cf3f94c5ea037f1b24502647e36f92526f76c40b2a71e6d9cc4b92be8b5b68c2574d98b09aae2c26dc78a9f1461d9fc105297188bb39f926b5a14 languageName: node linkType: hard -"@trezor/utxo-lib@npm:2.2.0": - version: 2.2.0 - resolution: "@trezor/utxo-lib@npm:2.2.0" +"@trezor/utxo-lib@npm:2.2.1": + version: 2.2.1 + resolution: "@trezor/utxo-lib@npm:2.2.1" dependencies: - "@trezor/utils": 9.2.0 + "@trezor/utils": 9.2.1 bchaddrjs: ^0.5.2 bech32: ^2.0.0 - bip66: ^1.1.5 + bip66: ^2.0.0 bitcoin-ops: ^1.4.1 blake-hash: ^2.0.0 blakejs: ^1.2.1 bn.js: ^5.2.1 - bs58: ^5.0.0 - bs58check: ^3.0.1 + bs58: ^6.0.0 + bs58check: ^4.0.0 create-hmac: ^1.1.7 int64-buffer: ^1.0.1 pushdata-bitcoin: ^1.0.1 tiny-secp256k1: ^1.1.6 typeforce: ^1.18.0 - varuint-bitcoin: ^1.1.2 - wif: ^4.0.0 + varuint-bitcoin: 2.0.0 + wif: ^5.0.0 peerDependencies: tslib: ^2.6.2 - checksum: d7af8fc2101cdfad4a010ca44ef2be6c504b0b7067342f4407de5c599350d453623aa49bc0c500d5efb82276c98555abd9b91401dcda215795b146c5467bcd60 + checksum: 177e7482b65738948d618e19d59e067ba77014235d8f38f29f21ae7505fb46c82c6f313792c055b906374572b43c8cb7bffe721766dfa447fba9b3aeb718f5b7 languageName: node linkType: hard @@ -10300,10 +10315,10 @@ __metadata: languageName: node linkType: hard -"@types/web@npm:^0.0.138": - version: 0.0.138 - resolution: "@types/web@npm:0.0.138" - checksum: bddfc894b9acf8308a67650b550362ce090e00bf91d282127595389469c3bc56801c802e62d30171fa2b2f3846bde7f356ec58b81765a06736de4b14b1a22483 +"@types/web@npm:^0.0.162": + version: 0.0.162 + resolution: "@types/web@npm:0.0.162" + checksum: d5fde80dab4e4239c77ad45465bd23d71558fe6f6ca5f9ac1a4ca59b10c5b67173cfc02d4a8e29caf2bd129a89ae8354c2d038877c186aeae2563a59002d0dff languageName: node linkType: hard @@ -12830,7 +12845,7 @@ __metadata: languageName: node linkType: hard -"bip66@npm:^1.1.0, bip66@npm:^1.1.5": +"bip66@npm:^1.1.0": version: 1.1.5 resolution: "bip66@npm:1.1.5" dependencies: @@ -12839,6 +12854,13 @@ __metadata: languageName: node linkType: hard +"bip66@npm:^2.0.0": + version: 2.0.0 + resolution: "bip66@npm:2.0.0" + checksum: 919b25d3ed2b9d774eefe550ae6e825e29e1aa450fc1af12e7cef39115a8bc867018b5aa3d8e68b459ec198decabfc1ebe2bdbae9edfdca61c97e862d1db098d + languageName: node + linkType: hard + "bip68@npm:^1.0.4": version: 1.0.4 resolution: "bip68@npm:1.0.4" @@ -13347,6 +13369,16 @@ __metadata: languageName: node linkType: hard +"bs58check@npm:^4.0.0": + version: 4.0.0 + resolution: "bs58check@npm:4.0.0" + dependencies: + "@noble/hashes": ^1.2.0 + bs58: ^6.0.0 + checksum: 416131b647563e9c7daf5d18222862b40dfd39110f8635e9e1d19805d624e96cc12ba03c8e6fdc1f9c0e364dd2918877fb8a02671caeef0de9beeb33c1fb0ed4 + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0, buffer-from@npm:^1.1.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -24629,9 +24661,9 @@ __metadata: languageName: node linkType: hard -"protobufjs@npm:7.2.6": - version: 7.2.6 - resolution: "protobufjs@npm:7.2.6" +"protobufjs@npm:7.4.0": + version: 7.4.0 + resolution: "protobufjs@npm:7.4.0" dependencies: "@protobufjs/aspromise": ^1.1.2 "@protobufjs/base64": ^1.1.2 @@ -24645,7 +24677,7 @@ __metadata: "@protobufjs/utf8": ^1.1.0 "@types/node": ">=13.7.0" long: ^5.0.0 - checksum: 3c62e48f7d50017ac3b0dcd2a58e617cf858f9fba56a488bd48b9aa3482893a75540052dbcb3c12dfbaab42b1d04964611175faf06bdadcd33a4ebac982a511e + checksum: ba0e6b60541bbf818bb148e90f5eb68bd99004e29a6034ad9895a381cbd352be8dce5376e47ae21b2e05559f2505b4a5f4a3c8fa62402822c6ab4dcdfb89ffb3 languageName: node linkType: hard @@ -28689,6 +28721,13 @@ __metadata: languageName: node linkType: hard +"uint8array-tools@npm:^0.0.8": + version: 0.0.8 + resolution: "uint8array-tools@npm:0.0.8" + checksum: 4cc4abe2db18b240cdcc9860fbb110d87e5197c254f1c3162e171c07944b2d10c8e809c524d7384a59b5f5118f2a60b7b855dbefe462c3fc6f89442b0a43a134 + languageName: node + linkType: hard + "uint8arrays@npm:^3.0.0, uint8arrays@npm:^3.1.0": version: 3.1.1 resolution: "uint8arrays@npm:3.1.1" @@ -28992,7 +29031,7 @@ __metadata: languageName: node linkType: hard -"usb@npm:^2.11.0": +"usb@npm:^2.13.0": version: 2.14.0 resolution: "usb@npm:2.14.0" dependencies: @@ -29213,6 +29252,15 @@ __metadata: languageName: node linkType: hard +"varuint-bitcoin@npm:2.0.0": + version: 2.0.0 + resolution: "varuint-bitcoin@npm:2.0.0" + dependencies: + uint8array-tools: ^0.0.8 + checksum: 059ecf90cf7496e63ff585519873ad4f7b2009f586d3864fda4d02b92aab5af03b58ac518a06e5ae30dff5c5003cd250747a00e92f2cd2ce9fc1e4e16daf1ef1 + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -30885,12 +30933,12 @@ __metadata: languageName: node linkType: hard -"wif@npm:^4.0.0": - version: 4.0.0 - resolution: "wif@npm:4.0.0" +"wif@npm:^5.0.0": + version: 5.0.0 + resolution: "wif@npm:5.0.0" dependencies: - bs58check: ^3.0.1 - checksum: 7c298e675e46b8bf1ee7dec787cab4e9e22c73aef9882efbe83f76700b43d60dc65616ca3635415aa78203f92da45e6897cd72d5cb0940d49c66d9621d40c223 + bs58check: ^4.0.0 + checksum: 3af0d4e9f1d1b35672b860470b6545f34f77b4a804e06ccae2f06f43c96a31fba859cf64889344eded621433eb609fc4c95aa28d62c02057372232b85231e414 languageName: node linkType: hard From 683ca860a206c1ce18b5e33277aad5ed750dc559 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 27 Sep 2024 14:13:45 -0700 Subject: [PATCH 339/375] devop: fix max issue and loading issue --- .github/workflows/test-all.yml | 2 +- .../src/providers/solana/ui/send-transaction/index.vue | 5 +++-- .../src/providers/solana/ui/sol-verify-transaction.vue | 9 +++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-all.yml b/.github/workflows/test-all.yml index 28ba5fef9..0d965d11f 100644 --- a/.github/workflows/test-all.yml +++ b/.github/workflows/test-all.yml @@ -9,7 +9,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v3 with: - node-version: "16" + node-version: "20" cache: "yarn" - run: yarn install - run: yarn build:all diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index 31b59ae81..66c502916 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -504,8 +504,9 @@ const updateTransactionFees = async () => { SolTx.value = transaction; setTransactionFees(transaction).then(() => { if (isMaxSelected.value) { - amount.value = - parseFloat(assetMaxValue.value) < 0 ? "0" : assetMaxValue.value; + inputAmount( + parseFloat(assetMaxValue.value) < 0 ? "0" : assetMaxValue.value + ); } }); }); diff --git a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue index 89b4d9e22..4214bec97 100644 --- a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue +++ b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue @@ -45,7 +45,10 @@

{{ Options.domain }}

- +

Warning: This transaction failed during simulation, which means this - transaction will most likely fail! + transaction will most likely fail! We recommend to cancel and try + again!

@@ -121,6 +125,7 @@ import HardwareWalletMsg from "@/providers/common/ui/verify-transaction/hardware import { getError } from "@/libs/error"; import { ErrorCodes } from "@/providers/ethereum/types"; import { WindowPromiseHandler } from "@/libs/window-promise"; +import SwapLookingAnimation from "@action/icons/swap/swap-looking-animation.vue"; import { DEFAULT_SOLANA_NETWORK, getNetworkByName, From e337f275b0d9cc6bec168ecbe2c5ff94726cddf9 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 27 Sep 2024 14:29:17 -0700 Subject: [PATCH 340/375] fix: solana identicons --- .../src/providers/solana/ui/sol-connect-dapp.vue | 4 ++-- .../src/providers/solana/ui/sol-sign-message.vue | 12 +++++++++--- .../providers/solana/ui/sol-verify-transaction.vue | 6 ++++-- .../accounts-header/components/header-accounts.vue | 2 ++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue b/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue index b489cbfc4..06319f324 100644 --- a/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue +++ b/packages/extension/src/providers/solana/ui/sol-connect-dapp.vue @@ -116,7 +116,7 @@ onBeforeMount(async () => { Options.value = options; const accounts = await keyring.getAccounts(network.value.signer); displayAddress.value = network.value.displayAddress(accounts[0].address); - identicon.value = network.value.identicon(accounts[0].address); + identicon.value = network.value.identicon(displayAddress.value); accountHeaderData.value = { activeAccounts: accounts, selectedAccount: accounts[0], @@ -166,7 +166,7 @@ const toggleAccounts = () => { const onSelectedAddressChanged = async (newAccount: EnkryptAccount) => { accountHeaderData.value.selectedAccount = newAccount; displayAddress.value = network.value.displayAddress(newAccount.address); - identicon.value = network.value.identicon(newAccount.address); + identicon.value = network.value.identicon(displayAddress.value); }; diff --git a/packages/extension/src/providers/solana/ui/sol-sign-message.vue b/packages/extension/src/providers/solana/ui/sol-sign-message.vue index 00206ee43..10fcfc6ae 100644 --- a/packages/extension/src/providers/solana/ui/sol-sign-message.vue +++ b/packages/extension/src/providers/solana/ui/sol-sign-message.vue @@ -119,7 +119,9 @@ onBeforeMount(async () => { .getAccount(pubKey) .then((acc) => { account.value = acc; - identicon.value = network.value.identicon(account.value.address); + identicon.value = network.value.identicon( + network.value.displayAddress(account.value.address) + ); }) .catch((e) => { console.log(e); @@ -130,7 +132,9 @@ onBeforeMount(async () => { } else { keyring.getAccounts([SignerType.ed25519sol]).then((accs) => { account.value = accs[0]; - identicon.value = network.value.identicon(account.value.address); + identicon.value = network.value.identicon( + network.value.displayAddress(account.value.address) + ); message.value = createSignInMessageText({ ...signInMessage.value, address: network.value.displayAddress(account.value.address), @@ -147,7 +151,9 @@ onBeforeMount(async () => { .getAccount(bufferToHex(bs58.decode(signMessage.value!.address))) .then((acc) => { account.value = acc; - identicon.value = network.value.identicon(account.value.address); + identicon.value = network.value.identicon( + network.value.displayAddress(account.value.address) + ); }) .catch((e) => { console.log(e); diff --git a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue index 4214bec97..f9f39989e 100644 --- a/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue +++ b/packages/extension/src/providers/solana/ui/sol-verify-transaction.vue @@ -46,7 +46,7 @@
@@ -193,7 +193,9 @@ onBeforeMount(async () => { accountPubkey.value = new PublicKey( bs58.encode(hexToBuffer(account.value.address)) ); - identicon.value = network.value.identicon(account.value.address); + identicon.value = network.value.identicon( + network.value.displayAddress(account.value.address) + ); Options.value = options; if (network.value.api) { const api = await network.value.api(); diff --git a/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue b/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue index 0bf7751b5..b4d57dd92 100644 --- a/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue +++ b/packages/extension/src/ui/action/components/accounts-header/components/header-accounts.vue @@ -72,6 +72,7 @@ import DomainState from "@/libs/domain-state"; import BtcAccountState from "@/providers/bitcoin/libs/accounts-state"; import EvmAccountState from "@/providers/ethereum/libs/accounts-state"; import KadenaAccountState from "@/providers/kadena/libs/accounts-state"; +import SolanaAccountState from "@/providers/solana/libs/accounts-state"; import SubstrateAccountState from "@/providers/polkadot/libs/accounts-state"; import { BaseNetwork, SubNetworkOptions } from "@/types/base-network"; import Notification from "@action/components/notification/index.vue"; @@ -97,6 +98,7 @@ const kadenaAccountState = new KadenaAccountState(); const allAccountStates = [ new EvmAccountState(), new BtcAccountState(), + new SolanaAccountState(), new SubstrateAccountState(), kadenaAccountState, ]; From 5ea9b75eec76e695fc7c5ee82ba6ad4527366bf7 Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Fri, 27 Sep 2024 14:31:55 -0700 Subject: [PATCH 341/375] devop: update name --- packages/extension/src/manifest/base.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/extension/src/manifest/base.json b/packages/extension/src/manifest/base.json index 3527039c4..0b20aafa8 100644 --- a/packages/extension/src/manifest/base.json +++ b/packages/extension/src/manifest/base.json @@ -2,7 +2,7 @@ "author": "https://www.enkrypt.com", "homepage_url": "https://www.enkrypt.com", "version": "", - "name": "Enkrypt Crypto Wallet: ETH, BTC, KDA & more!", + "name": "Enkrypt: ETH, BTC and Solana Wallet", "short_name": "Enkrypt", "permissions": [ "storage", From 59e9b4b1b5e26adc899f554a34e743e814bcce0c Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Mon, 30 Sep 2024 16:37:31 -0700 Subject: [PATCH 342/375] devop: fix ccswap link --- packages/extension/src/ui/action/App.vue | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/extension/src/ui/action/App.vue b/packages/extension/src/ui/action/App.vue index ab6248aaf..28154fa47 100644 --- a/packages/extension/src/ui/action/App.vue +++ b/packages/extension/src/ui/action/App.vue @@ -209,7 +209,9 @@ const openBuyPage = () => { ? (currentNetwork.value as KadenaNetwork).options.buyLink : `https://ccswap.myetherwallet.com/?to=${currentNetwork.value.displayAddress( accountHeaderData.value.selectedAccount!.address - )}&crypto=${currentNetwork.value.currencyName}&platform=enkrypt`; + )}&network=${currentNetwork.value.name}&crypto=${ + currentNetwork.value.currencyName + }&platform=enkrypt`; Browser.tabs.create({ url: buyLink, }); From ac0a2ac4008058cd5222a4edb16db178a1af8e6c Mon Sep 17 00:00:00 2001 From: kvhnuke <10602065+kvhnuke@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:47:15 -0700 Subject: [PATCH 343/375] feat: add hw support for solana and import via priv key --- .../solana/libs/wallet-standard/wallet.ts | 4 +- .../src/providers/solana/ui/libs/decode-tx.ts | 1 + .../src/providers/solana/ui/libs/signer.ts | 110 +++++++++++++++ .../solana/ui/libs/signin-message.ts | 17 +++ .../solana/ui/send-transaction/index.vue | 5 +- .../verify-transaction/index.vue | 20 +-- .../providers/solana/ui/sol-sign-message.vue | 58 +++----- .../solana/ui/sol-verify-transaction.vue | 127 ++++++++++-------- .../src/providers/solana/ui/types.ts | 14 ++ .../views/import-account-private-key.vue | 15 +++ .../views/import-account-start.vue | 5 +- .../views/swap/libs/send-transactions.ts | 47 +++---- packages/hw-wallets/package.json | 1 + packages/hw-wallets/src/configs.ts | 11 ++ packages/hw-wallets/src/index.ts | 15 ++- .../hw-wallets/src/ledger/solana/configs.ts | 7 + .../hw-wallets/src/ledger/solana/index.ts | 106 +++++++++++++++ .../hw-wallets/src/trezor/solana/configs.ts | 8 ++ .../hw-wallets/src/trezor/solana/index.ts | 86 ++++++++++++ packages/hw-wallets/src/types.ts | 7 +- yarn.lock | 43 ++++++ 21 files changed, 558 insertions(+), 149 deletions(-) create mode 100644 packages/extension/src/providers/solana/ui/libs/signer.ts create mode 100644 packages/hw-wallets/src/ledger/solana/configs.ts create mode 100644 packages/hw-wallets/src/ledger/solana/index.ts create mode 100644 packages/hw-wallets/src/trezor/solana/configs.ts create mode 100644 packages/hw-wallets/src/trezor/solana/index.ts diff --git a/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts index b0c4315d5..f82ac2360 100644 --- a/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts +++ b/packages/extension/src/providers/solana/libs/wallet-standard/wallet.ts @@ -263,12 +263,12 @@ export class EnkryptWallet implements Wallet { } } if (!isValidAccount) throw new Error("invalid account"); - const { signature } = await this.#enkrypt.signMessage({ + const { signature, signedMessage } = await this.#enkrypt.signMessage({ address: account.address, message: uint8ArrayToHex(message), }); outputs.push({ - signedMessage: message, + signedMessage: hexToUint8Array(signedMessage), signature: hexToUint8Array(signature), }); } else if (inputs.length > 1) { diff --git a/packages/extension/src/providers/solana/ui/libs/decode-tx.ts b/packages/extension/src/providers/solana/ui/libs/decode-tx.ts index 8c8c8f513..bd2ae0132 100644 --- a/packages/extension/src/providers/solana/ui/libs/decode-tx.ts +++ b/packages/extension/src/providers/solana/ui/libs/decode-tx.ts @@ -63,6 +63,7 @@ const decodeTransaction = async ( contract: NATIVE_TOKEN_ADDRESS, amount: BigInt(result.value.accounts![0]!.lamports), }; + console.log(result); const balanceChanges = result.value .accounts!.filter((a) => { const data = Buffer.from(a!.data[0], "base64"); diff --git a/packages/extension/src/providers/solana/ui/libs/signer.ts b/packages/extension/src/providers/solana/ui/libs/signer.ts new file mode 100644 index 000000000..dd0e45977 --- /dev/null +++ b/packages/extension/src/providers/solana/ui/libs/signer.ts @@ -0,0 +1,110 @@ +import { InternalMethods, InternalOnMessageResponse } from "@/types/messenger"; +import { + SolInternalSignMessageRequest, + SolInternalSignTransactionRequest, +} from "../types"; +import HWwallet from "@enkryptcom/hw-wallets"; +import { HWwalletType } from "@enkryptcom/types"; +import { getCustomError } from "@/libs/error"; +import { bufferToHex, hexToBuffer } from "@enkryptcom/utils"; +import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; + +/** + * Sign a transaction + */ +const TransactionSigner = ( + options: SolInternalSignTransactionRequest +): Promise => { + const { transaction, network, account } = options; + if (options.account.isHardware) { + const hwwallets = new HWwallet(); + return hwwallets + .signTransaction({ + transaction: { solTx: transaction }, + networkName: network.name, + pathIndex: account.pathIndex.toString(), + pathType: { + basePath: account.basePath, + path: account.HWOptions!.pathTemplate, + }, + wallet: account.walletType as unknown as HWwalletType, + }) + .then((rpcsig: string) => { + return hexToBuffer(rpcsig); + }) + .catch((e) => { + return Promise.reject({ + error: getCustomError(e.message), + }); + }); + } else { + const msgHash = bufferToHex(transaction); + return sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [msgHash, account], + }).then((res) => { + if (res.error) { + return Promise.reject(res); + } else { + return hexToBuffer(JSON.parse(res.result!)); + } + }); + } +}; + +/** + * Sign a message + */ +const MessageSigner = ( + options: SolInternalSignMessageRequest +): Promise => { + const { account, payload } = options; + if (account.isHardware) { + return Promise.reject({ + error: getCustomError("solana-hw-sign: hw wallets not supported"), + }); + // only ledger supports offchain message signing but it is not widely accepted yet, will visit later + // https://github.com/anza-xyz/wallet-standard/blob/master/packages/core/util/src/signMessage.ts + // const hwwallets = new HWwallet(); + // const hwSignMessage = createOffChainMessage( + // hexToBuffer(payload).toString("utf8") + // ); + // return hwwallets + // .signPersonalMessage({ + // message: hwSignMessage, + // networkName: network.name, + // pathIndex: account.pathIndex.toString(), + // pathType: { + // basePath: account.basePath, + // path: account.HWOptions!.pathTemplate, + // }, + // wallet: account.walletType as unknown as HWwalletType, + // }) + // .then((res: string) => ({ + // result: JSON.stringify({ + // signature: res, + // message: bufferToHex(hwSignMessage), + // }), + // })) + // .catch((e: any) => { + // return Promise.reject({ + // error: getCustomError(e.message), + // }); + // }); + } else { + return sendUsingInternalMessengers({ + method: InternalMethods.sign, + params: [payload, account], + }).then((res) => { + if (res.error) return res; + return { + result: JSON.stringify({ + signature: JSON.parse(res.result!), + message: payload, + }), + }; + }); + } +}; + +export { TransactionSigner, MessageSigner }; diff --git a/packages/extension/src/providers/solana/ui/libs/signin-message.ts b/packages/extension/src/providers/solana/ui/libs/signin-message.ts index 9cbf6cc00..e54ff1c8a 100644 --- a/packages/extension/src/providers/solana/ui/libs/signin-message.ts +++ b/packages/extension/src/providers/solana/ui/libs/signin-message.ts @@ -45,3 +45,20 @@ export function createSignInMessageText(input: SolanaSignInInput): string { return message; } + +export function createOffChainMessage(message: string) { + const signingDomain = Buffer.from("\xffsolana offchain", "ascii"); + const headerversion = Buffer.from([0]); + const msgFormat = Buffer.from([1]); + const messageLength = Buffer.alloc(2); + messageLength.writeUint16LE(message.length); + const msgBuffer = Buffer.from(message, "utf8"); + const final = Buffer.concat([ + signingDomain, + headerversion, + msgFormat, + messageLength, + msgBuffer, + ]); + return final; +} diff --git a/packages/extension/src/providers/solana/ui/send-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/index.vue index 66c502916..ac5c109f4 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/index.vue @@ -384,6 +384,7 @@ const isValidSend = computed(() => { if (!isInputsValid.value) return false; if (nativeBalanceAfterTransaction.value.isNeg()) return false; if (!isEstimateValid.value) return false; + if (gasCostValues.value.ECONOMY.nativeValue === "0") return false; return true; }); @@ -399,7 +400,6 @@ const isInputsValid = computed(() => { return false; } if (new BigNumber(sendAmount.value).gt(assetMaxValue.value)) return false; - if (gasCostValues.value.ECONOMY.nativeValue === "0") return false; return true; }); @@ -520,6 +520,7 @@ const isOpenSelectNft = ref(false); watch( [isInputsValid, addressTo, selectedAsset, selectedNft, isSendToken], () => { + console.log(isInputsValid.value); if (isInputsValid.value) { updateTransactionFees(); } @@ -672,7 +673,7 @@ const sendAction = async () => { url: Browser.runtime.getURL( getUiPath( `sol-hw-verify?id=${routedRoute.query.id}&txData=${routedRoute.query.txData}`, - ProviderName.ethereum + ProviderName.solana ) ), type: "popup", diff --git a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue index 01b53a1a8..bd1f86350 100644 --- a/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue +++ b/packages/extension/src/providers/solana/ui/send-transaction/verify-transaction/index.vue @@ -102,7 +102,6 @@ import ActivityState from "@/libs/activity-state"; import { EnkryptAccount } from "@enkryptcom/types"; import CustomScrollbar from "@action/components/custom-scrollbar/index.vue"; import { BaseNetwork } from "@/types/base-network"; -import { bufferToHex, hexToBuffer } from "@enkryptcom/utils"; import { trackSendEvents } from "@/libs/metrics"; import { SendEventType } from "@/libs/metrics/types"; import { @@ -113,9 +112,8 @@ import { } from "@solana/web3.js"; import { getSimulationComputeUnits } from "@solana-developers/helpers"; import SolanaAPI from "@/providers/solana/libs/api"; -import sendUsingInternalMessengers from "@/libs/messenger/internal-messenger"; -import { InternalMethods } from "@/types/messenger"; import bs58 from "bs58"; +import { TransactionSigner } from "../../libs/signer"; const KeyRing = new PublicKeyRing(); const route = useRoute(); @@ -156,7 +154,7 @@ const sendAction = async () => { const transactiontemp = SolTransaction.from(bs58.decode(txData.encodedTx)); const solAPI = (await network.value.api()).api as SolanaAPI; const computeUnits = await getSimulationComputeUnits( - solAPI.web3, + solAPI.web3 as any, transactiontemp.instructions, transactiontemp.feePayer!, [] @@ -197,17 +195,13 @@ const sendAction = async () => { transactionHash: "", }; const activityState = new ActivityState(); - //transaction.message.serialize() const msgToSign = transaction.message.serialize(); - sendUsingInternalMessengers({ - method: InternalMethods.sign, - params: [bufferToHex(msgToSign), account.value!], + TransactionSigner({ + account: account.value!, + network: network.value, + transaction: Buffer.from(msgToSign), }).then((res) => { - if (res.error) return res; - transaction.addSignature( - transactiontemp.feePayer!, - hexToBuffer(JSON.parse(res.result!)) - ); + transaction.addSignature(transactiontemp.feePayer!, res); const onHash = (hash: string) => { trackSendEvents(SendEventType.SendComplete, { network: network.value.name, diff --git a/packages/extension/src/providers/solana/ui/sol-sign-message.vue b/packages/extension/src/providers/solana/ui/sol-sign-message.vue index 10fcfc6ae..f7e9ff9bb 100644 --- a/packages/extension/src/providers/solana/ui/sol-sign-message.vue +++ b/packages/extension/src/providers/solana/ui/sol-sign-message.vue @@ -6,7 +6,7 @@