diff --git a/packages/bridge/tsconfig.cjs.json b/packages/bridge/tsconfig.cjs.json index 8f8d634..e3311dc 100644 --- a/packages/bridge/tsconfig.cjs.json +++ b/packages/bridge/tsconfig.cjs.json @@ -5,5 +5,5 @@ "baseUrl": "." }, "extends": "../../tsconfig.cjs.json", - "include": ["src/"] + "include": ["src/", "src/**/*.json"] } diff --git a/packages/bridge/tsconfig.es.json b/packages/bridge/tsconfig.es.json index ce87108..12b1e2b 100644 --- a/packages/bridge/tsconfig.es.json +++ b/packages/bridge/tsconfig.es.json @@ -5,5 +5,5 @@ "baseUrl": "." }, "extends": "../../tsconfig.es.json", - "include": ["src/"] + "include": ["src/", "src/**/*.json"] } diff --git a/packages/bridge/tsconfig.types.json b/packages/bridge/tsconfig.types.json index 8500d2f..445c26b 100644 --- a/packages/bridge/tsconfig.types.json +++ b/packages/bridge/tsconfig.types.json @@ -5,5 +5,5 @@ "rootDir": "src", }, "extends": "../../tsconfig.types.json", - "include": ["src/"] + "include": ["src/", "src/**/*.json"] } diff --git a/packages/core/package.json b/packages/core/package.json index 184bc74..853576c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -13,13 +13,19 @@ "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { + "@cityofzion/neon-core-next": "npm:@cityofzion/neon-core@^5.0.0", "@cosmjs/stargate": "^0.32.4", "@cosmjs/tendermint-rpc": "^0.32.4", "@demex-sdk/codecs": "0.0.8", "@improbable-eng/grpc-web": "^0.15.0", "@improbable-eng/grpc-web-node-http-transport": "^0.15.0", + "base58check": "^2.0.0", "bignumber.js": "^9.1.2", + "bip32": "^2.0.6", + "bip39": "^3.1.0", "ethers": "^6.13.4", + "secp256k1": "^5.0.1", + "secp256r1": "^0.0.3", "tslib": "^2.6.2", "typescript": "^5.7.2" }, @@ -42,6 +48,9 @@ "dist-*/**" ], "devDependencies": { + "@types/crypto-js": "4.2.0", + "@types/secp256k1": "^4.0.6", + "@types/wif": "^2.0.2", "concurrently": "7.0.0", "eslint": "^9.13.0" } diff --git a/packages/core/src/constant/query.ts b/packages/core/src/constant/query.ts index a27c495..aebad6b 100644 --- a/packages/core/src/constant/query.ts +++ b/packages/core/src/constant/query.ts @@ -1,4 +1,6 @@ import { Query } from "@demex-sdk/codecs"; export const PGN_1K = Query.PageRequest.fromPartial({ limit: 1000 }); -export const SHIFT_DEC_DECIMALS = 18; +export const PGN_10K = Query.PageRequest.fromPartial({ limit: 10000 }); + +export const SHIFT_DEC_DECIMALS = 18; \ No newline at end of file diff --git a/packages/core/src/env/address.ts b/packages/core/src/env/address.ts new file mode 100644 index 0000000..120738c --- /dev/null +++ b/packages/core/src/env/address.ts @@ -0,0 +1 @@ +export type Bech32AddrType = "main" | "validator" | "consensus"; diff --git a/packages/core/src/env/chain.ts b/packages/core/src/env/chain.ts new file mode 100644 index 0000000..fa36287 --- /dev/null +++ b/packages/core/src/env/chain.ts @@ -0,0 +1,22 @@ +import Codecs from "@demex-sdk/codecs"; +import { TokenClient } from "../helpers"; + +export type PolyNetworkBridge = Codecs.Carbon.Coin.Bridge;; + +export interface AxelarBridge extends Codecs.Carbon.Coin.Bridge { + chain_id_name: string; + bridgeAddress: string; +}; + +export interface BridgeMap { + polynetwork: PolyNetworkBridge[] + axelar: AxelarBridge[] +}; + +export type Blockchain = ReturnType[number] | "Native" | "Carbon" | "Tradehub" | "Ibc" | "Polynetwork"; + +export const BRIDGE_IDS = { + polynetwork: 1, + ibc: 2, + axelar: 3, +}; \ No newline at end of file diff --git a/packages/core/src/env/crypto.ts b/packages/core/src/env/crypto.ts new file mode 100644 index 0000000..f330221 --- /dev/null +++ b/packages/core/src/env/crypto.ts @@ -0,0 +1,14 @@ +export const BIP44_PURPOSE = 44; +export const NEO_COIN_TYPE = 0x00000378; +export const ETH_COIN_TYPE = 0x0000003c; + +export const SWTH_COIN_TYPE = 118; + +export const DenomPrefix = { + LPToken: "clpt", + CDPToken: "cibt", +}; + +export const regexCdpDenom = RegExp(`^${DenomPrefix.CDPToken}/`, "i"); +export const regexLPDenom = RegExp(`^${DenomPrefix.LPToken}/(\\d+)$`, "i"); +export const ibcTokenRegex = /^ibc\/([a-f\d]+)$/i; \ No newline at end of file diff --git a/packages/core/src/env/index.ts b/packages/core/src/env/index.ts index 3646679..d9bdbcf 100644 --- a/packages/core/src/env/index.ts +++ b/packages/core/src/env/index.ts @@ -1 +1,4 @@ -export * from "./network"; +export * from "./address"; +export * from "./chain"; +export * from "./crypto"; +export * from "./network"; \ No newline at end of file diff --git a/packages/core/src/env/network.ts b/packages/core/src/env/network.ts index 93edd77..d371cf6 100644 --- a/packages/core/src/env/network.ts +++ b/packages/core/src/env/network.ts @@ -15,14 +15,36 @@ export interface NetworkConfig { grpcUrl: string wsUrl: string - bech32Prefix: string + bech32Prefix: string; } +export interface NetworkMap { + [Network.MainNet]: T; + [Network.TestNet]: T; + [Network.DevNet]: T; + [Network.Local]: T; +}; + +export const CarbonChainIDs: NetworkMap = { + [Network.MainNet]: "carbon-1", + [Network.TestNet]: "carbon-testnet-42070", + [Network.DevNet]: "carbon-devnet-39911", + [Network.Local]: "carbon-localhost", +} as const; + +export const CarbonEVMChainIDs: NetworkMap = { + [Network.MainNet]: "carbon_9790-1", + [Network.TestNet]: "carbon_9792-1", + [Network.DevNet]: "carbon_9791-1", + [Network.Local]: "carbon_9999-1", +} as const; + export const defaultNetworkConfig: Record = { [Network.MainNet]: { network: Network.MainNet, - chainId: "carbon-1", - evmChainId: "carbon_9790-1", + chainId: CarbonChainIDs[Network.MainNet], + evmChainId: CarbonEVMChainIDs[Network.MainNet], + tmRpcUrl: "https://tm-api.carbon.network", restUrl: "https://api.carbon.network", grpcUrl: "grpc.carbon.network", @@ -32,8 +54,9 @@ export const defaultNetworkConfig: Record = { }, [Network.TestNet]: { network: Network.TestNet, - chainId: "carbon-testnet-42070", - evmChainId: "carbon_9792-1", + chainId: CarbonChainIDs[Network.TestNet], + evmChainId: CarbonEVMChainIDs[Network.TestNet], + tmRpcUrl: "https://test-tm-api.carbon.network", restUrl: "https://test-api.carbon.network", grpcUrl: "test-grpc.carbon.network", @@ -43,8 +66,9 @@ export const defaultNetworkConfig: Record = { }, [Network.DevNet]: { network: Network.DevNet, - chainId: "carbon-devnet-39911", - evmChainId: "carbon_9791-1", + chainId: CarbonChainIDs[Network.DevNet], + evmChainId: CarbonEVMChainIDs[Network.DevNet], + tmRpcUrl: "https://dev-tm-api.carbon.network", restUrl: "https://dev-api.carbon.network", grpcUrl: "dev-grpc.carbon.network", @@ -54,8 +78,9 @@ export const defaultNetworkConfig: Record = { }, [Network.Local]: { network: Network.Local, - chainId: "carbon-localhost", - evmChainId: "carbon_9999-1", + chainId: CarbonChainIDs[Network.Local], + evmChainId: CarbonEVMChainIDs[Network.Local], + tmRpcUrl: "http://localhost:26657", restUrl: "http://localhost:1317", grpcUrl: "localhost:9090", @@ -63,7 +88,7 @@ export const defaultNetworkConfig: Record = { bech32Prefix: "tswth", }, -} +}; export const evmChainIds: Record = Object.values(defaultNetworkConfig).reduce( (acc, { chainId, evmChainId }) => ({ @@ -71,4 +96,4 @@ export const evmChainIds: Record = Object.values(defaultNetworkC [chainId]: evmChainId, }), {} -); +); \ No newline at end of file diff --git a/packages/core/src/helpers/index.ts b/packages/core/src/helpers/index.ts new file mode 100644 index 0000000..60b4672 --- /dev/null +++ b/packages/core/src/helpers/index.ts @@ -0,0 +1 @@ +export * from "./token"; \ No newline at end of file diff --git a/packages/core/src/helpers/token.ts b/packages/core/src/helpers/token.ts new file mode 100644 index 0000000..0ee1b32 --- /dev/null +++ b/packages/core/src/helpers/token.ts @@ -0,0 +1,192 @@ +import Codecs from "@demex-sdk/codecs"; +import Long from "long"; +import { PGN_10K } from "../constant"; +import { AxelarBridge, Blockchain, BRIDGE_IDS, BridgeMap, ibcTokenRegex, Network, NetworkConfig, PolyNetworkBridge, regexCdpDenom, regexLPDenom } from "../env"; +import { DemexQueryClient } from "../query"; +import { OptionalNetworkMap, SimpleMap } from "../util"; + +export const TokenBlacklist: OptionalNetworkMap = { + [Network.MainNet]: [ + "brkl.1.2.337f55", // wrong token address + "zusdt.1.18.1cbca1", // duplicated token + ], +}; + +export class TokenClient { + private tokens: SimpleMap | null = null; + private bridges: BridgeMap | null = null; + + private constructor(public readonly query: DemexQueryClient, public readonly networkConfig: NetworkConfig) { } + + public static instance(query: DemexQueryClient, networkConfig: NetworkConfig) { + return new TokenClient(query, networkConfig); + } + + public async initialize(): Promise { + try { + await Promise.all([ + this.getAllTokens(), + this.getBridges(), + ]); + } catch (err) { + const errorTyped = err as Error; + console.error("failed to query token and bridge info:", errorTyped.message); + } + } + + public async getAllTokens(): Promise { + if (!this.tokens) { + this.tokens = {}; + const result = await this.query.coin.TokenAll({ pagination: PGN_10K }); + const tokenBlacklist = TokenBlacklist[this.networkConfig.network] ?? []; + result.tokens.forEach((token: Codecs.Carbon.Coin.Token) => { + if (tokenBlacklist.includes(token.denom)) return; + this.tokens![token.denom] = token; + }); + } + return Object.values(this.tokens) ?? []; + }; + + public async getBridges(): Promise { + if (!this.bridges) { + const allBridges = await this.query.coin.BridgeAll({ pagination: PGN_10K }); + const axelarBridges = await this.mapBridgesFromConnections() + + const polynetworkBridges = allBridges.bridges.reduce((prev: PolyNetworkBridge[], bridge: Codecs.Carbon.Coin.Bridge) => { + if (bridge.bridgeId.toNumber() !== BRIDGE_IDS.polynetwork) return prev; + prev.push({ ...bridge } as PolyNetworkBridge); + return prev; + }, []) + + this.bridges = { + polynetwork: polynetworkBridges, + axelar: axelarBridges, + }; + } + return this.bridges!; + } + + async mapBridgesFromConnections(): Promise { + const newBridges: AxelarBridge[] = [] + try { + const results: Codecs.Carbon.Bridge.QueryAllConnectionsResponse = await this.query.bridge.ConnectionAll({ + bridgeId: new Long(0), + pagination: PGN_10K, + }); + const connections = results.connections + connections.forEach((connection: Codecs.Carbon.Bridge.Connection) => { + newBridges.push({ + name: `${connection.chainDisplayName} via Axelar`, + bridgeId: new Long(BRIDGE_IDS.axelar), + chainId: new Long(BRIDGE_IDS.axelar), + bridgeAddress: connection.connectionId, + chain_id_name: connection.chainId, + chainName: connection.chainDisplayName, + bridgeName: 'Axelar', + bridgeAddresses: [], + enabled: connection.isEnabled, + }); + }); + } catch (err) { + console.error(err) + } finally { + const chainMap: SimpleMap = {}; + + newBridges.forEach((bridge) => { + const chainId = bridge.chain_id_name; + if (chainMap[chainId]) { + bridge.chainName = chainMap[chainId]; + } else { + chainMap[chainId] = bridge.chainName; + } + }); + } + return newBridges; + }; + + public getBlockchain(denom: string | undefined): Blockchain | undefined { + if (!denom || !this.tokens?.[denom]) return undefined + const token = this.tokens[denom]; + if (this.isNativeToken(denom) || this.isNativeStablecoin(denom) || TokenClient.isPoolToken(denom) || TokenClient.isCdpToken(denom) || this.isGroupedToken(denom)) { + // native denoms "swth" and "usc" should be native. + // pool and cdp tokens are on the Native blockchain, hence 0 + return 'Native' + } + + if (this.isBridgedToken(denom)) { + // brdg tokens will all be chain_id 0 which will also be deprecated in future + // hence for brdg tokens cannot use chain_id to differentiate between blockchains + const chainName = this.bridges?.axelar.find((bridge: AxelarBridge) => bridge.bridgeAddress === token.bridgeAddress)?.chainName + return chainName + } + const bridge = this.getBridgeFromToken(token) + return bridge?.chainName; + }; + + public getBridgesFromBridgeId(bridgeId: number): Codecs.Carbon.Coin.Bridge[] | AxelarBridge[] | undefined { + switch (bridgeId) { + case BRIDGE_IDS.polynetwork: + return this.bridges?.polynetwork + case BRIDGE_IDS.axelar: + return this.bridges?.axelar + default: + return undefined + } + }; + + public getBridgeFromToken(token: Codecs.Carbon.Coin.Token | null): Codecs.Carbon.Coin.Bridge | undefined { + if (!token || !token.bridgeId) return undefined + const bridgeList = this.getBridgesFromBridgeId(token.bridgeId.toNumber()) + return bridgeList?.find(bridge => token.chainId.equals(bridge.chainId)) + }; + + public getPolynetworkBlockchainNames(): string[] { + return (this.bridges?.polynetwork ?? []).map((bridge: PolyNetworkBridge) => bridge.chainName); + }; + + public getAxelarBlockchainNames(): string[] { + return (this.bridges?.axelar ?? []).map((bridge: AxelarBridge) => bridge.chainName); + }; + + public getAllBlockchainNames(): string[] { + return this.getPolynetworkBlockchainNames().concat(this.getAxelarBlockchainNames()); + }; + + public isNativeToken(denom: string): boolean { + return denom === "swth"; + }; + + public isNativeStablecoin(denom: string): boolean { + return denom === "usc"; + }; + + public static isPoolToken(denom: string): boolean { + return this.isPoolTokenNew(denom) || this.isPoolTokenLegacy(denom); + }; + + public static isPoolTokenNew(denom: string): boolean { + return denom.match(regexLPDenom) !== null; + }; + + public static isPoolTokenLegacy(denom: string): boolean { + return denom.match(/^([a-z\d.-]+)-(\d+)-([a-z\d.-]+)-(\d+)-lp\d+$/i) !== null; + }; + + public static isCdpToken(denom: string): boolean { + return denom.match(regexCdpDenom) !== null; + }; + + public static isIBCDenom(denom: string): boolean { + return denom.match(ibcTokenRegex) !== null; + }; + + public isBridgedToken(denom: string): boolean { + const bridgedTokenRegex = new RegExp(/^brdg\//) + return bridgedTokenRegex.test(denom) + }; + + public isGroupedToken(denom: string): boolean { + const groupedTokenRegex = new RegExp(/^cgt\/\d+$/) + return groupedTokenRegex.test(denom) + }; +}; \ No newline at end of file diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 570d922..c026bb2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,5 +1,6 @@ export * from "./constant"; export * from "./env"; export * from "./fetch"; +export * from "./helpers"; export * from "./query"; -export * from "./util"; +export * from "./util"; \ No newline at end of file diff --git a/packages/core/src/query/index.ts b/packages/core/src/query/index.ts index c4646b9..f7ba575 100644 --- a/packages/core/src/query/index.ts +++ b/packages/core/src/query/index.ts @@ -1,3 +1,3 @@ export * from "./chain"; export * from "./client"; -export * from "./grpc"; +export * from "./grpc"; \ No newline at end of file diff --git a/packages/core/src/util/address.ts b/packages/core/src/util/address.ts new file mode 100644 index 0000000..1afb6f1 --- /dev/null +++ b/packages/core/src/util/address.ts @@ -0,0 +1,353 @@ +import { CONST, wallet } from "@cityofzion/neon-core-next"; +import * as Base58Check from "base58check"; +import * as bech32 from "bech32"; +import * as BIP32 from "bip32"; +import * as BIP39 from "bip39"; +import CryptoJS from "crypto-js"; +import { HDNodeWallet, Mnemonic, SigningKey, computeAddress, keccak256, ripemd160, sha256 } from "ethers"; +import * as secp256k1 from "secp256k1"; +import * as secp256r1 from "secp256r1"; +import { Bech32AddrType, BIP44_PURPOSE, NEO_COIN_TYPE, ETH_COIN_TYPE, SWTH_COIN_TYPE, Network, defaultNetworkConfig } from "../env"; +import { BIP44Path, randomMnemonic, stringOrBufferToBuffer, stripHexPrefix } from "./crypto"; + +export const ZeroAddress = "0x0000000000000000000000000000000000000000"; + +export interface AddressOptions {} + +export interface AddressBuilder { + /** + * BIP44 coin type + * used in `m/44'/${coinType}'/0'/0/0` + */ + coinType(): number; + + /** + * derives address + * + * @param publicKey accepts both encoded/compressed or unencoded/uncompressed public key + */ + publicKeyToScriptHash(publicKey: string | Buffer): string; + publicKeyToAddress(publicKey: string | Buffer, opts?: T): string; + generateAddress(mnemonic: string, account?: number, opts?: T): string; + + mnemonicToPrivateKey(mnemonic: string, account?: number, opts?: T): Buffer; + + privateKeyToAddress(privateKey: string | Buffer, opts?: T): string; + privateToPublicKey(privateKey: string | Buffer): Buffer; + + /** + * Returns a 33-byte encoded/compressed public key, also known as the encoded public key + * + * @param unencodedPublicKey - 65-byte raw/unencoded public key + */ + encodePublicKey(unencodedPublicKey: string | Buffer): Buffer; +} + +export interface SWTHAddressOptions extends AddressOptions { + network?: Network; + bech32Prefix?: string; + type?: Bech32AddrType; +} + +type SWTHAddressType = AddressBuilder & { + newMnemonic(): string; + getBech32Prefix(net?: Network, bech32Prefix?: string, type?: Bech32AddrType): string; + addrPrefix: { [index: string]: string }; + getAddressBytes(bech32Address: string, networkConfig: Network): Uint8Array; + keyDerivationPath(index?: number, change?: number, account?: number): number[]; + encode(hash: string | Buffer, opts?: SWTHAddressOptions): string; + getModuleAddress(moduleKey: string, network?: Network): string; +}; + +export const SWTHAddress: SWTHAddressType = { + newMnemonic: () => { + return randomMnemonic(); + }, + + coinType: (): number => { + return SWTH_COIN_TYPE; + }, + + keyDerivationPath: (index: number = 0, change: number = 0, account: number = 0): number[] => { + const coinType = SWTHAddress.coinType(); + return new BIP44Path(BIP44_PURPOSE, coinType).update(index, change, account).toArray(); + }, + + publicKeyToScriptHash: (publicKey: string | Buffer): string => { + const pubKeyBuffer = stringOrBufferToBuffer(publicKey)!; + const sha256Hash = sha256(pubKeyBuffer); + const ripemdHash = ripemd160(sha256Hash); + + return stripHexPrefix(ripemdHash); + }, + + publicKeyToAddress: (publicKey: string | Buffer, opts?: SWTHAddressOptions): string => { + const scriptHash = SWTHAddress.publicKeyToScriptHash(publicKey); + const address = SWTHAddress.encode(scriptHash, opts); + return address; + }, + + encodePublicKey: (): Buffer => { + throw new Error("SWTH public keys do not compress"); + }, + + mnemonicToPrivateKey: (mnemonic: string, account: number = 0): Buffer => { + const coinType = SWTHAddress.coinType(); + const path = new BIP44Path(BIP44_PURPOSE, coinType).update(account).generate(); + const seed = BIP39.mnemonicToSeedSync(mnemonic); + const masterKey = BIP32.fromSeed(seed); + const hardenedDerivation = masterKey.derivePath(path); + const privateKey = hardenedDerivation.privateKey; + + if (!privateKey) throw new Error("Private key derivation from mnemonic failed"); + + return privateKey; + }, + + privateToPublicKey: (privateKey: string | Buffer): Buffer => { + const privateKeyBuff = stringOrBufferToBuffer(privateKey)!; + const publicKeyUint8Array: Uint8Array = secp256k1.publicKeyCreate(privateKeyBuff, true); + const publicKey = Buffer.from(publicKeyUint8Array); + return publicKey; + }, + + privateKeyToAddress: (privateKey: string | Buffer, opts?: SWTHAddressOptions): string => { + const publicKey = SWTHAddress.privateToPublicKey(privateKey); + const address = SWTHAddress.publicKeyToAddress(publicKey, opts); + + return address; + }, + + encode: (hash: string | Buffer, opts?: SWTHAddressOptions): string => { + const hashBuff = stringOrBufferToBuffer(hash, "hex")!; + const words = bech32.toWords(hashBuff.slice(0, 20)); + const addressPrefix = SWTHAddress.getBech32Prefix(opts?.network, opts?.bech32Prefix, opts?.type); + const address = bech32.encode(addressPrefix, words); + return address; + }, + + generateAddress: (mnemonic: string, account: number = 0, opts?: SWTHAddressOptions) => { + const privateKey = SWTHAddress.mnemonicToPrivateKey(mnemonic, account); + const address = SWTHAddress.privateKeyToAddress(privateKey, opts); + return address; + }, + + getBech32Prefix(net: Network = Network.MainNet, mainPrefix: string = defaultNetworkConfig[net].bech32Prefix, type: Bech32AddrType = "main") { + const addrPrefix = SWTHAddress.addrPrefix; + switch (type) { + case "main": + // e.g. swth + return mainPrefix; + case "validator": + // e.g. swthvaloper + return mainPrefix + addrPrefix.validator + addrPrefix.operator; + case "consensus": + // e.g. swthvalconspub + return mainPrefix + addrPrefix.validator + addrPrefix.consensus + addrPrefix.public; + default: + return mainPrefix; + } + }, + + addrPrefix: { + validator: "val", + operator: "oper", + consensus: "cons", + public: "pub", + }, + + getAddressBytes: (bech32Address: string, net: Network): Uint8Array => { + const prefix = SWTHAddress.getBech32Prefix(net, undefined, "main"); + const { prefix: b32Prefix, words } = bech32.decode(bech32Address); + if (b32Prefix !== prefix) { + throw new Error("Prefix doesn't match"); + } + return new Uint8Array(bech32.fromWords(words)); + }, + + getModuleAddress: (moduleKey: string, network: Network = Network.MainNet) => { + const addressHash = CryptoJS.SHA256(moduleKey).toString(CryptoJS.enc.Hex); + return SWTHAddress.encode(addressHash, { network }); + }, +}; + +type NEOAddressType = AddressBuilder & { + isAddress(address: string): boolean; + encode(hash: string | Buffer, version?: string): string; +}; + +export const NEOAddress: NEOAddressType = { + coinType: (): number => { + return NEO_COIN_TYPE; + }, + + publicKeyToScriptHash: (publicKey: string | Buffer): string => { + const encodedPublicKey = NEOAddress.encodePublicKey(publicKey); + + const addressScript = Buffer.concat([ + Buffer.from([0x21]), // OptCode.PUSHBYTES21 + encodedPublicKey, + Buffer.from([0xac]), // OptCode.CHECKSIG + ]); + const sha256Hash = sha256(addressScript); + const ripemdHash = ripemd160(sha256Hash); + + return stripHexPrefix(ripemdHash); + }, + + publicKeyToAddress: (publicKey: string | Buffer): string => { + const addressScript = NEOAddress.publicKeyToScriptHash(publicKey); + const address = Base58Check.encode(addressScript, "17"); + + return address; + }, + + encodePublicKey: (unencodedPublicKey: string | Buffer): Buffer => { + const unencPubKeyBuf = stringOrBufferToBuffer(unencodedPublicKey)!; + if (unencPubKeyBuf.length <= 33) { + // length indicates already encoded + return unencPubKeyBuf; + } + + const pointXHex = unencPubKeyBuf.slice(1, 33); + const pointYEven = Boolean(unencPubKeyBuf?.[unencPubKeyBuf.length - 1] && unencPubKeyBuf[unencPubKeyBuf.length - 1]! % 2 === 0); + const compressedPublicKey = Buffer.concat([Buffer.from([pointYEven ? 0x02 : 0x03]), pointXHex]); + return compressedPublicKey; + }, + + encode: (addressScript: string | Buffer, version = "17"): string => { + return Base58Check.encode(addressScript, version); + }, + + mnemonicToPrivateKey: (mnemonic: string, account: number = 0): Buffer => { + const coinType = NEOAddress.coinType(); + const path = new BIP44Path(BIP44_PURPOSE, coinType).update(account).generate(); + const seed = BIP39.mnemonicToSeedSync(mnemonic); + const masterKey = BIP32.fromSeed(seed); + const hardenedDerivation = masterKey.derivePath(path); + const privateKey = hardenedDerivation.privateKey; + + if (!privateKey) throw new Error("Private key derivation from mnemonic failed"); + + return privateKey; + }, + + privateToPublicKey: (privateKey: string | Buffer): Buffer => { + const privateKeyBuff = stringOrBufferToBuffer(privateKey); + const publicKeyUint8Array: Uint8Array = secp256r1.publicKeyCreate(privateKeyBuff, true); + return Buffer.from(publicKeyUint8Array); + }, + + privateKeyToAddress: (privateKey: string | Buffer): string => { + const compressedPublicKey = NEOAddress.privateToPublicKey(privateKey); + const address = NEOAddress.publicKeyToAddress(compressedPublicKey); + + return address; + }, + + generateAddress: (mnemonic: string, account: number = 0) => { + const privateKey = NEOAddress.mnemonicToPrivateKey(mnemonic, account); + return NEOAddress.privateKeyToAddress(privateKey); + }, + + isAddress: (address: string) => { + return wallet.isAddress(address, 0x17); + }, +}; + +type N3AddressType = NEOAddressType & object; + +export const N3Address: N3AddressType = { + ...NEOAddress, + + publicKeyToScriptHash: (publicKey: string | Buffer): string => { + const publicKeyHex = stringOrBufferToBuffer(publicKey)!.toString("hex"); + return wallet.getScriptHashFromPublicKey(publicKeyHex); + }, + + publicKeyToAddress: (publicKey: string | Buffer): string => { + const addressScript = N3Address.publicKeyToScriptHash(publicKey); + return wallet.getAddressFromScriptHash(addressScript); + }, + + privateKeyToAddress: (privateKey: string | Buffer): string => { + const compressedPublicKey = N3Address.privateToPublicKey(privateKey); + const address = N3Address.publicKeyToAddress(compressedPublicKey); + + return address; + }, + + generateAddress: (mnemonic: string, account: number = 0) => { + const privateKey = N3Address.mnemonicToPrivateKey(mnemonic, account); + return N3Address.privateKeyToAddress(privateKey); + }, + + isAddress: (address: string) => { + return wallet.isAddress(address, CONST.DEFAULT_ADDRESS_VERSION); + }, + + encode: (addressScript: string | Buffer, version = "35"): string => { + return Base58Check.encode(addressScript, version); + }, +}; + +type ETHAddressType = AddressBuilder & { + encode(hash: string | Buffer, opts?: SWTHAddressOptions): string; + publicKeyToBech32Address(publicKey: string | Buffer, opts?: SWTHAddressOptions): string; +} + +export const ETHAddress: ETHAddressType = { + coinType: (): number => { + return ETH_COIN_TYPE; + }, + + publicKeyToScriptHash: (publicKey: string | Buffer): string => { + const encodedPublicKey = ETHAddress.encodePublicKey(publicKey); + return keccak256(encodedPublicKey); + }, + + publicKeyToAddress: (publicKey: string): string => { + return computeAddress(publicKey); + }, + + publicKeyToBech32Address: (publicKey: string | Buffer, opts?: SWTHAddressOptions): string => { + const hexAddress = ETHAddress.publicKeyToAddress(publicKey); + return ETHAddress.encode(stripHexPrefix(hexAddress), opts); + }, + + encodePublicKey: (unencodedPublicKey: string | Buffer): Buffer => { + const unencodedPublicKeyBuff = stringOrBufferToBuffer(unencodedPublicKey)!; + const publicKey = SigningKey.computePublicKey(unencodedPublicKeyBuff, true); + return Buffer.from(publicKey, "hex"); + }, + + mnemonicToPrivateKey: (mnemonic: string, account: number = 0): Buffer => { + const coinType = ETHAddress.coinType(); + const path = new BIP44Path(BIP44_PURPOSE, coinType).update(account).generate(); + const wallet = HDNodeWallet.fromMnemonic(Mnemonic.fromPhrase(mnemonic), path); + return Buffer.from(wallet.privateKey?.replace(/^0x/, ""), "hex"); + }, + + privateToPublicKey: (privateKey: string | Buffer): Buffer => { + const privateKeyBuff = stringOrBufferToBuffer(privateKey)!; + return Buffer.from(SigningKey.computePublicKey(privateKeyBuff).replace(/^0x/, ""), "hex"); + }, + + privateKeyToAddress: (privateKey: string | Buffer): string => { + const compressedPublicKey = ETHAddress.privateToPublicKey(privateKey); + const address = ETHAddress.publicKeyToAddress(compressedPublicKey); + return address; + }, + + generateAddress: (mnemonic: string, account: number = 0) => { + const privateKey = ETHAddress.mnemonicToPrivateKey(mnemonic, account); + return ETHAddress.privateKeyToAddress(privateKey); + }, + encode: (hash: string | Buffer, opts?: SWTHAddressOptions): string => { + const hashBuff = stringOrBufferToBuffer(hash, "hex")!; + const words = bech32.toWords(hashBuff.slice(0, 20)); + const addressPrefix = SWTHAddress.getBech32Prefix(opts?.network, opts?.bech32Prefix, opts?.type); + const address = bech32.encode(addressPrefix, words); + return address; + }, +}; \ No newline at end of file diff --git a/packages/core/src/util/crypto.ts b/packages/core/src/util/crypto.ts index a6c2439..2cf00ae 100644 --- a/packages/core/src/util/crypto.ts +++ b/packages/core/src/util/crypto.ts @@ -1,3 +1,6 @@ +import * as BIP39 from "bip39"; +import * as wif from "wif"; + /** * Convenience function to coalesce a string/buffer into a buffer * @@ -67,3 +70,20 @@ export class BIP44Path { return BIP44Path.generateBIP44String(this.index, this.change, this.account, this.coinType, this.purpose); } } + +export const randomMnemonic = () => { + return BIP39.generateMnemonic(); +}; + +export const wifEncodePrivateKey = (privateKey: string | Buffer, iter: number = 128) => { + const privateKeyBuf = stringOrBufferToBuffer(privateKey)!; + return wif.encode(iter, privateKeyBuf, true); +}; + +export const stripHexPrefix = (input: string) => { + return input?.slice(0, 2) === "0x" ? input.slice(2) : input; +}; + +export const appendHexPrefix = (input: string) => { + return input?.slice(0, 2) === "0x" ? input : `0x${input}`; +}; \ No newline at end of file diff --git a/packages/core/src/util/index.ts b/packages/core/src/util/index.ts index 26256d9..3cdf5bc 100644 --- a/packages/core/src/util/index.ts +++ b/packages/core/src/util/index.ts @@ -1,4 +1,6 @@ +export * from "./address"; export * from "./crypto"; export * from "./misc"; export * from "./number"; export * from "./tx"; +export * from "./types"; \ No newline at end of file diff --git a/packages/core/src/util/number.ts b/packages/core/src/util/number.ts index ac2ce35..a91ed71 100644 --- a/packages/core/src/util/number.ts +++ b/packages/core/src/util/number.ts @@ -12,4 +12,4 @@ export const parseBN = (input?: string | BigNumber | number | null, defaultValue export const bnOrZero = (input?: string | BigNumber | number | null, defaultValue: BigNumber = BN_ZERO) => { return parseBN(input, defaultValue)!; -}; +}; \ No newline at end of file diff --git a/packages/core/src/util/tx.ts b/packages/core/src/util/tx.ts index beb0943..67a9323 100644 --- a/packages/core/src/util/tx.ts +++ b/packages/core/src/util/tx.ts @@ -92,4 +92,4 @@ export namespace QueueManager { triggerDelay?: number; maxDelayThreshold?: number; } -} +}; \ No newline at end of file diff --git a/packages/core/src/util/types.ts b/packages/core/src/util/types.ts new file mode 100644 index 0000000..061fbe1 --- /dev/null +++ b/packages/core/src/util/types.ts @@ -0,0 +1,7 @@ +import { NetworkMap } from "../env"; + +export interface SimpleMap { + [index: string]: T; +}; + +export type OptionalNetworkMap = Partial>; \ No newline at end of file diff --git a/packages/core/src/util/typings.d.ts b/packages/core/src/util/typings.d.ts new file mode 100644 index 0000000..92f5279 --- /dev/null +++ b/packages/core/src/util/typings.d.ts @@ -0,0 +1,2 @@ +declare module "base58check"; +declare module "secp256r1"; \ No newline at end of file diff --git a/packages/core/tsconfig.types.json b/packages/core/tsconfig.types.json index 8500d2f..6cdf9f5 100644 --- a/packages/core/tsconfig.types.json +++ b/packages/core/tsconfig.types.json @@ -2,7 +2,7 @@ "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", - "rootDir": "src", + "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] diff --git a/packages/hydrogen/src/index.ts b/packages/hydrogen/src/index.ts index 6887c87..56216ca 100644 --- a/packages/hydrogen/src/index.ts +++ b/packages/hydrogen/src/index.ts @@ -1,2 +1,2 @@ export * from "./client"; -export * as Hydrogen from "./types"; +export * as Hydrogen from "./types"; \ No newline at end of file diff --git a/packages/polynetwork/package.json b/packages/polynetwork/package.json index 6d611a0..9cef0ce 100644 --- a/packages/polynetwork/package.json +++ b/packages/polynetwork/package.json @@ -13,6 +13,14 @@ "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { + "@cityofzion/neon-api": "^4.9.0", + "@cityofzion/neon-core": "^4.9.0", + "@cityofzion/neon-core-next": "npm:@cityofzion/neon-core@^5.0.0", + "@cityofzion/neon-js": "^4.9.0", + "@demex-sdk/core": "0.0.7", + "@zilliqa-js/zilliqa": "^2.2.0", + "neo-dapi": "^2.0.4", + "neo3-dapi": "^1.0.1", "tslib": "^2.6.2" }, "exports": { diff --git a/packages/polynetwork/src/client.ts b/packages/polynetwork/src/client.ts new file mode 100644 index 0000000..b077537 --- /dev/null +++ b/packages/polynetwork/src/client.ts @@ -0,0 +1,113 @@ +import { DemexQueryClient, Network, NetworkConfig as CoreNetworkConfig, TokenClient, defaultNetworkConfig } from "@demex-sdk/core"; +import { PolynetworkConfig, PolynetworkConfigs } from "./env"; +import { ETHClient, N3Client, NEOClient, ZILClient } from "./helpers"; + +export class PolynetworkClient { + neo: NEOClient; + eth: ETHClient; + bsc: ETHClient; + arbitrum: ETHClient; + polygon: ETHClient; + mantle: ETHClient; + op: ETHClient; + base: ETHClient; + okc: ETHClient; + zil: ZILClient; + n3: N3Client; + + private constructor( + public readonly tokenClient: TokenClient, + public readonly polynetworkConfig: PolynetworkConfig, + public readonly network: Network, + ) { + this.neo = NEOClient.instance({ + polynetworkConfig, + tokenClient, + network, + }); + + this.n3 = N3Client.instance({ + polynetworkConfig, + tokenClient, + network, + }); + + this.eth = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "Ethereum", + network, + }); + + this.bsc = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "Binance Smart Chain", + network, + }); + + this.zil = ZILClient.instance({ + polynetworkConfig, + tokenClient, + network, + }); + + this.arbitrum = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "Arbitrum", + network, + }); + + this.polygon = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "Polygon", + network, + }); + + this.okc = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "OKC", + network, + }); + + this.mantle = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "Mantle", + network, + }); + + this.op = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "OP", + network, + }); + + this.base = ETHClient.instance({ + polynetworkConfig, + tokenClient, + blockchain: "Base", + network, + }); + }; + + public static instance(queryClient: DemexQueryClient, network: Network) { + const coreNetworkConfig = defaultNetworkConfig[network]; + const polynetworkConfig = PolynetworkConfigs[network]; + const tokenClient = TokenClient.instance(queryClient, coreNetworkConfig); + return new PolynetworkClient(tokenClient, polynetworkConfig, network); + }; + + public async initialize(): Promise { + try { + await this.tokenClient.initialize(); + } catch (err) { + const errorTyped = err as Error; + console.error("failed to initialize tokenClient:", errorTyped.message); + } + }; +}; \ No newline at end of file diff --git a/packages/polynetwork/src/env/balance.ts b/packages/polynetwork/src/env/balance.ts new file mode 100644 index 0000000..b7c223d --- /dev/null +++ b/packages/polynetwork/src/env/balance.ts @@ -0,0 +1,12 @@ +import { Carbon } from "@demex-sdk/codecs"; + +export interface TokensWithExternalBalance extends Carbon.Coin.Token { + externalBalance: string; +}; + +export interface TokenInitInfo { + address: string; + decimals: number; + symbol: string; + name: string; +}; \ No newline at end of file diff --git a/packages/polynetwork/src/env/blockchain.ts b/packages/polynetwork/src/env/blockchain.ts new file mode 100644 index 0000000..a77c93d --- /dev/null +++ b/packages/polynetwork/src/env/blockchain.ts @@ -0,0 +1,19 @@ +export type EVMChain = + "Binance Smart Chain" + | "Ethereum" + | "Arbitrum" + | "Polygon" + | "OKC" + | "Mantle" + | "OP" + | "Base"; +export const evmChains: Set = new Set([ + "Binance Smart Chain", + "Ethereum", + "Arbitrum", + "Polygon", + "OKC", + "Mantle", + "OP", + "Base", +]); \ No newline at end of file diff --git a/packages/polynetwork/src/env/index.ts b/packages/polynetwork/src/env/index.ts new file mode 100644 index 0000000..cf7aee0 --- /dev/null +++ b/packages/polynetwork/src/env/index.ts @@ -0,0 +1,3 @@ +export * from "./balance"; +export * from "./blockchain"; +export * from "./networkConfig"; \ No newline at end of file diff --git a/packages/polynetwork/src/env/networkConfig.ts b/packages/polynetwork/src/env/networkConfig.ts new file mode 100644 index 0000000..e23e288 --- /dev/null +++ b/packages/polynetwork/src/env/networkConfig.ts @@ -0,0 +1,334 @@ +import { CONST } from "@cityofzion/neon-core-next"; +import { Network, NetworkMap } from "@demex-sdk/core"; +import { EVMChain } from "./blockchain"; + +export interface BasicNetworkConfig { + rpcURL: string +}; + +export interface EthNetworkConfig extends BasicNetworkConfig { + wsURL: string; + lockProxyAddr: string; + balanceReader: string; +}; + +export interface NeoNetworkConfig extends BasicNetworkConfig { + wrapperScriptHash: string; +}; + +export interface N3NetworkConfig extends BasicNetworkConfig { + networkMagic: number; +}; + +export interface ZilNetworkConfig extends BasicNetworkConfig { + chainId: number; + lockProxyAddr: string; +}; + +export type EVMConfig = { + [chain in EVMChain]: EthNetworkConfig; +} + +export type PolynetworkConfig = EVMConfig & { + feeAddress: string; + bech32Prefix: string; + + "Neo": NeoNetworkConfig; + "Neo3": N3NetworkConfig; + "Zilliqa": ZilNetworkConfig; +}; + +const EthNetworkConfigFallback: EthNetworkConfig = { + rpcURL: "", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", +} + +export const PolynetworkConfigs: NetworkMap = { + [Network.MainNet]: { + feeAddress: "08d8f59e475830d9a1bb97d74285c4d34c6dac08", // swth1prv0t8j8tqcdngdmjlt59pwy6dxxmtqgycy2h7 + bech32Prefix: "swth", + + "Ethereum": { + rpcURL: "https://eth-mainnet.alchemyapi.io/v2/RWHcfoaBKzRpXnLONcEDnVqtUp7StNYl", + wsURL: "wss://mainnet.dagger.matic.network", + lockProxyAddr: "0x9a016ce184a22dbf6c17daa59eb7d3140dbd1c54", + balanceReader: "0xe5e83cdba612672785d835714af26707f98030c3", + }, + + "Binance Smart Chain": { + rpcURL: "https://bsc-dataseed2.binance.org/", + wsURL: "", + lockProxyAddr: "0xb5d4f343412dc8efb6ff599d790074d0f1e8d430", + balanceReader: "0x2b18c5e1edaa7e27d40fec8d0b7d96c5eefa35df", + }, + + "Arbitrum": { + rpcURL: "https://arb1.arbitrum.io/rpc", + wsURL: "", + lockProxyAddr: "0xb1e6f8820826491fcc5519f84ff4e2bdbb6e3cad", + balanceReader: "0x7e8d8c98a016877cb3103e837fc71d41b155af70", + }, + + "Polygon": { + rpcURL: "https://polygon-rpc.com", + wsURL: "", + lockProxyAddr: "0x43138036d1283413035B8eca403559737E8f7980", + balanceReader: "0x7F31D17944a3147C31C3b55B71ebDcC57B6aCC84", + }, + + "OKC": { + rpcURL: "https://exchainrpc.okex.org", + wsURL: "", + lockProxyAddr: "0xb1e6f8820826491fcc5519f84ff4e2bdbb6e3cad", + balanceReader: "0x43138036d1283413035B8eca403559737E8f7980", + }, + + "Neo": { + rpcURL: "https://mainnet2.neo2.coz.io:443", + wrapperScriptHash: "f46719e2d16bf50cddcef9d4bbfece901f73cbb6", + }, + + "Neo3": { + rpcURL: "https://n3-rpc.dem.exchange", + networkMagic: CONST.MAGIC_NUMBER.MainNet, + }, + + "Zilliqa": { + rpcURL: "https://api.zilliqa.com", + lockProxyAddr: "0xd73c6b871b4d0e130d64581993b745fc938a5be7", + chainId: 1, + }, + + "Mantle": { + ...EthNetworkConfigFallback, + rpcURL: "https://rpc.mantle.xyz", + }, + + "OP": { + ...EthNetworkConfigFallback, + rpcURL: "https://mainnet.optimism.io", + }, + + "Base": { + ...EthNetworkConfigFallback, + rpcURL: "https://base-rpc.publicnode.com", + }, + }, + + [Network.TestNet]: { + feeAddress: "989761fb0c0eb0c05605e849cae77d239f98ac7f", // swth1nztkr7cvp6cvq4s9apyu4emayw0e3trl9ezyzs + bech32Prefix: "tswth", + + "Ethereum": { + rpcURL: "https://eth-goerli.g.alchemy.com/v2/OTTRiEhTje49mmrrm4WbuPbZmuZMivEu", + wsURL: "", + lockProxyAddr: "0xa06569e48fed18ed840c3f064ffd9bbf95debce7", + balanceReader: "0xf6fBa7Bbc806F55dA52af17203d84C61FfFa18c2", + }, + + "Binance Smart Chain": { + rpcURL: "https://data-seed-prebsc-1-s2.binance.org:8545/", + wsURL: "", + lockProxyAddr: "0x7c2b13d656d222cb79670e301dd826dc5b8dc20c", + balanceReader: "0x25c22f65cb820e787a13951f295d0b86db7b07b5", + }, + + "Arbitrum": { + rpcURL: "https://rinkeby.arbitrum.io/rpc", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "Polygon": { + rpcURL: "https://rpc-mumbai.maticvigil.com", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "OKC": { + rpcURL: "https://exchaintestrpc.okex.org", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "Neo": { + rpcURL: "https://g30trj885e.execute-api.ap-southeast-1.amazonaws.com", + wrapperScriptHash: "f46719e2d16bf50cddcef9d4bbfece901f73cbb6", + }, + + "Neo3": { + rpcURL: "https://test-n3-rpc.dem.exchange", + networkMagic: CONST.MAGIC_NUMBER.TestNet, + }, + + "Zilliqa": { + rpcURL: "https://dev-api.zilliqa.com", + lockProxyAddr: "0xe7bef341044f1b8d5ab1a25172e2678a1e75479a", + chainId: 111, + }, + + "Mantle": { + ...EthNetworkConfigFallback, + rpcURL: "https://rpc.sepolia.mantle.xyz", + }, + + "OP": { + ...EthNetworkConfigFallback, + rpcURL: "https://sepolia.optimism.io", + }, + + "Base": { + ...EthNetworkConfigFallback, + rpcURL: "https://base-sepolia-rpc.publicnode.com", + }, + }, + + [Network.DevNet]: { + feeAddress: "989761fb0c0eb0c05605e849cae77d239f98ac7f", // swth1nztkr7cvp6cvq4s9apyu4emayw0e3trl9ezyzs + bech32Prefix: "swth", + + "Ethereum": { + rpcURL: "https://eth-goerli.g.alchemy.com/v2/OTTRiEhTje49mmrrm4WbuPbZmuZMivEu", + wsURL: "", + lockProxyAddr: "0x7f7317167e90afa38972e46b031bb4da0b1f6f73", + balanceReader: "0xf6fBa7Bbc806F55dA52af17203d84C61FfFa18c2", + }, + + "Binance Smart Chain": { + rpcURL: "https://data-seed-prebsc-1-s2.binance.org:8545/", + wsURL: "", + lockProxyAddr: "0x7c2b13d656d222cb79670e301dd826dc5b8dc20c", + balanceReader: "0x25c22f65cb820e787a13951f295d0b86db7b07b5", + }, + + "Arbitrum": { + rpcURL: "https://rinkeby.arbitrum.io/rpc", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "Polygon": { + rpcURL: "https://rpc-mumbai.maticvigil.com", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "OKC": { + rpcURL: "https://exchaintestrpc.okex.org", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + + "Neo": { + rpcURL: "https://g30trj885e.execute-api.ap-southeast-1.amazonaws.com", + wrapperScriptHash: "f46719e2d16bf50cddcef9d4bbfece901f73cbb6", + }, + + "Neo3": { + rpcURL: "https://test-n3-rpc.dem.exchange", + networkMagic: CONST.MAGIC_NUMBER.TestNet, + }, + + "Zilliqa": { + rpcURL: "https://dev-api.zilliqa.com", + lockProxyAddr: "0xa5a43eecd29534edf80792a9889f52c77455245d", + chainId: 333, + }, + + "Mantle": { + ...EthNetworkConfigFallback, + rpcURL: "https://rpc.sepolia.mantle.xyz", + }, + + "OP": { + ...EthNetworkConfigFallback, + rpcURL: "https://sepolia.optimism.io", + }, + + "Base": { + ...EthNetworkConfigFallback, + rpcURL: "https://base-sepolia-rpc.publicnode.com", + }, + }, + + [Network.Local]: { + feeAddress: "989761fb0c0eb0c05605e849cae77d239f98ac7f", + bech32Prefix: "tswth", + + "Ethereum": { + rpcURL: "https://eth-goerli.g.alchemy.com/v2/OTTRiEhTje49mmrrm4WbuPbZmuZMivEu", + wsURL: "wss://ropsten.dagger.matic.network", + lockProxyAddr: "", + balanceReader: "", + }, + + "Binance Smart Chain": { + rpcURL: "https://data-seed-prebsc-1-s2.binance.org:8545/", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "Arbitrum": { + rpcURL: "https://rinkeby.arbitrum.io/rpc", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "Polygon": { + rpcURL: "https://rpc-mumbai.maticvigil.com", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + "OKC": { + rpcURL: "https://exchaintestrpc.okex.org", + wsURL: "", + lockProxyAddr: "", + balanceReader: "", + }, + + + "Neo": { + rpcURL: "https://g30trj885e.execute-api.ap-southeast-1.amazonaws.com", + wrapperScriptHash: "f46719e2d16bf50cddcef9d4bbfece901f73cbb6", + }, + + "Neo3": { + rpcURL: "https://test-n3-rpc.dem.exchange", + networkMagic: CONST.MAGIC_NUMBER.TestNet, + }, + + "Zilliqa": { + rpcURL: "", + lockProxyAddr: "", + chainId: 1, + }, + + "Mantle": { + ...EthNetworkConfigFallback, + rpcURL: "https://rpc.sepolia.mantle.xyz", + }, + + "OP": { + ...EthNetworkConfigFallback, + rpcURL: "https://sepolia.optimism.io", + }, + + "Base": { + ...EthNetworkConfigFallback, + rpcURL: "https://base-sepolia-rpc.publicnode.com", + }, + }, +} as const; \ No newline at end of file diff --git a/packages/polynetwork/src/helpers/eth/ETHClient.ts b/packages/polynetwork/src/helpers/eth/ETHClient.ts new file mode 100644 index 0000000..c3f38fc --- /dev/null +++ b/packages/polynetwork/src/helpers/eth/ETHClient.ts @@ -0,0 +1,274 @@ +import { Carbon } from "@demex-sdk/codecs"; +import { Network, SWTHAddress, TokenClient, appendHexPrefix, stripHexPrefix } from "@demex-sdk/core"; +import BigNumber from "bignumber.js"; +import { ethers } from "ethers"; +import { EVMChain, evmChains, EthNetworkConfig, PolynetworkConfig, TokenInitInfo, TokensWithExternalBalance } from "../../env"; +import ABIs from "./abis"; + +export interface ETHClientOpts { + tokenClient: TokenClient; + blockchain: EVMChain; + network: Network; + polynetworkConfig: PolynetworkConfig; +} + +interface ETHTxParams { + gasPriceGwei?: BigNumber; + gasLimit?: BigNumber; + ethAddress: string; + signer: ethers.Signer; + nonce?: number +} + +export interface LockParams extends ETHTxParams { + address: Uint8Array; + amount: BigNumber; + token: Carbon.Coin.Token; + signCompleteCallback?: () => void; +} +export interface ApproveERC20Params extends ETHTxParams { + token: Carbon.Coin.Token; + spenderAddress?: string; + amount?: BigNumber; + signCompleteCallback?: () => void; +} + +export interface EthersTransactionResponse extends ethers.Transaction { + wait: () => Promise; +} + +export class ETHClient { + private constructor( + public readonly polynetworkConfig: PolynetworkConfig, + public readonly blockchain: EVMChain, + public readonly tokenClient: TokenClient, + public readonly network: Network, + ) { } + + public static instance(opts: ETHClientOpts) { + const { blockchain, tokenClient, network, polynetworkConfig } = opts; + + if (!evmChains.has(blockchain)) throw new Error(`unsupported blockchain - ${blockchain}`); + + return new ETHClient(polynetworkConfig, blockchain, tokenClient, network); + } + + public async getExternalBalances(address: string, whitelistDenoms?: string[]): Promise { + const tokenQueryResults = await this.tokenClient.getAllTokens(); + const lockProxyAddress = this.getLockProxyAddress().toLowerCase(); + const tokens = tokenQueryResults.filter((token: Carbon.Coin.Token) => { + const isCorrectBlockchain = this.tokenClient.getBlockchain(token.denom) === this.blockchain; + return isCorrectBlockchain && + token.tokenAddress.length == 40 && + token.bridgeAddress.toLowerCase() == stripHexPrefix(lockProxyAddress) && + (!whitelistDenoms || whitelistDenoms.includes(token.denom)) && + this.verifyChecksum(appendHexPrefix(token.tokenAddress)); + }); + const assetIds = tokens.map((token: Carbon.Coin.Token) => { + return this.verifyChecksum(appendHexPrefix(token.tokenAddress)); + }); + + const provider = this.getProvider(); + const contractAddress = this.getBalanceReaderAddress(); + const contract = new ethers.Contract(contractAddress, ABIs.balanceReader, provider); + + const checkSumAddr = ethers.getAddress(address); + const balances = await contract.getBalances!(checkSumAddr, assetIds); + const TokensWithExternalBalanceArr: TokensWithExternalBalance[] = []; + for (let i = 0; i < assetIds.length; i++) { + if (!tokens[i]) continue; + + const indivToken = tokens[i] as Carbon.Coin.Token; + TokensWithExternalBalanceArr.push({ + ...indivToken, + externalBalance: balances[i].toString(), + }); + } + + return TokensWithExternalBalanceArr; + } + + public async approveERC20(params: ApproveERC20Params): Promise { + const { token, gasPriceGwei, gasLimit, ethAddress, spenderAddress, signer, amount } = params; + const contractAddress = token.tokenAddress; + + const rpcProvider = this.getProvider(); + const contract = new ethers.Contract(contractAddress, ABIs.erc20, signer); + + const approvalAmount = BigInt(amount?.toString(10) ?? ethers.MaxUint256) + + const nonce = await this.getTxNonce(ethAddress, params.nonce, rpcProvider); + const approveResultTx = await contract.approve!( + ethers.Typed.address(spenderAddress ?? token.bridgeAddress), + approvalAmount, { + nonce, + ...gasPriceGwei && ({ gasPrice: gasPriceGwei.shiftedBy(9).toString(10) }), + ...gasLimit && ({ gasLimit: gasLimit.toString(10) }), + }); + + return approveResultTx; + } + + public async checkAllowanceERC20(token: Carbon.Coin.Token, owner: string, spender: string) { + const contractAddress = token.tokenAddress; + const rpcProvider = this.getProvider(); + const contract = new ethers.Contract(contractAddress, ABIs.erc20, rpcProvider); + const allowance = await contract.allowance!(owner, spender); + return new BigNumber(allowance.toString()); + } + + public async lockDeposit(params: LockParams): Promise { + const { address, token, amount, gasPriceGwei, gasLimit, ethAddress, signer, signCompleteCallback } = params; + + if (gasLimit?.lt(150000)) { + throw new Error("Minimum gas required: 150,000"); + } + + const networkConfig = this.getNetworkConfig(); + + const assetId = appendHexPrefix(token.tokenAddress); + const targetProxyHash = appendHexPrefix(this.getTargetProxyHash(token)); + const feeAddress = appendHexPrefix(networkConfig.feeAddress); + const toAssetHash = ethers.hexlify(ethers.toUtf8Bytes(token.id)); + + const swthAddress = ethers.hexlify(address); + const contractAddress = this.getLockProxyAddress(); + + const rpcProvider = this.getProvider(); + + const nonce: number = await this.getTxNonce(ethAddress, params.nonce, rpcProvider); + const contract = new ethers.Contract(contractAddress, ABIs.lockProxy, signer); + const lockResultTx = await contract.lock!( + assetId, // _assetHash + targetProxyHash, // _targetProxyHash + swthAddress, // _toAddress + toAssetHash, // _toAssetHash + feeAddress, // _feeAddress + [ + // _values + amount.toString(), // amount + "0", // feeAmount + amount.toString(), // callAmount + ], + { + nonce, + value: "0", + ...gasPriceGwei && ({ gasPrice: gasPriceGwei.shiftedBy(9).toString(10) }), + ...gasLimit && ({ gasLimit: gasLimit.toString(10) }), + + // add tx value for ETH deposits, omit if ERC20 token + ...(token.tokenAddress === "0000000000000000000000000000000000000000" && { + value: amount.toString(), + }), + } + ); + + signCompleteCallback?.(); + + return lockResultTx; + } + + public async isContract(address: string) { + const provider = this.getProvider(); + const code = await provider.getCode(address); + // non-contract addresses should return 0x + return code !== "0x"; + } + + public async retrieveERC20Info(address: string): Promise { + const provider = this.getProvider(); + const contract = new ethers.Contract(address, ABIs.erc20, provider); + const decimals = await contract.decimals!(); + const name = await contract.name!(); + const symbol = await contract.symbol!(); + + return { address, decimals, name, symbol }; + } + + public async formatWithdrawalAddress(address: string): Promise { + const isValidAddress = ethers.isAddress(address); + if (!isValidAddress) { + throw new Error("invalid address"); + } + const isContract = await this.isContract(address); + if (isContract) { + throw new Error("cannot withdraw to contract address"); + } + return address.substr(2); + } + + public getEthSigner(privateKey: ethers.BytesLike): ethers.Wallet { + return new ethers.Wallet(new ethers.SigningKey(privateKey), this.getProvider()); + } + + public async sign(message: string, privateKey: ethers.BytesLike) { + const ethWallet = this.getEthSigner(privateKey); + const messageBytes = ethers.getBytes(message); + const signatureBytes = await ethWallet.signMessage(messageBytes); + const signature = ethers.hexlify(signatureBytes).replace(/^0x/g, ""); + return { + address: ethWallet.address, + signature, + }; + } + + /** + * TargetProxyHash is a hash of token originator address that is used + * for lockproxy asset registration and identification + * + * @param token + */ + public getTargetProxyHash(token: Carbon.Coin.Token) { + const addressBytes = SWTHAddress.getAddressBytes(token.creator, this.network); + const addressHex = stripHexPrefix(ethers.hexlify(addressBytes)); + return addressHex; + } + + public getProvider() { + return new ethers.JsonRpcProvider(this.getProviderUrl()); + } + + public getNetworkConfig(): PolynetworkConfig { + return this.polynetworkConfig; + } + + public getConfig(): EthNetworkConfig { + const networkConfig = this.getNetworkConfig(); + return networkConfig[this.blockchain as EVMChain]; + } + + public getProviderUrl() { + return this.getConfig().rpcURL; + } + + public getLockProxyAddress() { + return this.getConfig().lockProxyAddr; + } + + public getBalanceReaderAddress() { + return this.getConfig().balanceReader; + } + + /** + * verify that address is a valid checksum. + * Returns checksum address if valid, returns undefined if invalid + * @input address to be verified + */ + public verifyChecksum(input: string): string | undefined { + try { + return ethers.getAddress(input); + } catch { + // empty catch + } + } + + public async getTxNonce(ethAddress: string, customNonce?: number, provider?: ethers.JsonRpcProvider): Promise { + if (customNonce && isFinite(customNonce)) return customNonce; + + const rpcProvider = provider ?? this.getProvider(); + const nonce = await rpcProvider.getTransactionCount(ethAddress); + return nonce; + } +} + +export default ETHClient; \ No newline at end of file diff --git a/packages/polynetwork/src/helpers/eth/abis/balanceReader.json b/packages/polynetwork/src/helpers/eth/abis/balanceReader.json new file mode 100644 index 0000000..4a57bf5 --- /dev/null +++ b/packages/polynetwork/src/helpers/eth/abis/balanceReader.json @@ -0,0 +1,26 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "address[]", + "name": "_assetIds", + "type": "address[]" + } + ], + "name": "getBalances", + "outputs": [ + { + "internalType": "uint256[]", + "name": "", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/packages/polynetwork/src/helpers/eth/abis/erc20.json b/packages/polynetwork/src/helpers/eth/abis/erc20.json new file mode 100644 index 0000000..06b572d --- /dev/null +++ b/packages/polynetwork/src/helpers/eth/abis/erc20.json @@ -0,0 +1,222 @@ +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } +] diff --git a/packages/polynetwork/src/helpers/eth/abis/index.ts b/packages/polynetwork/src/helpers/eth/abis/index.ts new file mode 100644 index 0000000..fa7aebd --- /dev/null +++ b/packages/polynetwork/src/helpers/eth/abis/index.ts @@ -0,0 +1,11 @@ +import balanceReader from "./balanceReader.json"; +import erc20 from "./erc20.json"; +import lockProxy from "./lockProxy.json"; + +const ABIs = { + balanceReader, + erc20, + lockProxy, +}; + +export default ABIs; diff --git a/packages/polynetwork/src/helpers/eth/abis/lockProxy.json b/packages/polynetwork/src/helpers/eth/abis/lockProxy.json new file mode 100644 index 0000000..594af51 --- /dev/null +++ b/packages/polynetwork/src/helpers/eth/abis/lockProxy.json @@ -0,0 +1,588 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_swthToken", + "type": "address" + }, + { + "internalType": "address", + "name": "_ccmProxyAddress", + "type": "address" + }, + { + "internalType": "uint64", + "name": "_counterpartChainId", + "type": "uint64" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "fromAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint64", + "name": "toChainId", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "toAssetHash", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "toAddress", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "txArgs", + "type": "bytes" + } + ], + "name": "LockEvent", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "tokenAddress", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "toAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "txArgs", + "type": "bytes" + } + ], + "name": "UnlockEvent", + "type": "event" + }, + { + "inputs": [ + + ], + "name": "ETH_ADDRESS", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "SALT_PREFIX", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_argsBz", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "_fromChainId", + "type": "uint64" + } + ], + "name": "addExtension", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "ccmProxy", + "outputs": [ + { + "internalType": "contract CCMProxy", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "counterpartChainId", + "outputs": [ + { + "internalType": "uint64", + "name": "", + "type": "uint64" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_swthAddress", + "type": "bytes" + } + ], + "name": "createWallet", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "currentNonce", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_receivingAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "extensionTransfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "extensions", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_ownerAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_swthAddress", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_bytecodeHash", + "type": "bytes32" + } + ], + "name": "getWalletAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_targetProxyHash", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_toAddress", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_toAssetHash", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_feeAddress", + "type": "bytes" + }, + { + "internalType": "uint256[]", + "name": "_values", + "type": "uint256[]" + } + ], + "name": "lock", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_walletAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "_tokenAddress", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_targetProxyHash", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_toAssetHash", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_feeAddress", + "type": "bytes" + }, + { + "internalType": "uint256[]", + "name": "_values", + "type": "uint256[]" + }, + { + "internalType": "uint8", + "name": "_v", + "type": "uint8" + }, + { + "internalType": "bytes32[]", + "name": "_rs", + "type": "bytes32[]" + } + ], + "name": "lockFromWallet", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_argsBz", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_fromContractAddr", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "_fromChainId", + "type": "uint64" + } + ], + "name": "registerAsset", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "registry", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_argsBz", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "_fromChainId", + "type": "uint64" + } + ], + "name": "removeExtension", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "seenMessages", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + + ], + "name": "swthToken", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "name": "tokenFallback", + "outputs": [ + + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "_argsBz", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "_fromContractAddr", + "type": "bytes" + }, + { + "internalType": "uint64", + "name": "_fromChainId", + "type": "uint64" + } + ], + "name": "unlock", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "wallets", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } +] diff --git a/packages/polynetwork/src/helpers/eth/index.ts b/packages/polynetwork/src/helpers/eth/index.ts new file mode 100644 index 0000000..f5efb0c --- /dev/null +++ b/packages/polynetwork/src/helpers/eth/index.ts @@ -0,0 +1 @@ +export { ETHClient } from "./ETHClient"; diff --git a/packages/polynetwork/src/helpers/index.ts b/packages/polynetwork/src/helpers/index.ts new file mode 100644 index 0000000..41efd31 --- /dev/null +++ b/packages/polynetwork/src/helpers/index.ts @@ -0,0 +1,4 @@ +export { ETHClient } from "./eth"; +export { N3Client } from "./neo3"; +export { NEOClient } from "./neoLegacy"; +export { ZILClient } from "./zil"; \ No newline at end of file diff --git a/packages/polynetwork/src/helpers/neo3/N3Client.ts b/packages/polynetwork/src/helpers/neo3/N3Client.ts new file mode 100644 index 0000000..3f9642f --- /dev/null +++ b/packages/polynetwork/src/helpers/neo3/N3Client.ts @@ -0,0 +1,179 @@ +import { rpc, tx, u, wallet } from "@cityofzion/neon-core-next"; +import { GetContractStateResult, InvokeResult } from "@cityofzion/neon-core-next/lib/rpc"; +import { Carbon } from "@demex-sdk/codecs"; +import { Blockchain, N3Address, Network, SimpleMap, TokenClient } from "@demex-sdk/core"; +import BigNumber from "bignumber.js"; +import { N3NetworkConfig, PolynetworkConfig, TokensWithExternalBalance } from "../../env"; +import { O3Types, O3Wallet } from "../../providers/o3Wallet"; + +export interface N3ClientOpts { + polynetworkConfig: PolynetworkConfig; + tokenClient: TokenClient; + network: Network; +} + +export interface LockO3DepositParams { + token: TokensWithExternalBalance; + + toAddressHex: string; + + feeAmount: BigNumber; + amount: BigNumber; + + signCompleteCallback?: () => void; + o3Wallet: O3Wallet; +} + +export interface N3Signer { + scriptHash: string; + sign: (txn: tx.Transaction, networkMagic?: number, k?: string | number) => Promise; +} + +export class N3Client { + static blockchain: Blockchain = "Neo3"; + + private rpcClient: rpc.RPCClient; + + private constructor( + public readonly polynetworkConfig: PolynetworkConfig, + public readonly tokenClient: TokenClient, + public readonly network: Network, + ) { + const config = polynetworkConfig[N3Client.blockchain as keyof PolynetworkConfig] as N3NetworkConfig; + const isValidNeoRpcUrl = config.rpcURL?.length > 0; + this.rpcClient = isValidNeoRpcUrl ? new rpc.RPCClient(config.rpcURL) : null!; + }; + + public static instance(opts: N3ClientOpts) { + const { polynetworkConfig, tokenClient, network } = opts; + + return new N3Client(polynetworkConfig, tokenClient, network); + }; + + public async getExternalBalances(address: string, whitelistDenoms?: string[]): Promise { + const tokens = await this.tokenClient.getAllTokens(); + + const balances: SimpleMap = await this.getAllN3Balances(address); + const tokensWithBalance: TokensWithExternalBalance[] = []; + + for (const token of tokens) { + if (!token.tokenAddress.match(/^[0-9a-f]+$/i)) continue; + if (whitelistDenoms && !whitelistDenoms.includes(token.denom)) continue; + const tokenScriptHash = u.reverseHex(token.tokenAddress); + if (!balances[tokenScriptHash]) continue; + + tokensWithBalance.push({ + ...(token as Carbon.Coin.Token), + externalBalance: balances[tokenScriptHash]!, + }); + } + + return tokensWithBalance; + }; + + public async getAllN3Balances(address: string): Promise> { + const response: any = await this.rpcClient.execute( + new rpc.Query({ + method: "getnep17balances", + params: [address], + }) + ); + + const balances: SimpleMap = {}; + for (const balanceResult of response?.balance ?? []) { + balances[balanceResult.assethash.replace(/^0x/i, "")] = balanceResult.amount; + } + + return balances; + }; + + public async lockO3Deposit(params: LockO3DepositParams): Promise { + const { feeAmount, toAddressHex, amount, token, o3Wallet } = params; + if (!o3Wallet.isConnected()) { + throw new Error("O3 wallet not connected. Please reconnect and try again."); + } + + const nonce = Math.floor(Math.random() * 1000000); + const networkConfig = this.getConfig(); + + const lockProxyScriptHash = u.reverseHex(token.bridgeAddress); + const tokenScriptHash = u.reverseHex(token.tokenAddress); + const fromAddressHex = o3Wallet.address; + + const publicKeyOutput = (await o3Wallet.getPublicKeyOutput()) as O3Types.PublicKeyOutput; + const accountScriptHash = N3Address.publicKeyToScriptHash(publicKeyOutput.publicKey); + + const feeAddress = feeAmount.isZero() ? "" : u.HexString.fromHex(networkConfig.feeAddress).toBase64(); + + const args: O3Types.Argument[] = [ + { type: O3Types.ArgTypes.Hash160, value: tokenScriptHash }, + { type: O3Types.ArgTypes.Hash160, value: fromAddressHex }, + { type: O3Types.ArgTypes.ByteArray, value: u.HexString.fromHex(toAddressHex).toBase64() }, + { type: O3Types.ArgTypes.Integer, value: amount.toString(10) }, + { type: O3Types.ArgTypes.Integer, value: feeAmount.toString(10) }, + { type: O3Types.ArgTypes.ByteArray, value: feeAddress }, + { type: O3Types.ArgTypes.Integer, value: nonce.toString() }, + ]; + + const result = await o3Wallet.getDAPI().invoke({ + operation: "lock", + scriptHash: lockProxyScriptHash, + args, + network: o3Wallet.neoNetwork, + signers: [ + { + account: accountScriptHash, + scopes: tx.WitnessScope.Global, + }, + ], + }); + return result.txid; + }; + + public async formatWithdrawalAddress(address: string): Promise { + const isValidAddress = wallet.isAddress(address); + if (!isValidAddress) { + throw new Error("invalid address"); + } + const scriptHash = wallet.getScriptHashFromAddress(address); + // return the little endian version of the address + return u.reverseHex(scriptHash); + }; + + public async retrieveNEP17Info(address: string) { + const result: [InvokeResult, InvokeResult, GetContractStateResult] = await this.rpcClient.executeAll([ + new rpc.Query({ + method: "invokefunction", + params: [address, "decimals"], + }), + new rpc.Query({ + method: "invokefunction", + params: [address, "symbol"], + }), + new rpc.Query({ + method: "getcontractstate", + params: [address], + }), + ]); + const [decimalRaw, symbolRaw, nameRaw] = result; + let decimals: number = 0; + let symbol: string = ""; + let name: string = ""; + if (typeof decimalRaw?.stack?.[0]?.value === "string") { + decimals = Number(decimalRaw.stack[0].value); + } + if (typeof symbolRaw?.stack?.[0]?.value === "string") { + symbol = Buffer.from(symbolRaw.stack[0].value, "base64").toString("ascii"); + } + if (typeof nameRaw.manifest.name === "string") { + name = nameRaw.manifest.name; + } + return { name, symbol, address, decimals }; + }; + + getConfig() { + return this.polynetworkConfig; + }; +} + +export default N3Client; \ No newline at end of file diff --git a/packages/polynetwork/src/helpers/neo3/index.ts b/packages/polynetwork/src/helpers/neo3/index.ts new file mode 100644 index 0000000..5fc7ac2 --- /dev/null +++ b/packages/polynetwork/src/helpers/neo3/index.ts @@ -0,0 +1 @@ +export { N3Client } from "./N3Client"; diff --git a/packages/polynetwork/src/helpers/neoLegacy/NEOClient.ts b/packages/polynetwork/src/helpers/neoLegacy/NEOClient.ts new file mode 100644 index 0000000..8702b16 --- /dev/null +++ b/packages/polynetwork/src/helpers/neoLegacy/NEOClient.ts @@ -0,0 +1,202 @@ +import * as Neon from "@cityofzion/neon-core"; +import { Carbon } from "@demex-sdk/codecs"; +import { Blockchain, NEOAddress, Network, SimpleMap, stripHexPrefix, SWTHAddress, TokenClient } from "@demex-sdk/core"; +import BigNumber from "bignumber.js"; +import { ethers } from "ethers"; +import { chunk } from "lodash"; +import { NeoNetworkConfig, PolynetworkConfig, TokenInitInfo, TokensWithExternalBalance } from "../../env"; +import { O3Types, O3Wallet } from "../../providers/o3Wallet"; + +export interface NEOClientOpts { + polynetworkConfig: PolynetworkConfig; + tokenClient: TokenClient; + network: Network; +} + +export interface LockO3DepositParams { + feeAmount: BigNumber; + amount: BigNumber; + address: Uint8Array; + token: TokensWithExternalBalance; + o3Wallet: O3Wallet; + signCompleteCallback?: () => void; +} + +interface ScriptResult { + stack: ReadonlyArray<{ type: string; value: string }>; +} + +export class NEOClient { + static blockchain: Blockchain = "Neo"; + + private constructor( + public readonly polynetworkConfig: PolynetworkConfig, + public readonly tokenClient: TokenClient, + public readonly network: Network, + ) { } + + public static instance(opts: NEOClientOpts) { + const { polynetworkConfig, tokenClient, network } = opts; + + return new NEOClient(polynetworkConfig, tokenClient, network); + } + + public static parseHexNum(hex: string, exp: number = 0): string { + if (!hex || typeof hex !== "string") return "0"; + const res: string = hex.length % 2 !== 0 ? `0${hex}` : hex; + return new BigNumber(res ? Neon.u.reverseHex(res) : "00", 16).shiftedBy(-exp).toString(); + } + + public async getExternalBalances( + address: string, + url: string, + whitelistDenoms?: string[], + ): Promise { + const tokenQueryResults = await this.tokenClient.getAllTokens(); + const account = new Neon.wallet.Account(address); + const tokens = tokenQueryResults.filter((token: Carbon.Coin.Token) => { + const isCorrectBlockchain = this.tokenClient.getBlockchain(token.denom) === NEOClient.blockchain; + return (isCorrectBlockchain || token.denom === "swth") && token.tokenAddress.length == 40 && token.bridgeAddress.length == 40; + }); + + const client: Neon.rpc.RPCClient = new Neon.rpc.RPCClient(url, "2.5.2"); // TODO: should we change the RPC version?? + + // NOTE: fetching of tokens is chunked in sets of 15 as we may hit + // the gas limit on the RPC node and error out otherwise + const promises: Promise>[] = chunk(tokens, 75).map(async (partition: ReadonlyArray) => { + const acc: SimpleMap = {}; + for (const token of partition) { + if (whitelistDenoms && !whitelistDenoms.includes(token.denom)) continue; + const sb: Neon.sc.ScriptBuilder = new Neon.sc.ScriptBuilder(); + sb.emitAppCall(Neon.u.reverseHex(token.tokenAddress), "balanceOf", [Neon.u.reverseHex(account.scriptHash)]); + + try { + const response: ScriptResult = (await client.invokeScript(sb.str)) as ScriptResult; + acc[token.denom.toUpperCase()] = + response?.stack?.[0]?.type === "Integer" // Happens on polychain devnet + ? response.stack[0]?.value + : NEOClient.parseHexNum(response.stack[0]!.value); + } catch (err) { + console.error("Could not retrieve external balance for ", token.denom); + console.error(err); + } + } + + return acc; + }); + + const result = await Promise.all(promises).then((results: SimpleMap[]) => { + return results.reduce((acc: object, res: object) => ({ ...acc, ...res }), {}); + }); + + const TokensWithExternalBalanceArr: TokensWithExternalBalance[] = []; + for (const token of tokens) { + TokensWithExternalBalanceArr.push({ + ...token, + externalBalance: result[token.denom.toUpperCase()] ?? '0', + }); + } + + return TokensWithExternalBalanceArr; + } + + public async lockO3Deposit(params: LockO3DepositParams) { + const { feeAmount, address, amount, token, o3Wallet } = params; + if (!o3Wallet.isConnected()) { + throw new Error("O3 wallet not connected. Please reconnect and try again."); + } + + const publicKeyOutput = (await o3Wallet.getPublicKeyOutput()) as O3Types.PublicKeyOutput; + + const networkConfig = this.getNetworkConfig(); + const scriptHash = Neon.u.reverseHex(token.bridgeAddress); + + const fromAssetHash = Neon.u.reverseHex(token.tokenAddress); + const fromAddress = NEOAddress.publicKeyToAddress(publicKeyOutput.publicKey); + const targetProxyHash = this.getTargetProxyHash(token); + const toAssetHash = Neon.u.str2hexstring(token.id); + const toAddress = stripHexPrefix(ethers.hexlify(address)); + + const nonce = Math.floor(Math.random() * 1000000); + + if (amount.lt(feeAmount)) { + throw new Error("Invalid amount"); + } + + const data: any = [ + Neon.sc.ContractParam.hash160(fromAssetHash), + Neon.sc.ContractParam.hash160(fromAddress), + Neon.sc.ContractParam.byteArray(targetProxyHash, "hex"), + Neon.sc.ContractParam.byteArray(toAssetHash, "hex"), + Neon.sc.ContractParam.byteArray(toAddress, "hex"), + Neon.sc.ContractParam.integer(amount.toNumber()), + Neon.sc.ContractParam.integer(feeAmount.toNumber()), + Neon.sc.ContractParam.byteArray(networkConfig.feeAddress, "hex"), + Neon.sc.ContractParam.integer(nonce), + ]; + + const tx = await o3Wallet.getDAPI().invoke({ + scriptHash, + args: data, + operation: "lock", + fee: 0, + }); + + return tx.txid; + } + + public async retrieveNEP5Info(scriptHash: string): Promise { + const url = this.getProviderUrl(); + const sb = new Neon.sc.ScriptBuilder(); + sb.emitAppCall(scriptHash, "symbol", []); + sb.emitAppCall(scriptHash, "name", []); + sb.emitAppCall(scriptHash, "decimals", []); + + const response = await Neon.rpc.Query.invokeScript(sb.str).execute(url); + + if (response?.result?.state !== "HALT") throw new Error("retrieve failed"); + + const symbol = Neon.u.hexstring2str(response.result.stack?.[0].value); + const name = Neon.u.hexstring2str(response.result.stack?.[1].value); + const decimals = parseInt(response.result.stack?.[2].value ?? "0", 10); + + return { address: scriptHash, decimals, name, symbol }; + } + + public async formatWithdrawalAddress(address: string): Promise { + const isValidAddress = Neon.wallet.isAddress(address); + if (!isValidAddress) { + throw new Error("invalid address"); + } + const scriptHash = Neon.wallet.getScriptHashFromAddress(address); + // return the little endian version of the address + return Neon.u.reverseHex(scriptHash); + } + + /** + * TargetProxyHash is a hash of token originator address that is used + * for lockproxy asset registration and identification + * + * @param token + */ + public getTargetProxyHash(token: Carbon.Coin.Token) { + const addressBytes = SWTHAddress.getAddressBytes(token.creator, this.network); + const addressHex = stripHexPrefix(ethers.hexlify(addressBytes)); + return addressHex; + } + + public getNetworkConfig(): PolynetworkConfig { + return this.polynetworkConfig; + } + + public getConfig(): NeoNetworkConfig { + const networkConfig = this.getNetworkConfig(); + return networkConfig.Neo; + } + + public getProviderUrl() { + return this.getConfig().rpcURL; + } +} + +export default NEOClient; \ No newline at end of file diff --git a/packages/polynetwork/src/helpers/neoLegacy/index.ts b/packages/polynetwork/src/helpers/neoLegacy/index.ts new file mode 100644 index 0000000..191603c --- /dev/null +++ b/packages/polynetwork/src/helpers/neoLegacy/index.ts @@ -0,0 +1 @@ +export { NEOClient } from "./NEOClient"; diff --git a/packages/polynetwork/src/helpers/zil/ZILClient.ts b/packages/polynetwork/src/helpers/zil/ZILClient.ts new file mode 100644 index 0000000..b698e6e --- /dev/null +++ b/packages/polynetwork/src/helpers/zil/ZILClient.ts @@ -0,0 +1,399 @@ +import { Carbon } from "@demex-sdk/codecs"; +import { appendHexPrefix, Blockchain, Network, stripHexPrefix, SWTHAddress, TokenClient, ZeroAddress } from "@demex-sdk/core"; +import { Transaction, Wallet } from "@zilliqa-js/account"; +import { CallParams, Contract, Value } from "@zilliqa-js/contract"; +import { BN, bytes, Long } from "@zilliqa-js/util"; +import { fromBech32Address, Zilliqa } from "@zilliqa-js/zilliqa"; +import BigNumber from "bignumber.js"; +import { ethers } from "ethers"; +import { PolynetworkConfig, TokensWithExternalBalance, ZilNetworkConfig } from "../../env"; + +const uint128Max = "340282366920938463463374607431768211356"; +const zeroAddress = stripHexPrefix(ZeroAddress); + +export declare type WalletProvider = Omit< + Zilliqa & { + wallet: Wallet & { + net: string; + defaultAccount: { + base16: string; + bech32: string; + }; + }; + }, // ugly hack for zilpay non-standard API + "subscriptionBuilder" +>; + +export interface ZILClientOpts { + polynetworkConfig: PolynetworkConfig; + tokenClient: TokenClient; + network: Network; +} + +interface ZILTxParams { + gasPrice: BigNumber; + gasLimit: BigNumber; + zilAddress: string; + signer: WalletProvider | string; +} + +export interface ZILLockParams extends ZILTxParams { + address: Uint8Array; + amount: BigNumber; + token: Carbon.Coin.Token; + signCompleteCallback?: () => void; +} + +export interface ApproveZRC2Params extends ZILTxParams { + token: Carbon.Coin.Token; + spenderAddress?: string; + signCompleteCallback?: () => void; +} + +export enum BatchRequestType { + Balance = "balance", + TokenBalance = "tokenBalance", + TokenAllowance = "tokenAllowance", +} +interface BatchRequestItem { + id: string; + jsonrpc: string; + method: string; + params: any[]; +} + +interface BatchRequest { + type: string; + item: BatchRequestItem; +} + +interface BatchResponse { + request: BatchRequest; + result: any; +} + +export const tokenBalanceBatchRequest = (tokenAddress: string, walletAddress: string): BatchRequest => { + return { + type: BatchRequestType.TokenBalance, + item: { + id: "1", + jsonrpc: "2.0", + method: "GetSmartContractSubState", + params: [ + tokenAddress, // hex token address + "balances", + [walletAddress], + ], + }, + }; +}; + +export const balanceBatchRequest = (address: string): BatchRequest => { + return { + type: BatchRequestType.Balance, + item: { + id: "1", + jsonrpc: "2.0", + method: "GetBalance", + params: [address], + }, + }; +}; + +export class ZILClient { + static blockchain: Blockchain = "Zilliqa"; + + private walletProvider?: WalletProvider; // zilpay + + private constructor( + public readonly polynetworkConfig: PolynetworkConfig, + public readonly tokenClient: TokenClient, + public readonly network: Network, + ) { }; + + public static instance(opts: ZILClientOpts) { + const { polynetworkConfig, tokenClient, network } = opts; + + return new ZILClient(polynetworkConfig, tokenClient, network); + } + + public async getExternalBalances(address: string, whitelistDenoms?: string[], version = "V1"): Promise { + const tokenQueryResults = await this.tokenClient.getAllTokens(); + const tokens = tokenQueryResults.filter((token: Carbon.Coin.Token) => { + const isCorrectBlockchain = this.tokenClient.getBlockchain(token.denom) === ZILClient.blockchain; + return isCorrectBlockchain && token.tokenAddress.length == 40 && (!whitelistDenoms || whitelistDenoms.includes(token.denom)) + }); + + const requests = tokens.map((token: Carbon.Coin.Token) => + token.tokenAddress === zeroAddress + ? balanceBatchRequest(address.replace(/^0x/i, "")) + : tokenBalanceBatchRequest(token.tokenAddress, address) + ); + const response = await fetch(this.getProviderUrl(), { + method: "post", + headers: { "content-type": "application/json" }, + body: JSON.stringify(requests.flatMap((request: BatchRequest) => request.item)), + }); + const results = await response.json() as BatchResponse; + + const TokensWithExternalBalanceArr: TokensWithExternalBalance[] = []; + if (!Array.isArray(results)) { + return TokensWithExternalBalanceArr; + } + + results.forEach((result: any, i: number) => { + const token = tokens[i]; + if (token) { + TokensWithExternalBalanceArr.push({ + ...token, + externalBalance: result.result?.balance ?? result.result.balances?.[address] ?? '0', + // result.result?.balance - zil balance query result + // result.result.balances?.[address] - zrc2 balance query result + }); + } + }); + + return TokensWithExternalBalanceArr; + } + + public async formatWithdrawalAddress(bech32Address: string): Promise { + // const isValidAddress = isValidChecksumAddress(bech32Address) + // if (!isValidAddress) { + // throw new Error("invalid address") + // } + return fromBech32Address(bech32Address).toLowerCase().substr(2); + } + + // see examplesV2/zil_client.ts on how to confirm the transactions + // to confirm the zilpay method, use : + // const lock_tx = await zilclient.lockDeposit() + // const emptyTx = new Transaction({ toAddr: toAddr }, new HTTPProvider(sdk.zil.getProviderUrl()) + // const confirmedTxn = await emptyTx.confirm(lock_tx.id) + // + // to confirm the privatekey method use : + // const lock_tx = await zilclient.lockDeposit() + // const txn = await lock_tx.confirm(lock_tx.id) + private async callContract( + contract: Contract, + transition: string, + args: Value[], + params: CallParams, + toDs?: boolean + ): Promise { + if (this.walletProvider) { + // zilpay + const txn = await (contract as any).call(transition, args, params, toDs); + txn.id = txn.ID; + txn.isRejected = function (this: { errors: any[]; exceptions: any[] }) { + return this.errors.length > 0 || this.exceptions.length > 0; + }; + return txn; + } else { + // default; e.g. privatekey + return await contract.callWithoutConfirm(transition, args, params, toDs); + } + } + + public async approveZRC2(params: ApproveZRC2Params) { + const { token, gasPrice, gasLimit, zilAddress, spenderAddress, signer } = params; + const contractAddress = token.tokenAddress; + + let zilliqa; + if (typeof signer === "string") { + zilliqa = new Zilliqa(this.getProviderUrl()); + zilliqa.wallet.addByPrivateKey(signer); + } else if (signer) { + zilliqa = new Zilliqa(this.getProviderUrl(), signer.provider); + this.walletProvider = signer; + } else { + zilliqa = new Zilliqa(this.getProviderUrl()); + } + const deployedContract = (this.walletProvider || zilliqa).contracts.at(contractAddress); + const balanceAndNonceResp = await zilliqa.blockchain.getBalance(stripHexPrefix(zilAddress)); + if (balanceAndNonceResp.error !== undefined) { + throw new Error(balanceAndNonceResp.error.message); + } + + const nonce = balanceAndNonceResp.result.nonce + 1; + const version = bytes.pack(this.getConfig().chainId, Number(1)); + + const callParams = { + version: version, + nonce: nonce, + amount: new BN(0), + gasPrice: new BN(gasPrice.toString()), + gasLimit: Long.fromString(gasLimit.toString()), + }; + + const transitionParams = [ + { + vname: "spender", + type: "ByStr20", + // TODO: Check if bridgeAddress corresponds to carbon token lock_proxy_hash + value: spenderAddress ?? appendHexPrefix(token.bridgeAddress), + }, + { + vname: "amount", + type: "Uint128", + value: uint128Max, + }, + ]; + + const data = { + _tag: "IncreaseAllowance", + params: [...transitionParams], + }; + + const callTx = await this.callContract(deployedContract, data._tag, data.params, callParams, true); + return callTx; + } + + public async checkAllowanceZRC2(token: Carbon.Coin.Token, owner: string, spender: string) { + const contractAddress = appendHexPrefix(token.tokenAddress); + const zilliqa = new Zilliqa(this.getProviderUrl()); + const resp = await zilliqa.blockchain.getSmartContractSubState(contractAddress, "allowances", [owner, spender]); + if (resp.error !== undefined) { + throw new Error(resp.error.message); + } + + if (resp.result === null) { + return new BigNumber("0"); + } + + return new BigNumber(resp.result.allowances[owner][spender]); + } + + public async lockDeposit(params: ZILLockParams) { + const { address, amount, token, gasPrice, gasLimit, zilAddress, signer } = params; + const networkConfig = this.getNetworkConfig(); + + const assetId = appendHexPrefix(token.tokenAddress); + const targetProxyHash = appendHexPrefix(this.getTargetProxyHash(token)); + const feeAddress = appendHexPrefix(networkConfig.feeAddress); + const toAssetHash = ethers.hexlify(ethers.toUtf8Bytes(token.id)); + const swthAddress = ethers.hexlify(address); + // TODO: Check if bridgeAddress corresponds to carbon token lock_proxy_hash + const contractAddress = appendHexPrefix(token.bridgeAddress); + + let zilliqa; + if (typeof signer === "string") { + zilliqa = new Zilliqa(this.getProviderUrl()); + zilliqa.wallet.addByPrivateKey(signer); + } else if (signer) { + zilliqa = new Zilliqa(this.getProviderUrl(), signer.provider); + this.walletProvider = signer; + } else { + zilliqa = new Zilliqa(this.getProviderUrl()); + } + + const deployedContract = (this.walletProvider || zilliqa).contracts.at(contractAddress); + const balanceAndNonceResp = await zilliqa.blockchain.getBalance(stripHexPrefix(zilAddress)); + if (balanceAndNonceResp.error !== undefined) { + throw new Error(balanceAndNonceResp.error.message); + } + + const nonce = balanceAndNonceResp.result.nonce + 1; + const version = bytes.pack(this.getConfig().chainId, Number(1)); + + let nativeAmt = new BN(0); + if (token.tokenAddress == zeroAddress) { + nativeAmt = new BN(amount.toString()); + } + + const callParams = { + version: version, + nonce: nonce, + amount: nativeAmt, + gasPrice: new BN(gasPrice.toString()), + gasLimit: Long.fromString(gasLimit.toString()), + }; + + const transitionParams = [ + { + vname: "tokenAddr", + type: "ByStr20", + value: assetId, + }, + { + vname: "targetProxyHash", + type: "ByStr", + value: targetProxyHash, + }, + { + vname: "toAddress", + type: "ByStr", + value: swthAddress, + }, + { + vname: "toAssetHash", + type: "ByStr", + value: toAssetHash, + }, + { + vname: "feeAddr", + type: "ByStr", + value: feeAddress, + }, + { + vname: "amount", + type: "Uint256", + value: amount.toString(), + }, + { + vname: "feeAmount", + type: "Uint256", + value: "0", + }, + ]; + + const data = { + _tag: "lock", + params: [...transitionParams], + }; + + const callTx = await this.callContract(deployedContract, data._tag, data.params, callParams, true); + return callTx; + } + + public async retrieveZRC2Info(address: string) { + const zilliqa = new Zilliqa(this.getProviderUrl()); + const smartContractInit = await zilliqa.blockchain.getSmartContractInit(address); + const mask = ["name", "_this_address", "symbol", "decimals"]; + const result = smartContractInit.result; + if (result === undefined) throw new Error(`token contract ${address} is not found`); + const intermediate = result + .filter(({ vname }) => mask.includes(vname)) + .reduce( + (prev, cur) => ({ ...prev, [cur.vname === "_this_address" ? "address" : cur.vname]: cur.value }), + <{ name: string; symbol: string; decimals: string; address: string }>{} + ); + return { ...intermediate, decimals: Number(intermediate.decimals) }; + } + + /** + * TargetProxyHash is a hash of token originator address that is used + * for lockproxy asset registration and identification + * + * @param token + */ + public getTargetProxyHash(token: Carbon.Coin.Token) { + const addressBytes = SWTHAddress.getAddressBytes(token.creator, this.network); + const addressHex = stripHexPrefix(ethers.hexlify(addressBytes)); + return addressHex; + } + + public getNetworkConfig(): PolynetworkConfig { + return this.polynetworkConfig; + } + + public getConfig(): ZilNetworkConfig { + const networkConfig = this.getNetworkConfig(); + return networkConfig[ZILClient.blockchain as keyof PolynetworkConfig] as ZilNetworkConfig; + } + + public getProviderUrl() { + return this.getConfig().rpcURL; + } +} + +export default ZILClient; \ No newline at end of file diff --git a/packages/polynetwork/src/helpers/zil/index.ts b/packages/polynetwork/src/helpers/zil/index.ts new file mode 100644 index 0000000..d18987b --- /dev/null +++ b/packages/polynetwork/src/helpers/zil/index.ts @@ -0,0 +1 @@ +export { ZILClient } from "./ZILClient"; diff --git a/packages/polynetwork/src/index.ts b/packages/polynetwork/src/index.ts index 336ce12..a60a1bb 100644 --- a/packages/polynetwork/src/index.ts +++ b/packages/polynetwork/src/index.ts @@ -1 +1,5 @@ -export {} +export * from "./env"; +export * from "./helpers"; +export * from "./providers"; + +export { PolynetworkClient } from "./client"; diff --git a/packages/polynetwork/src/providers/index.ts b/packages/polynetwork/src/providers/index.ts new file mode 100644 index 0000000..9778c06 --- /dev/null +++ b/packages/polynetwork/src/providers/index.ts @@ -0,0 +1 @@ +export { O3Wallet, O3Types } from "./o3Wallet"; \ No newline at end of file diff --git a/packages/polynetwork/src/providers/o3Wallet/O3Types.ts b/packages/polynetwork/src/providers/o3Wallet/O3Types.ts new file mode 100644 index 0000000..b60acb7 --- /dev/null +++ b/packages/polynetwork/src/providers/o3Wallet/O3Types.ts @@ -0,0 +1,104 @@ +import { Network } from "@demex-sdk/core"; +import BigNumber from "bignumber.js"; +import neo3Dapi from "neo3-dapi"; +import { TokensWithExternalBalance } from "../../env"; + +export type AcceptedNets = "N3MainNet" | "MainNet"; + +// O3 Wallet Events Enum +export enum Events { + Ready = neo3Dapi.Constants.EventName.READY, + AccountChanged = neo3Dapi.Constants.EventName.ACCOUNT_CHANGED, + Connected = neo3Dapi.Constants.EventName.CONNECTED, + Disconnected = neo3Dapi.Constants.EventName.DISCONNECTED, + NetworkChanged = neo3Dapi.Constants.EventName.NETWORK_CHANGED, + BlockChanged = neo3Dapi.Constants.EventName.BLOCK_HEIGHT_CHANGED, + TxConfirmed = neo3Dapi.Constants.EventName.TRANSACTION_CONFIRMED, +}; + +// O3 Wallet Error Map +export enum Errors { + Denied = "CONNECTION_DENIED", + NoProvider = "NO_PROVIDER", + Rpc = "RPC_ERROR", + MalformedInput = "MALFORMED_INPUT", + Cancelled = "CANCELED", + InsufficientFunds = "INSUFFICIENT_FUNDS", + Unknown = "UNKNOWN_ERROR", +}; + +// Get Networks Query Types +export interface GetNetworksOutput { + chainId?: number; + networks: string[]; + defaultNetwork: string; +}; + +// Get Account Query Types +export interface Account { + address: string; + label: string; +}; + +// Get Public Key Query Types +export interface PublicKeyOutput { + publicKey: string; + address: string; +}; + +// Invoke Function Types +export enum ArgTypes { + String = "String", + Boolean = "Boolean", + Hash160 = "Hash160", + Hash256 = "Hash256", + Integer = "Integer", + ByteArray = "ByteArray", + Array = "Array", + Address = "Address", +}; + +export interface Argument { + type: ArgTypes; + value: any; +}; + +export interface Signers { + account: string; + scopes: number; +}; + +// Get Balance Query Types +export interface BalanceRequest { + address: string; // Address to check balance(s) + contracts?: string[]; // Asset symbol or script hash to check balance +}; + +export interface GetBalanceArgs { + params: BalanceRequest | BalanceRequest[]; + network?: string; +}; + +export interface BalanceResults { + [address: string]: Balance[]; +}; + +export interface Balance { + contract: string; + symbol: string; + amount: string; + assetID?: string; +}; + +// Custom Contract Params +export interface LockDepositParams { + token: TokensWithExternalBalance; + amount: BigNumber; + feeAmount: BigNumber; + toAddress: string; + fromAddress: string; +}; + +export interface O3WalletOpts { + network: Network; +}; \ No newline at end of file diff --git a/packages/polynetwork/src/providers/o3Wallet/O3Wallet.ts b/packages/polynetwork/src/providers/o3Wallet/O3Wallet.ts new file mode 100644 index 0000000..b3f3eae --- /dev/null +++ b/packages/polynetwork/src/providers/o3Wallet/O3Wallet.ts @@ -0,0 +1,191 @@ +import * as Neon from "@cityofzion/neon-core-next"; +import { Carbon } from "@demex-sdk/codecs"; +import { N3Address, NEOAddress, Network, NetworkConfig, SimpleMap } from "@demex-sdk/core"; +import neoDapi from "neo-dapi"; +import neo3Dapi from "neo3-dapi"; +import { PolynetworkConfig, PolynetworkConfigs, TokensWithExternalBalance } from "../../env"; +import * as O3Types from "./O3Types"; + +export class O3Wallet { + public neo3Dapi: any; // for Neo N3 + public neo2Dapi: any; // for Neo Legacy + public neoNetwork: O3Types.AcceptedNets | undefined; + + public networkConfig: PolynetworkConfig; + public address: string = ""; + private publicKey: string = ""; + + private constructor(public readonly network: Network) { + const polynetworkConfig = PolynetworkConfigs[network]; + this.networkConfig = polynetworkConfig!; + + this.neo2Dapi = neoDapi; + this.neo3Dapi = neo3Dapi; + } + + public static instance(opts: O3Types.O3WalletOpts) { + const { network } = opts; + + return new O3Wallet(network); + } + + async connectWallet() { + try { + const publicKeyOutput = (await this.getPublicKeyOutput()) as O3Types.PublicKeyOutput; + this.address = publicKeyOutput.address; + this.publicKey = publicKeyOutput.publicKey; + return publicKeyOutput; + } catch (err) { + const type = (err as any).type ?? ""; + throw new Error(type ?? (err as Error)?.message ?? ""); + } + } + + disconnectWallet() { + this.address = ""; + this.publicKey = ""; + this.neoNetwork = undefined; + } + + isConnected() { + return this.address !== ""; + } + + async lockDeposit(lockParams: O3Types.LockDepositParams) { + const { token, amount, feeAmount, toAddress, fromAddress } = lockParams; + + try { + if (this.publicKey === "") { + throw new Error("O3 wallet is not connected. Please reconnect and perform this transaction again."); + } + + const scriptHash = Neon.u.reverseHex(token.bridgeAddress); + const tokenScriptHash = Neon.u.reverseHex(token.tokenAddress); + const nonce = Math.floor(Math.random() * 1000000); + const scriptHashAccount = + this.neoNetwork === "N3MainNet" + ? N3Address.publicKeyToScriptHash(this.publicKey) + : NEOAddress.publicKeyToScriptHash(this.publicKey); + + const args: O3Types.Argument[] = [ + { type: O3Types.ArgTypes.Hash160, value: tokenScriptHash }, + { type: O3Types.ArgTypes.Hash160, value: fromAddress }, + { type: O3Types.ArgTypes.ByteArray, value: toAddress }, + { type: O3Types.ArgTypes.Integer, value: amount.toString(10) }, + { type: O3Types.ArgTypes.Integer, value: feeAmount.toString(10) }, + { type: O3Types.ArgTypes.ByteArray, value: Neon.u.HexString.fromHex(this.networkConfig.feeAddress, true) }, + { type: O3Types.ArgTypes.Integer, value: nonce.toString() }, + ]; + + const signers: O3Types.Signers[] = [ + { + account: scriptHashAccount, + scopes: 16, + }, + ]; + const output = await this.assembleAndInvoke("lock", scriptHash, args, false, signers); + return output; + } catch (err) { + const type = (err as any).type; + throw new Error(type ?? (err as Error)?.message ?? ""); + } + } + + async assembleAndInvoke( + operation: string, + scriptHash: string, + args: O3Types.Argument[], + broadcastOverride: boolean = false, + signers: O3Types.Signers[] + ) { + try { + const dApi = this.getDAPI(); + const invokeMsg = { + scriptHash, + operation, + args, + network: this.neoNetwork, + broadcastOverride: broadcastOverride, + ...(this.neoNetwork === "N3MainNet" && { signers }), + }; + return dApi.invoke(invokeMsg); + } catch (err) { + const type = (err as any).type; + throw new Error(type ?? (err as Error)?.message ?? ""); + } + } + + async getWalletBalances(tokens: Carbon.Coin.Token[]) { + try { + if (!this.isConnected()) { + throw new Error("O3 wallet is not connected. Please reconnect and perform this transaction again."); + } + + const tokenMap = tokens.reduce((tokens: SimpleMap, indivToken: Carbon.Coin.Token) => { + const newTokens = tokens; + const tokenAddress = indivToken.tokenAddress; + newTokens[tokenAddress] = indivToken; + return newTokens; + }, {}); + const argsBalance: O3Types.GetBalanceArgs = { + params: [ + { + address: this.address, + contracts: Object.keys(tokenMap).map((token: string) => `0x${token}`), + }, + ], + }; + const dapi = this.getDAPI(); + const response = (await dapi.getBalance(argsBalance)) as O3Types.BalanceResults; + + const balanceMap: SimpleMap = {}; + const balances: O3Types.Balance[] = response[this.address] ?? []; + balances.forEach((balance: O3Types.Balance) => { + const assetId = balance.assetID?.replace("0x", "") ?? balance.contract.replace("0x", ""); + const tokenContract = Neon.u.reverseHex(assetId); + const tokenInfo = tokenMap[tokenContract]; + if (!tokenInfo) { + return; + } + + balanceMap[tokenInfo.denom] = { + ...tokenInfo, + externalBalance: balance.amount, + }; + }); + + return balanceMap; + } catch (err) { + const type = (err as any).type; + throw new Error(type ?? (err as Error)?.message ?? ""); + } + } + + async getNetworks() { + return this.neo3Dapi.getNetworks(); + } + + async getPublicKeyOutput() { + const dapi = this.getDAPI(); + return dapi.getPublicKey(); + } + + async getAccount() { + const dapi = this.getDAPI(); + return dapi.getAccount(); + } + + getDAPI() { + return this.neoNetwork === "N3MainNet" ? this.neo3Dapi : this.neo2Dapi; + } + + setNetwork(network: string) { + if (network === "N3MainNet" || network === "MainNet") { + this.neoNetwork = network; + } else { + this.neoNetwork = undefined; + } + } +} + +export default O3Wallet; diff --git a/packages/polynetwork/src/providers/o3Wallet/index.ts b/packages/polynetwork/src/providers/o3Wallet/index.ts new file mode 100644 index 0000000..d5fe4b9 --- /dev/null +++ b/packages/polynetwork/src/providers/o3Wallet/index.ts @@ -0,0 +1,2 @@ +export { default as O3Wallet } from "./O3Wallet"; +export * as O3Types from "./O3Types"; \ No newline at end of file diff --git a/packages/polynetwork/tsconfig.cjs.json b/packages/polynetwork/tsconfig.cjs.json index 8f8d634..e3311dc 100644 --- a/packages/polynetwork/tsconfig.cjs.json +++ b/packages/polynetwork/tsconfig.cjs.json @@ -5,5 +5,5 @@ "baseUrl": "." }, "extends": "../../tsconfig.cjs.json", - "include": ["src/"] + "include": ["src/", "src/**/*.json"] } diff --git a/packages/polynetwork/tsconfig.es.json b/packages/polynetwork/tsconfig.es.json index ce87108..12b1e2b 100644 --- a/packages/polynetwork/tsconfig.es.json +++ b/packages/polynetwork/tsconfig.es.json @@ -5,5 +5,5 @@ "baseUrl": "." }, "extends": "../../tsconfig.es.json", - "include": ["src/"] + "include": ["src/", "src/**/*.json"] } diff --git a/packages/polynetwork/tsconfig.types.json b/packages/polynetwork/tsconfig.types.json index 8500d2f..1995f1b 100644 --- a/packages/polynetwork/tsconfig.types.json +++ b/packages/polynetwork/tsconfig.types.json @@ -2,8 +2,8 @@ "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", - "rootDir": "src", + "rootDir": "src" }, "extends": "../../tsconfig.types.json", - "include": ["src/"] + "include": ["src/", "src/**/*.json"] } diff --git a/yarn.lock b/yarn.lock index 86c33fe..67aa6b4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,16 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== +"@angular/compiler@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-9.0.0.tgz#87e0bef4c369b6cadae07e3a4295778fc93799d5" + integrity sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ== + +"@angular/core@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-9.0.0.tgz#227dc53e1ac81824f998c6e76000b7efc522641e" + integrity sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w== + "@babel/runtime@^7.11.2", "@babel/runtime@^7.21.0", "@babel/runtime@^7.5.5": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" @@ -210,6 +220,70 @@ human-id "^1.0.2" prettier "^2.7.1" +"@cityofzion/neon-api@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cityofzion/neon-api/-/neon-api-4.9.0.tgz#ab11aef2c132baced5a764ac42573577938eaf9c" + integrity sha512-8eN3N3sGgd4L7qFaFATKr94kA/65626eo6hB7fHL+S8OGCVCrrl3tfh8GAOv50vLxd2YyoDu9pBY/0NPKY8tsQ== + dependencies: + "@types/node" "15.0.3" + axios "0.21.1" + isomorphic-ws "4.0.1" + ws "7.4.5" + +"@cityofzion/neon-core-next@npm:@cityofzion/neon-core@^5.0.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@cityofzion/neon-core/-/neon-core-5.6.0.tgz#4b9f339263644b956243a3e5707be94f9ee344c1" + integrity sha512-46Y8A/SgKNXIMFbyNUSX63aUA9tWfe3eKmXaX97AGNNR62tPw45yBVxkfAGLECS9MVy/Y4jgi9/TacGQMEaNsQ== + dependencies: + bn.js "5.2.1" + bs58 "5.0.0" + buffer "6.0.3" + cross-fetch "^3.1.5" + crypto-js "4.2.0" + elliptic "6.5.4" + ethereum-cryptography "2.0.0" + lodash "4.17.21" + loglevel "1.8.1" + loglevel-plugin-prefix "0.8.4" + +"@cityofzion/neon-core@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cityofzion/neon-core/-/neon-core-4.9.0.tgz#aed0c67997534a7ca1a4c4fbef43858551d0cbbb" + integrity sha512-z4UgEIjAS9E2QP6HSTzri02DFY++nYmfzbspi1818mvnTst6Lf8bDNYYxG/686wdYN2dEF3RuccMXraw2Bm31g== + dependencies: + "@types/bn.js" "5.1.0" + "@types/bs58" "4.0.1" + "@types/crypto-js" "4.0.1" + "@types/elliptic" "6.4.12" + axios "0.21.1" + bignumber.js "7.2.1" + bn.js "5.2.0" + bs58 "4.0.1" + bs58check "2.1.2" + crypto-js "4.0.0" + elliptic "6.5.4" + loglevel "1.7.1" + loglevel-plugin-prefix "0.8.4" + scrypt-js "3.0.1" + secure-random "1.1.2" + wif "2.0.6" + +"@cityofzion/neon-js@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cityofzion/neon-js/-/neon-js-4.9.0.tgz#39f46720cff76f807128d5882832a3d722d9fd25" + integrity sha512-YYeMbQGZJkC8Wq2UQt98OUys8f8tPCaXMplbV8GwiJEdG+PJJOFGg3NkvrDGUfcuasff0dcn8LWjXTPKPp+Gyw== + dependencies: + "@cityofzion/neon-api" "^4.9.0" + "@cityofzion/neon-core" "^4.9.0" + "@cityofzion/neon-nep5" "^4.9.0" + +"@cityofzion/neon-nep5@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@cityofzion/neon-nep5/-/neon-nep5-4.9.0.tgz#aa170bfa83c5ef75270d10951e02f87e7faf4f47" + integrity sha512-MSRXHl+UGYnh8f9FC7zZvMNRblnl496VxG3tjA+GIShtLR6u75/FK7syVXua9h8/khljL7qqSfnNqA+sy7q+eg== + dependencies: + "@cityofzion/neon-core" "^4.9.0" + "@confio/ics23@^0.6.8": version "0.6.8" resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" @@ -588,6 +662,13 @@ globby "^11.0.0" read-yaml-file "^1.1.0" +"@noble/curves@1.0.0", "@noble/curves@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.0.0.tgz#e40be8c7daf088aaf291887cbc73f43464a92932" + integrity sha512-2upgEu0iLiDVDZkNLeFV2+ht0BAVgQnEmCk6JsOch9Rp8xfkMCbvbAZlA2pBHQc73dbl+vFOXfqkf4uemdn0bw== + dependencies: + "@noble/hashes" "1.3.0" + "@noble/curves@1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" @@ -595,6 +676,11 @@ dependencies: "@noble/hashes" "1.3.2" +"@noble/hashes@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1" + integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg== + "@noble/hashes@1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" @@ -605,6 +691,11 @@ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== +"@noble/hashes@~1.3.0": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" + integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -679,6 +770,28 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@scure/base@~1.1.0": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/bip32@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.0.tgz#6c8d980ef3f290987736acd0ee2e0f0d50068d87" + integrity sha512-bcKpo1oj54hGholplGLpqPHRbIsnbixFtc06nwuNM5/dwSXOq/AAYoIBRsBmnZJSdfeNW5rnff7NTAz3ZCqR9Q== + dependencies: + "@noble/curves" "~1.0.0" + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.0.tgz#a207e2ef96de354de7d0002292ba1503538fc77b" + integrity sha512-SX/uKq52cuxm4YFXWFaVByaSHJh2w3BnokVSeUJVCv6K7WulT9u2BuNRBhuFl8vAuYnzx9bEu9WgpcNYTrYieg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -699,6 +812,13 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@types/bip39@^2.4.0": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/bip39/-/bip39-2.4.2.tgz#f5d6617212be496bb998d3969f657f77a10c5287" + integrity sha512-Vo9lqOIRq8uoIzEVrV87ZvcIM0PN9t0K3oYZ/CS61fIYKCBdOIM7mlWzXuRvSXrDtVa1uUO2w1cdfufxTC0bzg== + dependencies: + "@types/node" "*" + "@types/bn.js@*": version "5.1.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203" @@ -706,6 +826,44 @@ dependencies: "@types/node" "*" +"@types/bn.js@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bs58@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/bs58/-/bs58-4.0.1.tgz#3d51222aab067786d3bc3740a84a7f5a0effaa37" + integrity sha512-yfAgiWgVLjFCmRv8zAcOIHywYATEwiTVccTLnRp6UxTNavT55M9d/uhK3T03St/+8/z/wW+CRjGKUNmEqoHHCA== + dependencies: + base-x "^3.0.6" + +"@types/crypto-js@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.0.1.tgz#3a4bd24518b0e6c5940da4e2659eeb2ef0806963" + integrity sha512-6+OPzqhKX/cx5xh+yO8Cqg3u3alrkhoxhE5ZOdSEv0DOzJ13lwJ6laqGU0Kv6+XDMFmlnGId04LtY22PsFLQUw== + +"@types/crypto-js@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.2.0.tgz#01918d35ec66aa806887435c44a67d7a749cf545" + integrity sha512-LW9TlhpMeoQKOu6I6HvOp7eInNNnvd7B+ndAfZb826HUl7eHJJApofbHnlAxrIVS/uiCjkkHGNEaKHoGxB5IHw== + +"@types/elliptic@6.4.12": + version "6.4.12" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.12.tgz#e8add831f9cc9a88d9d84b3733ff669b68eaa124" + integrity sha512-gP1KsqoouLJGH6IJa28x7PXb3cRqh83X8HCLezd2dF+XcAIMKYv53KV+9Zn6QA561E120uOqZBQ+Jy/cl+fviw== + dependencies: + "@types/bn.js" "*" + "@types/elliptic@^6.4.18": version "6.4.18" resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.18.tgz#bc96e26e1ccccbabe8b6f0e409c85898635482e1" @@ -718,6 +876,13 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== +"@types/hdkey@^0.7.0": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@types/hdkey/-/hdkey-0.7.1.tgz#9bc63ebbe96b107b277b65ea7a95442a677d0d61" + integrity sha512-4Kkr06hq+R8a9EzVNqXGOY2x1xA7dhY6qlp6OvaZ+IJy1BCca1Cv126RD9X7CMJoXoLo8WvAizy8gQHpqW6K0Q== + dependencies: + "@types/node" "*" + "@types/json-schema@^7.0.15": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -728,7 +893,7 @@ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb" integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== -"@types/long@^4.0.1": +"@types/long@^4.0.0", "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== @@ -740,6 +905,16 @@ dependencies: undici-types "~6.19.8" +"@types/node@10.12.18": + version "10.12.18" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" + integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== + +"@types/node@15.0.3": + version "15.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.3.tgz#ee09fcaac513576474c327da5818d421b98db88a" + integrity sha512-/WbxFeBU+0F79z9RdEOXH4CsDga+ibi5M8uEYr91u3CkT/pdWcV8MCook+4wDPnZBexRdwWS+PiVZ2xJviAzcQ== + "@types/node@22.7.5": version "22.7.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" @@ -783,6 +958,13 @@ resolved "https://registry.yarnpkg.com/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz#cf89cccd2d93b6245e784c19afe0a9f5038d4528" integrity sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ== +"@types/wif@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/wif/-/wif-2.0.5.tgz#51a6999e692537bb58c028226457fb7b17b24d67" + integrity sha512-addYBlYjDxLfJxDUoyTzICnu0u4snCdGJpICIIFk65zGcdjah3twTJq1Fdy+OdeZSRiof2raFtMqSqF9KeqthQ== + dependencies: + "@types/node" "*" + "@types/ws@^8.5.13": version "8.5.13" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" @@ -790,6 +972,112 @@ dependencies: "@types/node" "*" +"@zilliqa-js/account@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@zilliqa-js/account/-/account-2.2.1.tgz#f12c2ef5219a899bd5c64077fbf0a4b677189ce4" + integrity sha512-egq/S1KyrH8qlmMBKHaAmLU/RLl66JYPDEPe3n97NP/yvrbPTt7sEfgfOwL1IO0hIBLlJPQYIdKtlYHzn22BLw== + dependencies: + "@types/bip39" "^2.4.0" + "@types/hdkey" "^0.7.0" + "@zilliqa-js/core" "2.2.1" + "@zilliqa-js/crypto" "2.2.1" + "@zilliqa-js/proto" "2.2.0" + "@zilliqa-js/util" "2.2.0" + bip39 "^2.5.0" + hdkey "^1.1.0" + +"@zilliqa-js/blockchain@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@zilliqa-js/blockchain/-/blockchain-2.2.1.tgz#bed1811bc5af4ce8cd7f32620a1aa4e368cad975" + integrity sha512-GiUzRAceOgsF9Nk/LzdionZt6QlLMDH72Z4/qt1SQY2vdK0rz9fbjBtQbZjVjfvwvGSjmOBo3KVYPhviJHuGYQ== + dependencies: + "@zilliqa-js/account" "2.2.1" + "@zilliqa-js/contract" "2.2.1" + "@zilliqa-js/core" "2.2.1" + "@zilliqa-js/crypto" "2.2.1" + "@zilliqa-js/util" "2.2.0" + utility-types "^3.4.1" + +"@zilliqa-js/contract@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@zilliqa-js/contract/-/contract-2.2.1.tgz#2b123f0a0ce77f1a20b10a4d2effdffdc260330d" + integrity sha512-DmhElqUbgyUNxwKwKSJq6L8WfxOBVrrQ72crHrnubIgnhN3uNRaS9lZ4oAMAi1o6eSYe94GCBHGOZ5imSYxFrg== + dependencies: + "@zilliqa-js/account" "2.2.1" + "@zilliqa-js/blockchain" "2.2.1" + "@zilliqa-js/core" "2.2.1" + "@zilliqa-js/crypto" "2.2.1" + "@zilliqa-js/util" "2.2.0" + hash.js "^1.1.5" + utility-types "^2.1.0" + +"@zilliqa-js/core@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@zilliqa-js/core/-/core-2.2.1.tgz#c151d1e2cd530f8928236d68835f0ff7faa119b1" + integrity sha512-dEViTcv54waiDckyWROgBcuwDX8iugSKY/Fooa2RynDGHTlb4XvvAxmShTy4+OF1tldhV86cE9nsDW//ICTZPQ== + dependencies: + "@zilliqa-js/crypto" "2.2.1" + "@zilliqa-js/util" "2.2.0" + cross-fetch "^2.2.2" + mitt "^1.1.3" + +"@zilliqa-js/crypto@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@zilliqa-js/crypto/-/crypto-2.2.1.tgz#c1468244f35a9ebf7f0ee27881e0a718c09f8d97" + integrity sha512-80fCuf6Bjpci+mmTfBp9r+umhWbxji8WE4Ii8jz1QtszkWBXLUvXhw6xFv0txgt74ZmUj12Ot1MENALAFEJEDg== + dependencies: + "@zilliqa-js/util" "2.2.0" + aes-js "^3.1.1" + bsert "^0.0.4" + elliptic "^6.5.0" + hash.js "^1.1.5" + hmac-drbg "^1.0.1" + pbkdf2 "^3.0.16" + randombytes "^2.0.6" + scrypt-js "^3.0.1" + scryptsy "^2.1.0" + sodium-native "^3.2.0" + uuid "^3.3.2" + +"@zilliqa-js/proto@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@zilliqa-js/proto/-/proto-2.2.0.tgz#c3fea22daf4a8e385e5f239119765a0d60f18df7" + integrity sha512-0QPNJdvafT0ItPGrqEff7KMYNCT/DkWCn0/x2/UwVoVANy5BHL3WkwDV3y49KthVwdZUotQVzRaweHTs6PIcuA== + dependencies: + protobufjs "^6.8.8" + +"@zilliqa-js/subscriptions@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@zilliqa-js/subscriptions/-/subscriptions-2.2.1.tgz#f334ef896521d3b6d5c87507cee5acf6cfeeb6fd" + integrity sha512-MIz7i1kRCF7TpDzmpOFOhL13xl2CxCfmzpXvaBF1keGcOrqf8o/rgF7YARZ2H5YXobLlGDP5Gjm2qcShkiYfWw== + dependencies: + "@zilliqa-js/core" "2.2.1" + mock-socket "^9.0.2" + websocket "^1.0.28" + +"@zilliqa-js/util@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@zilliqa-js/util/-/util-2.2.0.tgz#6f64adc5494596c93dd0eff566f830b316eba677" + integrity sha512-bzThiraMQKDumhQY0HMsutX28HPgqB+KKqiet8M8QQbCFvQODxAGpuxJX6bZiX+6K6tZUk8yDSW8Ri3dgOdRDg== + dependencies: + "@types/bn.js" "^4.11.3" + "@types/long" "^4.0.0" + bn.js "^4.11.8" + long "^4.0.0" + +"@zilliqa-js/zilliqa@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@zilliqa-js/zilliqa/-/zilliqa-2.2.1.tgz#7d39c8e8459b050033bd5f77126a9fb0fd59d8f6" + integrity sha512-gN3VnuwSvK7SFlzRiXUg18In9rBHn33iZRfmVrggRqTtwG04Dv4AyiCG37+ieNG5hQHI5O+gRrCIPSVG24/n2w== + dependencies: + "@zilliqa-js/account" "2.2.1" + "@zilliqa-js/blockchain" "2.2.1" + "@zilliqa-js/contract" "2.2.1" + "@zilliqa-js/core" "2.2.1" + "@zilliqa-js/crypto" "2.2.1" + "@zilliqa-js/subscriptions" "2.2.1" + "@zilliqa-js/util" "2.2.0" + acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -812,6 +1100,16 @@ aes-js@4.0.0-beta.5: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== +aes-js@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA== + ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -839,6 +1137,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +app-root-path@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" + integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -856,16 +1159,46 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-query@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" + integrity sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw== + dependencies: + ast-types-flow "0.0.7" + commander "^2.11.0" + array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +arraybuffer.slice@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== + +ast-types-flow@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +axios@0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + dependencies: + follow-redirects "^1.10.0" + axios@^1.6.0: version "1.7.7" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" @@ -875,12 +1208,53 @@ axios@^1.6.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +axobject-query@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9" + integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww== + dependencies: + ast-types-flow "0.0.7" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.3.0, base64-js@^1.3.1: +base-x@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-1.1.0.tgz#42d3d717474f9ea02207f6d1aa1f426913eeb7ac" + integrity sha512-c0WLeG3K5OlL4Skz2/LVdS+MjggByKhowxQpG+JpCLA48s/bGwIDyzA1naFjywtNvp/37fLK0p0FpjTNNLLUXQ== + +base-x@^3.0.2, base-x@^3.0.6: + version "3.0.10" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" + integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== + dependencies: + safe-buffer "^5.0.1" + +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + +base58check@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/base58check/-/base58check-2.0.0.tgz#8046652d14bc87f063bd16be94a39134d3b61173" + integrity sha512-sTzsDAOC9+i2Ukr3p1Ie2DWpD117ua+vBJRDnpsSlScGwImeeiTg/IatwcFLsz9K9wEGoBLVd5ahNZzrZ/jZyg== + dependencies: + bs58 "^3.0.0" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g== + +base64-js@^1.0.2, base64-js@^1.3.0, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== @@ -890,6 +1264,13 @@ bech32@^1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ== + dependencies: + callsite "1.0.0" + better-path-resolve@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/better-path-resolve/-/better-path-resolve-1.0.0.tgz#13a35a1104cdd48a7b74bf8758f96a1ee613f99d" @@ -897,18 +1278,47 @@ better-path-resolve@1.0.0: dependencies: is-windows "^1.0.0" +bignumber.js@7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== + bignumber.js@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== -bindings@^1.5.0: +bindings@^1.3.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" +bip32@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134" + integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA== + dependencies: + "@types/node" "10.12.18" + bs58check "^2.1.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + tiny-secp256k1 "^1.1.3" + typeforce "^1.11.5" + wif "^2.0.6" + +bip39@^2.5.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-2.6.0.tgz#9e3a720b42ec8b3fbe4038f1e445317b6a99321c" + integrity sha512-RrnQRG2EgEoqO24ea+Q/fftuPUZLmrEM3qNhhGsA3PbaXaCW791LTzPuVyx/VprXQcTbPJ3K3UeTna8ZnVl2sg== + dependencies: + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + safe-buffer "^5.0.1" + unorm "^1.3.3" + bip39@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3" @@ -916,6 +1326,13 @@ bip39@^3.1.0: dependencies: "@noble/hashes" "^1.2.0" +bip66@^1.1.3, bip66@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" + integrity sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw== + dependencies: + safe-buffer "^5.0.1" + bl@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" @@ -925,16 +1342,31 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== + +bn.js@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== -bn.js@^5.2.0: +bn.js@5.2.1, bn.js@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +bn.js@^4.1.0, bn.js@^4.11.3, bn.js@^4.11.8: + version "4.12.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7" + integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -960,6 +1392,85 @@ browser-headers@^0.4.1: resolved "https://registry.yarnpkg.com/browser-headers/-/browser-headers-0.4.1.tgz#4308a7ad3b240f4203dbb45acedb38dc2d65dd02" integrity sha512-CA9hsySZVo9371qEHjHZtYxV2cFtVj5Wj/ZHi8ooEsrtm4vOnl9Y9HmyYWk9q+05d7K3rdoAE0j3MVEFVvtQtg== +browserify-aes@^1.0.4, browserify-aes@^1.0.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +bs58@4.0.1, bs58@^4.0.0, bs58@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +bs58@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-3.1.0.tgz#d4c26388bf4804cac714141b1945aa47e5eb248e" + integrity sha512-9C2bRFTGy3meqO65O9jLvVTyawvhLVp4h2ECm5KlRPuV5KPDNJZcJIj3gl+aA0ENXcYrUSLCkPAeqbTcI2uWyQ== + dependencies: + base-x "^1.1.0" + +bs58check@2.1.2, bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +bsert@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bsert/-/bsert-0.0.4.tgz#2b3c236357923f0625f948802a5f9b66c0383d0b" + integrity sha512-VReLe1aTaHRmf80YLOHUk8ONQ48SjseZP76GlNIDheD5REYByn/Mm9yrtI0/ZCaFrcfxzgpiw1/hMMCUOSMa3w== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" @@ -968,6 +1479,26 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffer@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +bufferutil@^4.0.1: + version "4.0.8" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" + integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== + dependencies: + node-gyp-build "^4.3.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -996,6 +1527,14 @@ ci-info@^3.7.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.5.tgz#749f80731c7821e9a5fabd51f6998b696f296686" + integrity sha512-xq7ICKB4TMHUx7Tz1L9O2SGKOhYMOTR32oir45Bq28/AQTpHogKgHcoYFSdRbMtddl+ozNXfXY9jWcgYKmde0w== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -1005,6 +1544,26 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +codelyzer@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-6.0.2.tgz#25d72eae641e8ff13ffd7d99b27c9c7ad5d7e135" + integrity sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g== + dependencies: + "@angular/compiler" "9.0.0" + "@angular/core" "9.0.0" + app-root-path "^3.0.0" + aria-query "^3.0.0" + axobject-query "2.0.2" + css-selector-tokenizer "^0.7.1" + cssauron "^1.4.0" + damerau-levenshtein "^1.0.4" + rxjs "^6.5.3" + semver-dsl "^1.0.1" + source-map "^0.5.7" + sprintf-js "^1.1.2" + tslib "^1.10.0" + zone.js "~0.10.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1024,6 +1583,31 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^2.11.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + integrity sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw== + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA== + +component-emitter@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1048,11 +1632,57 @@ cosmjs-types@^0.9.0: resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.9.0.tgz#c3bc482d28c7dfa25d1445093fdb2d9da1f6cfcc" integrity sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ== +create-ecdh@~4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@^2.2.2: + version "2.2.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" + integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== + dependencies: + node-fetch "^2.6.7" + whatwg-fetch "^2.0.4" + +cross-fetch@^3.1.5: + version "3.1.8" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" + integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== + dependencies: + node-fetch "^2.6.12" + cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -1071,6 +1701,54 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +crypto-js@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.0.0.tgz#2904ab2677a9d042856a2ea2ef80de92e4a36dcc" + integrity sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg== + +crypto-js@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + +crypto-js@^3.1.9-1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + +css-selector-tokenizer@^0.7.1: + version "0.7.3" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1" + integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg== + dependencies: + cssesc "^3.0.0" + fastparse "^1.1.2" + +cssauron@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/cssauron/-/cssauron-1.4.0.tgz#a6602dff7e04a8306dc0db9a551e92e8b5662ad8" + integrity sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw== + dependencies: + through X.X.X + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== + dependencies: + es5-ext "^0.10.64" + type "^2.7.2" + +damerau-levenshtein@^1.0.4: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + date-fns@^2.16.1: version "2.30.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" @@ -1078,6 +1756,13 @@ date-fns@^2.16.1: dependencies: "@babel/runtime" "^7.21.0" +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@^4.3.1, debug@^4.3.2: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" @@ -1085,6 +1770,13 @@ debug@^4.3.1, debug@^4.3.2: dependencies: ms "^2.1.3" +debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + decode-uri-component@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -1130,6 +1822,14 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +des.js@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da" + integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" @@ -1152,10 +1852,19 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -elliptic@^6.5.4: - version "6.6.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210" - integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA== +drbg.js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" + integrity sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g== + dependencies: + browserify-aes "^1.0.6" + create-hash "^1.1.2" + create-hmac "^1.1.4" + +elliptic@6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -1165,7 +1874,7 @@ elliptic@^6.5.4: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -elliptic@^6.5.7, elliptic@^6.6.1: +elliptic@^6.2.3, elliptic@^6.4.0, elliptic@^6.5.0, elliptic@^6.5.3, elliptic@^6.5.7, elliptic@^6.6.1: version "6.6.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== @@ -1178,6 +1887,19 @@ elliptic@^6.5.7, elliptic@^6.6.1: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +elliptic@^6.5.4: + version "6.6.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210" + integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1190,6 +1912,34 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +engine.io-client@~3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.3.tgz#aeb45695ced81b787a8a10c92b0bc226b1cb3c53" + integrity sha512-PXIgpzb1brtBzh8Q6vCjzCMeu4nfEPmaDm+L3Qb2sVHwLkxC1qRiBMSjOB0NJNjZ0hbPNUKQa+s8J2XxLOIEeQ== + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~6.1.0" + xmlhttprequest-ssl "~1.6.3" + yeast "0.1.2" + +engine.io-parser@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== + dependencies: + after "0.8.2" + arraybuffer.slice "~0.0.7" + base64-arraybuffer "0.1.5" + blob "0.0.5" + has-binary2 "~1.0.2" + enquirer@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -1210,6 +1960,33 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.63, es5-ext@^0.10.64, es5-ext@~0.10.14: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== + dependencies: + d "^1.0.2" + ext "^1.7.0" + escalade@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -1279,6 +2056,16 @@ eslint@^9.13.0: optionator "^0.9.3" text-table "^0.2.0" +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + espree@^10.0.1, espree@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" @@ -1317,6 +2104,16 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +ethereum-cryptography@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.0.0.tgz#e052b49fa81affae29402e977b8d3a31f88612b6" + integrity sha512-g25m4EtfQGjstWgVE1aIz7XYYjf3kH5kG17ULWVB5dH6uLahsoltOhACzSxyDV+fhn4gbR4xRrOXGe6r2uh4Bg== + dependencies: + "@noble/curves" "1.0.0" + "@noble/hashes" "1.3.0" + "@scure/bip32" "1.3.0" + "@scure/bip39" "1.2.0" + ethers@^6.13.4: version "6.13.4" resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.4.tgz#bd3e1c3dc1e7dc8ce10f9ffb4ee40967a651b53c" @@ -1330,16 +2127,39 @@ ethers@^6.13.4: tslib "2.7.0" ws "8.17.1" +event-emitter@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== + dependencies: + d "1" + es5-ext "~0.10.14" + events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + expand-template@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + extendable-error@^0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" @@ -1380,6 +2200,11 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fastparse@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -1440,7 +2265,7 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== -follow-redirects@^1.15.6: +follow-redirects@^1.10.0, follow-redirects@^1.15.6: version "1.15.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== @@ -1554,6 +2379,18 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.2.0: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +has-binary2@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== + dependencies: + isarray "2.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1585,7 +2422,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.5: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -1600,6 +2437,15 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +hdkey@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/hdkey/-/hdkey-1.1.2.tgz#c60f9cf6f90fbf24a8a52ea06893f36a0108cd3e" + integrity sha512-PTQ4VKu0oRnCrYfLp04iQZ7T2Cxz0UsEXYauk2j8eh6PJXCpbXuCFhOmtIFtbET0i3PMWmHN9J11gU8LEgUljQ== + dependencies: + bs58check "^2.1.2" + safe-buffer "^5.1.1" + secp256k1 "^3.0.1" + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -1621,7 +2467,7 @@ iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -ieee754@^1.1.13: +ieee754@^1.1.13, ieee754@^1.1.4, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -1644,6 +2490,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg== + inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" @@ -1683,17 +2534,27 @@ is-subdir@^1.1.1: dependencies: better-path-resolve "1.0.0" +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + is-windows@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +isarray@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isomorphic-ws@^4.0.1: +isomorphic-ws@4.0.1, isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== @@ -1786,6 +2647,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash-es@4.17.14: + version "4.17.14" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.14.tgz#12a95a963cc5955683cee3b74e85458954f37ecc" + integrity sha512-7zchRrGa8UZXjD/4ivUWP1867jDkhzTG2c/uj739utSd7O/pFFdxspCemIFKEEjErbcqRzn8nKnGsi7mvTgRPA== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -1796,11 +2662,26 @@ lodash.startcase@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== -lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +loglevel-plugin-prefix@0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" + integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== + +loglevel@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== + +loglevel@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.1.tgz#5c621f83d5b48c54ae93b6156353f555963377b4" + integrity sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg== + long@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" @@ -1819,6 +2700,15 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -1871,21 +2761,41 @@ minimist@^1.2.0, minimist@^1.2.3: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +mitt@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mock-socket@^9.0.2: + version "9.3.1" + resolved "https://registry.yarnpkg.com/mock-socket/-/mock-socket-9.3.1.tgz#24fb00c2f573c84812aa4a24181bb025de80cc8e" + integrity sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw== + mri@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +nan@^2.13.2, nan@^2.14.0, nan@^2.2.1: + version "2.22.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== + napi-build-utils@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" @@ -1896,6 +2806,27 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +neo-dapi@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/neo-dapi/-/neo-dapi-2.0.4.tgz#8f3b2543b0e90dbcc69391e651d456e219b06165" + integrity sha512-DikbfAs83SitWZIgYWsi1DrdvyA17qw1AvlGFAYj7o3RGX0Ij+SXb9E+lC2RxHRsT2semIkbNM4YzQvW3INqHQ== + dependencies: + o3-dapi-core "^0.3.13" + o3-dapi-neo "^0.6.1" + +neo3-dapi@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/neo3-dapi/-/neo3-dapi-1.0.1.tgz#afb2c77b061600d2ec8cd3a16e780918b1966157" + integrity sha512-zjgUXXGYsUL4OhEWjDFXjS2Kz2gUKm46hzU6tndKiGznDYLI46tTtF+3BF4r4kU3yrItW2cvDmE0KbhKj3DR4w== + dependencies: + o3-dapi-core "^0.3.13" + o3-dapi-neo3 "1.0.4" + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + node-abi@^3.3.0: version "3.71.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038" @@ -1918,7 +2849,14 @@ node-addon-api@^6.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-gyp-build@^4.2.0, node-gyp-build@^4.5.0: +node-fetch@^2.6.12, node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0, node-gyp-build@^4.5.0: version "4.8.4" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== @@ -1932,6 +2870,37 @@ node-hid@2.1.2: node-addon-api "^3.0.2" prebuild-install "^7.1.1" +o3-dapi-core@^0.3.13: + version "0.3.13" + resolved "https://registry.yarnpkg.com/o3-dapi-core/-/o3-dapi-core-0.3.13.tgz#a86025c9c7c38305a7c29815ac1882a72f5ce810" + integrity sha512-vpS/nFczFUzRndC6NyVnbQZ7SsS7SGhoonM/qH2UX5vbIIWY0xWgFoMxvQBz5/K8hAHFAa4CDMcpEo7V9tnWCA== + dependencies: + browserify-cipher "~1.0.1" + bs58 "^4.0.1" + buffer "~5.2.1" + create-ecdh "~4.0.3" + crypto-js "^3.1.9-1" + lodash-es "4.17.14" + randomfill "~1.0.4" + socket.io-client "~2.2.0" + +o3-dapi-neo3@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/o3-dapi-neo3/-/o3-dapi-neo3-1.0.4.tgz#6b518ea4a07445f538e7a6da68504b6816cb66ee" + integrity sha512-t1BdFckB/gs+17pMC22LBTDrhWF39mNGnk01QMHflsaiYKhgkOtSXKxjaDEj2qB/5KNU/CQi0AsqFTrMIlcrTg== + dependencies: + codelyzer "^6.0.2" + +o3-dapi-neo@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/o3-dapi-neo/-/o3-dapi-neo-0.6.1.tgz#e09c86bb716d09133f74ca1908497e2ea7729a45" + integrity sha512-geKch5aE7A99v/f077A6Tyq0Fv5FKE9GPLtjZyDd4SXk23kj4Ig8agMoTx9ARzdP2ueSq/dcLoNQLzQWnBczUw== + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA== + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -2023,6 +2992,20 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw== + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog== + dependencies: + better-assert "~1.0.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2038,6 +3021,17 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pbkdf2@^3.0.16, pbkdf2@^3.0.9: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + picocolors@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -2138,6 +3132,21 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.0.6: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -2197,7 +3206,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -ripemd160@^2.0.2: +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== @@ -2212,7 +3221,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@6, rxjs@^6.6.3: +rxjs@6, rxjs@^6.5.3, rxjs@^6.6.3: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -2226,7 +3235,7 @@ rxjs@^7.8.1: dependencies: tslib "^2.1.0" -safe-buffer@^5.0.1, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2236,6 +3245,30 @@ safe-buffer@^5.0.1, safe-buffer@^5.2.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scrypt-js@3.0.1, scrypt-js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +scryptsy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790" + integrity sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w== + +secp256k1@^3.0.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.1.tgz#b62a62a882d6b16f9b51fe599c6b3a861e36c59f" + integrity sha512-tArjQw2P0RTdY7QmkNehgp6TVvQXq6ulIhxv8gaH6YubKG/wxxAoNKcbuXjDhybbc+b2Ihc7e0xxiGN744UIiQ== + dependencies: + bindings "^1.5.0" + bip66 "^1.1.5" + bn.js "^4.11.8" + create-hash "^1.2.0" + drbg.js "^1.0.1" + elliptic "^6.5.7" + nan "^2.14.0" + safe-buffer "^5.1.2" + secp256k1@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.1.tgz#dc2c86187d48ff2da756f0f7e96417ee03c414b1" @@ -2245,11 +3278,49 @@ secp256k1@^5.0.1: node-addon-api "^5.0.0" node-gyp-build "^4.2.0" +secp256r1@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/secp256r1/-/secp256r1-0.0.3.tgz#6bcfd4149ee4b4c58d327ac95d4c9a356ea27d83" + integrity sha512-fnhCjlV5aM/zNkCLiRWqfbIzZJ78z4ENZT6Hw/xZz/Ie7CgG95H/TS8rOi0SfcSa2jEjuPjUIQh57ZrApv6JoA== + dependencies: + bip66 "^1.1.3" + bn.js "^4.11.3" + create-hash "^1.1.2" + drbg.js "^1.0.1" + elliptic "^6.2.3" + nan "^2.2.1" + safe-buffer "^5.1.0" + +secure-random@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/secure-random/-/secure-random-1.1.2.tgz#ed103b460a851632d420d46448b2a900a41e7f7c" + integrity sha512-H2bdSKERKdBV1SwoqYm6C0y+9EA94v6SUBOWO8kDndc4NoUih7Dv6Tsgma7zO1lv27wIvjlD0ZpMQk7um5dheQ== + +semver-dsl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/semver-dsl/-/semver-dsl-1.0.1.tgz#d3678de5555e8a61f629eed025366ae5f27340a0" + integrity sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng== + dependencies: + semver "^5.3.0" + +semver@^5.3.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^7.3.5, semver@^7.5.2, semver@^7.5.3, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -2298,6 +3369,47 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +socket.io-client@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" + integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== + dependencies: + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.3.1" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" + +socket.io-parser@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.4.tgz#ab84236b6d06eaf1fb68b179b3a7501195886cc3" + integrity sha512-z/pFQB3x+EZldRRzORYW1vwVO8m/3ILkswtnpoeU6Ve3cbMWkmHEWDAVJn4QJtchiiFTo5j7UG2QvwxvaA9vow== + dependencies: + component-emitter "~1.3.0" + debug "~3.1.0" + isarray "2.0.1" + +sodium-native@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/sodium-native/-/sodium-native-3.4.1.tgz#44616c07ccecea15195f553af88b3e574b659741" + integrity sha512-PaNN/roiFWzVVTL6OqjzYct38NSXewdl2wz8SRB51Br/MLIJPrbM3XexhVWkq7D3UWMysfrhKVf1v1phZq6MeQ== + dependencies: + node-gyp-build "^4.3.0" + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + spawn-command@^0.0.2-1: version "0.0.2" resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" @@ -2316,6 +3428,11 @@ split-on-first@^1.0.0: resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== +sprintf-js@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -2414,6 +3531,22 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +through@X.X.X: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tiny-secp256k1@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tiny-secp256k1/-/tiny-secp256k1-1.1.7.tgz#0c1b6b9d2d93404f9093dc7e287b0aa834480573" + integrity sha512-eb+F6NabSnjbLwNoC+2o5ItbmP1kg7HliWue71JgLegQt6A5mTN8YbvTLCazdlg6e5SV6A+r8OGvZYskdlmhqQ== + dependencies: + bindings "^1.3.0" + bn.js "^4.11.8" + create-hmac "^1.1.7" + elliptic "^6.4.0" + nan "^2.13.2" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -2421,6 +3554,11 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2428,6 +3566,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -2457,7 +3600,7 @@ tslib@2.7.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -2523,6 +3666,23 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type@^2.7.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" + integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typeforce@^1.11.5: + version "1.18.0" + resolved "https://registry.yarnpkg.com/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc" + integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g== + typescript@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" @@ -2548,6 +3708,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +unorm@^1.3.3: + version "1.6.0" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.6.0.tgz#029b289661fba714f1a9af439eb51d9b16c205af" + integrity sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -2564,16 +3729,68 @@ usb@2.9.0: node-addon-api "^6.0.0" node-gyp-build "^4.5.0" +utf-8-validate@^5.0.2: + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== + dependencies: + node-gyp-build "^4.3.0" + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utility-types@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-2.1.0.tgz#0c78fc9f7eb424d14302222b4ddd13fdb17f44ab" + integrity sha512-/nP2gqavggo6l38rtQI/CdeV+2fmBGXVvHgj9kV2MAnms3TIi77Mz9BtapPFI0+GZQCqqom0vACQ+VlTTaCovw== + +utility-types@^3.4.1: + version "3.11.0" + resolved "https://registry.yarnpkg.com/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c" + integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +websocket@^1.0.28: + version "1.0.35" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.35.tgz#374197207d7d4cc4c36cbf8a1bb886ee52a07885" + integrity sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.63" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + +whatwg-fetch@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -2588,6 +3805,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +wif@2.0.6, wif@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704" + integrity sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ== + dependencies: + bs58check "<3.0.0" + word-wrap@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" @@ -2607,6 +3831,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@7.4.5: + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== + ws@8.17.1: version "8.17.1" resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" @@ -2622,6 +3851,18 @@ ws@^8.18.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" + +xmlhttprequest-ssl@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz#03b713873b01659dfa2c1c5d056065b27ddc2de6" + integrity sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q== + xstream@^11.14.0: version "11.14.0" resolved "https://registry.yarnpkg.com/xstream/-/xstream-11.14.0.tgz#2c071d26b18310523b6877e86b4e54df068a9ae5" @@ -2635,6 +3876,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -2663,6 +3909,11 @@ yarn@1.22.22: resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.22.tgz#ac34549e6aa8e7ead463a7407e1c7390f61a6610" integrity sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg== +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg== + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -2672,3 +3923,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zone.js@~0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.10.3.tgz#3e5e4da03c607c9dcd92e37dd35687a14a140c16" + integrity sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==