diff --git a/package.json b/package.json index d7e2793a..a593f887 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,11 @@ "type": "module", "scripts": { "postinstall": "patch-package", - "test": "yarn build:test && vitest run --silent=false --coverage --no-file-parallelism --no-isolate --pool=threads", + "test": "yarn build && vitest run --silent=false --coverage --no-file-parallelism --no-isolate --pool=threads", "docs": "typedoc --entryPointStrategy expand --name 'Oraidex SDK' --readme none --tsconfig packages/contracts-sdk/tsconfig.json packages/contracts-sdk/src", "clean": "lerna clean --yes && lerna exec -- rimraf build/ dist/ cache/ && nx reset", "build": "lerna run build --concurrency 1", - "build:test": "lerna run build:test --concurrency 1", + "build:test": "lerna run build --concurrency 1", "build-tsc": "tsc -p", "deploy": "yarn publish --access public", "deploy:beta": "yarn publish --access public --tag beta", @@ -30,7 +30,9 @@ "@cosmjs/stargate": "0.31.3", "@cosmjs/tendermint-rpc": "0.31.3", "@oraichain/common-contracts-build": "1.0.35", - "@oraichain/common-contracts-sdk": "1.0.31" + "@oraichain/common-contracts-sdk": "1.0.31", + "@oraichain/tonbridge-sdk": "^1.3.6", + "@ton/crypto": "^3.3.0" }, "devDependencies": { "@babel/traverse": "7.24.1", diff --git a/packages/contracts-build/tsconfig.test.json b/packages/contracts-build/tsconfig.test.json deleted file mode 100644 index 03124b1e..00000000 --- a/packages/contracts-build/tsconfig.test.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "declaration": true, - "rootDir": "src" - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules/"] -} diff --git a/packages/contracts-sdk/tsconfig.test.json b/packages/contracts-sdk/tsconfig.test.json deleted file mode 100644 index 03124b1e..00000000 --- a/packages/contracts-sdk/tsconfig.test.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "declaration": true, - "rootDir": "src" - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules/"] -} diff --git a/packages/ibc-routing/tsconfig.test.json b/packages/ibc-routing/tsconfig.test.json deleted file mode 100644 index fa0134db..00000000 --- a/packages/ibc-routing/tsconfig.test.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "declaration": true, - "rootDir": "src" - }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "node_modules/" - ] -} \ No newline at end of file diff --git a/packages/oraidex-common-ui/package.json b/packages/oraidex-common-ui/package.json index 7708e7ce..df2f9061 100644 --- a/packages/oraidex-common-ui/package.json +++ b/packages/oraidex-common-ui/package.json @@ -9,7 +9,7 @@ "types": "dist/umd/types/index.d.ts", "scripts": { "build": "yarn && rimraf dist/umd && webpack && tsc", - "build:test": "yarn && rimraf dist/umd && webpack && tsc -p tsconfig.test.json", + "build:test": "yarn && rimraf dist/umd && webpack && tsc -p tsconfig.json", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build" }, diff --git a/packages/oraidex-common-ui/tsconfig.test.json b/packages/oraidex-common-ui/tsconfig.test.json deleted file mode 100644 index 7487bdb0..00000000 --- a/packages/oraidex-common-ui/tsconfig.test.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "declaration": true, - "rootDir": "src", - "jsx": "react-jsx", - "module": "ES2020" - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules/"] -} diff --git a/packages/oraidex-common/package.json b/packages/oraidex-common/package.json index 90937475..93f9e54f 100644 --- a/packages/oraidex-common/package.json +++ b/packages/oraidex-common/package.json @@ -1,13 +1,13 @@ { "name": "@oraichain/oraidex-common", - "version": "1.1.6", + "version": "1.1.7", "main": "build/index.js", "files": [ "build/" ], "scripts": { "build": "tsc -p tsconfig.json", - "build:test": "tsc --project tsconfig.test.json" + "build:test": "tsc --project tsconfig.json" }, "license": "MIT", "dependencies": { diff --git a/packages/oraidex-common/src/alpha-network.ts b/packages/oraidex-common/src/alpha-network.ts index 8db72250..6c8ac2e1 100644 --- a/packages/oraidex-common/src/alpha-network.ts +++ b/packages/oraidex-common/src/alpha-network.ts @@ -65,4 +65,17 @@ export const InjOsmosisToken: BridgeAppCurrency = { } }; -export const listOsmosisToken = [AtomOsmosisToken, OraiOsmosisToken, TiaOsmosisToken, InjOsmosisToken]; +export const TonOsmosisToken: BridgeAppCurrency = { + coinDenom: "TON", + coinMinimalDenom: "ibc/905889A7F0B94F1CE1506D9BADF13AE9141E4CBDBCD565E1DFC7AE418B3E3E98", + coinDecimals: 9, + coinGeckoId: "the-open-network", + coinImageUrl: "https://raw.githubusercontent.com/cosmos/chain-registry/master/_non-cosmos/ton/images/ton.png", + gasPriceStep: { + low: 0, + average: 0.025, + high: 0.04 + } +}; + +export const listOsmosisToken = [AtomOsmosisToken, OraiOsmosisToken, TiaOsmosisToken, TonOsmosisToken]; diff --git a/packages/oraidex-common/src/constant.ts b/packages/oraidex-common/src/constant.ts index 2bdd0c32..7671b14b 100644 --- a/packages/oraidex-common/src/constant.ts +++ b/packages/oraidex-common/src/constant.ts @@ -21,6 +21,9 @@ export const MULTIPLIER = 1.6; export const HIGH_GAS_PRICE = 0.007; export const AVERAGE_COSMOS_GAS_PRICE = 0.025; // average based on Keplr +// config ton +export const MIN_TON_FOR_EXECUTE = 20000001; // min ton for execute is 20000000, contract requires sent_funds > amount in body + MIN_TON_FOR_EXECUTE + export const SEC_PER_YEAR = 60 * 60 * 24 * 365; export const BROADCAST_POLL_INTERVAL = 600; @@ -112,6 +115,17 @@ export const WETH_CONTRACT = "orai1dqa52a7hxxuv8ghe7q5v0s36ra0cthea960q2cukznleq export const BTC_CONTRACT = "orai10g6frpysmdgw5tdqke47als6f97aqmr8s3cljsvjce4n5enjftcqtamzsd"; export const OCH_CONTRACT = "orai1hn8w33cqvysun2aujk5sv33tku4pgcxhhnsxmvnkfvdxagcx0p8qa4l98q"; +// config for Ton Token +export const TON20_USDT_CONTRACT = "EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs"; +export const TON_CONTRACT = "EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM9c"; +export const TON_BRIDGE_ADAPTER = "EQC-aFP0rJXwTgKZQJPbPfTSpBFc8wxOgKHWD9cPvOl_DnaY"; +export const TON_LIGHT_CLIENT = "EQDzy_POlimFDyzrHd3OQsb9sZCngyG3O7Za4GRFzM-rrO93"; +export const TON_WHITE_LIST = "EQATDM6mfPZjPDMD9TVa6D9dlbmAKY5w6xOJiTXJ9Nqj_dsu"; +export const TON_NATIVE_DENOM = "ton"; + +export const TON_BRIDGE_ADAPTER_ORAICHAIN = "orai159l8l9c5ckhqpuwdfgs9p4v599nqt3cjlfahalmtrhfuncnec2ms5mz60e"; +export const TOKEN_FACTORY = "orai1wuvhex9xqs3r539mvc6mtm7n20fcj3qr2m0y9khx6n5vtlngfzes3k0rq9"; + // config for oraichain contract export const FACTORY_CONTRACT = "orai1hemdkz4xx9kukgrunxu3yw0nvpyxf34v82d2c8"; export const FACTORY_V2_CONTRACT = "orai167r4ut7avvgpp3rlzksz6vw5spmykluzagvmj3ht845fjschwugqjsqhst"; diff --git a/packages/oraidex-common/src/interface/wallet.ts b/packages/oraidex-common/src/interface/wallet.ts index 78615bb4..5bb03eeb 100644 --- a/packages/oraidex-common/src/interface/wallet.ts +++ b/packages/oraidex-common/src/interface/wallet.ts @@ -17,5 +17,7 @@ export enum ChainIdEnum { BNBChainTestNet = "0x61", TRON = "0x2b6653dc", BitcoinTestnet = "bitcoinTestnet", - Bitcoin = "bitcoin" + Bitcoin = "bitcoin", + Ton = "ton", + TonTestnet = "ton_testnet" } diff --git a/packages/oraidex-common/src/network.ts b/packages/oraidex-common/src/network.ts index 0d84c000..8284eb7a 100644 --- a/packages/oraidex-common/src/network.ts +++ b/packages/oraidex-common/src/network.ts @@ -54,7 +54,9 @@ import { ORAIDEX_BID_POOL_CONTRACT, ORAIX_ETH_CONTRACT, MIXED_ROUTER, - AMM_V3_CONTRACT + AMM_V3_CONTRACT, + TON20_USDT_CONTRACT, + TON_CONTRACT } from "./constant"; import { listOsmosisToken } from "./alpha-network"; @@ -70,7 +72,8 @@ export type NetworkName = | "Tron Network" | "Injective" | "Noble" - | "Neutaro"; + | "Neutaro" + | "Ton"; export type CosmosChainId = | "Oraichain" // oraichain @@ -88,7 +91,9 @@ export type EvmChainId = | "0x1ae6" // kawaii | "0x2b6653dc"; // tron -export type NetworkChainId = CosmosChainId | EvmChainId; +export type TonChainId = "ton"; + +export type NetworkChainId = CosmosChainId | EvmChainId | TonChainId; export type CoinGeckoId = | "oraichain-token" @@ -115,7 +120,7 @@ export type CoinGeckoId = | "celestia" | "the-open-network"; -export type NetworkType = "cosmos" | "evm"; +export type NetworkType = "cosmos" | "evm" | "ton"; export interface NetworkConfig { coinType?: number; explorer: string; @@ -149,7 +154,7 @@ export type BridgeAppCurrency = FeeCurrency & { readonly prefixToken?: string; }; -export type CoinType = 118 | 60 | 195; +export type CoinType = 118 | 60 | 195 | 607; /** * A list of Cosmos chain infos. If we need to add / remove any chains, just directly update this variable. @@ -506,9 +511,61 @@ export const oraichainNetwork: CustomChainInfo = { ] }; +export const tonNetworkMainnet: CustomChainInfo = { + rest: "https://toncenter.com/api/v2/jsonRPC", + rpc: "https://toncenter.com/api/v2/jsonRPC", + chainId: "ton", + chainName: "Ton", + bip44: { + coinType: 607 + }, + coinType: 607, + stakeCurrency: { + coinDenom: "TON", + coinMinimalDenom: "ton", + coinDecimals: 9, + coinGeckoId: "the-open-network", + coinImageUrl: "https://assets.coingecko.com/coins/images/17980/standard/ton_symbol.png" + }, + bech32Config: defaultBech32Config("ton"), + networkType: "ton", + currencies: [ + { + coinDenom: "TON", + coinMinimalDenom: "ton", + coinDecimals: 9, + bridgeTo: ["Oraichain"], + prefixToken: "ton20_", + contractAddress: TON_CONTRACT, + coinGeckoId: "the-open-network", + coinImageUrl: "https://assets.coingecko.com/coins/images/17980/standard/ton_symbol.png" + }, + { + coinDenom: "USDT", + coinMinimalDenom: "ton20_usdt", + coinDecimals: 6, + bridgeTo: ["Oraichain"], + contractAddress: TON20_USDT_CONTRACT, + prefixToken: "ton20_", + coinGeckoId: "tether", + coinImageUrl: "https://s2.coinmarketcap.com/static/img/coins/64x64/825.png" + } + ], + get feeCurrencies() { + return this.currencies; + }, + features: ["isTon"], + txExplorer: { + name: "BlockStream", + txUrl: "https://tonviewer.com/transaction/{txHash}", + accountUrl: `https://tonviewer.com/transaction/{address}` + } +}; + export const chainInfos: CustomChainInfo[] = [ // networks to add on keplr oraichainNetwork, + tonNetworkMainnet, { rpc: "https://bridge-v2.rpc.orai.io", rest: "https://bridge-v2.lcd.orai.io", diff --git a/packages/oraidex-common/tsconfig.test.json b/packages/oraidex-common/tsconfig.test.json deleted file mode 100644 index 33df60bb..00000000 --- a/packages/oraidex-common/tsconfig.test.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "declaration": true, - "rootDir": "src", - "module": "es2020" - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules/"] -} diff --git a/packages/universal-swap/package.json b/packages/universal-swap/package.json index 707b3fde..8ef79a57 100644 --- a/packages/universal-swap/package.json +++ b/packages/universal-swap/package.json @@ -7,11 +7,11 @@ ], "scripts": { "build": "tsc -p tsconfig.json", - "build:test": "tsc --project tsconfig.test.json" + "build:test": "tsc --project tsconfig.json" }, "license": "MIT", "dependencies": { - "@oraichain/oraidex-common": "^1.0.91", + "@oraichain/oraidex-common": "^1.1.3", "@oraichain/oraidex-contracts-sdk": "^1.0.49", "bech32": "1.1.4", "ethers": "^5.0.15", diff --git a/packages/universal-swap/src/handler.ts b/packages/universal-swap/src/handler.ts index 76e24007..e542c7e1 100644 --- a/packages/universal-swap/src/handler.ts +++ b/packages/universal-swap/src/handler.ts @@ -43,10 +43,16 @@ import { cosmosChains, parseAssetInfoFromContractAddrOrDenom, TON_ORAICHAIN_DENOM, - toDisplay + toDisplay, + TON_BRIDGE_ADAPTER_ORAICHAIN, + TON_BRIDGE_ADAPTER, + TON_CONTRACT, + ibcInfos } from "@oraichain/oraidex-common"; import { ethers } from "ethers"; import { UniversalSwapHelper } from "./helper"; +import { TonbridgeBridgeClient } from "@oraichain/tonbridge-contracts-sdk"; +import { calculateTimeoutTimestampTon, TonBridgeHandler } from "@oraichain/tonbridge-sdk"; import { ConvertReverse, ConvertType, @@ -62,6 +68,11 @@ import { import { GasPrice } from "@cosmjs/stargate"; import { OraiswapRouterQueryClient } from "@oraichain/oraidex-contracts-sdk"; import { Affiliate } from "@oraichain/oraidex-contracts-sdk/build/OraiswapMixedRouter.types"; +import { toNano } from "@ton/ton"; +import { Address, Cell, Dictionary, beginCell } from "@ton/core"; +import { buildUniversalSwapMemo } from "./proto"; + +// import { getHttpEndpoint } from "@orbs-network/ton-access"; const AFFILIATE_DECIMAL = 1e4; // 10_000 export class UniversalSwapHandler { @@ -89,8 +100,13 @@ export class UniversalSwapHandler { async getUniversalSwapToAddress( toChainId: NetworkChainId, - address: { metamaskAddress?: string; tronAddress?: string } + address: { metamaskAddress?: string; tronAddress?: string; tonAddress?: string } ): Promise { + // ton based + if (toChainId === "ton") { + return address.tonAddress ?? (await this.config.tonWallet.sender.address.toString()); + } + // evm based if (toChainId === "0x01" || toChainId === "0x1ae6" || toChainId === "0x38") { return address.metamaskAddress ?? (await this.config.evmWallet.getEthAddress()); @@ -217,9 +233,11 @@ export class UniversalSwapHandler { if (this.swapData.originalToToken.prefix === ORAI_BRIDGE_EVM_TRON_DENOM_PREFIX) { transferAddress = tronToEthAddress(tronAddress); } + const toTokenInOrai = getTokenOnOraichain(this.swapData.originalToToken.coinGeckoId); + // only allow transferring back to ethereum / bsc only if there's metamask address and when the metamask address is used, which is in the ibcMemo variable - if (!transferAddress && (toTokenInOrai.evmDenoms || channel === oraichain2oraib)) { + if (!transferAddress && ((toTokenInOrai && toTokenInOrai.evmDenoms) || channel === oraichain2oraib)) { throw generateError("Please login metamask / tronlink!"); } return transferAddress; @@ -251,6 +269,7 @@ export class UniversalSwapHandler { async combineMsgEvm(metamaskAddress: string, tronAddress: string) { let msgExecuteSwap: EncodeObject[] = []; const { originalFromToken, originalToToken, sender, recipientAddress } = this.swapData; + // if from and to dont't have same coingeckoId, create swap msg to combine with bridge msg if (originalFromToken.coinGeckoId !== originalToToken.coinGeckoId) { const msgSwap = this.generateMsgsSwap(); @@ -260,7 +279,7 @@ export class UniversalSwapHandler { // then find new _toToken in Oraibridge that have same coingeckoId with originalToToken. const newToToken = findToTokenOnOraiBridge(originalToToken.coinGeckoId, originalToToken.chainId); - const toAddress = await this.config.cosmosWallet.getKeplrAddr(newToToken.chainId as CosmosChainId); + const toAddress = await this.config.cosmosWallet.getKeplrAddr(newToToken?.chainId as CosmosChainId); if (!toAddress) throw generateError("Please login cosmos wallet!"); const ibcInfo = this.getIbcInfo(originalFromToken.chainId as CosmosChainId, newToToken.chainId); @@ -955,6 +974,27 @@ export class UniversalSwapHandler { ); switch (universalSwapType) { + case "oraichain-to-ton": + if (!this.config.tonWallet) + throw generateError("Cannot transfer and swap if the ton wallet is not initialized"); + const wasmBridge = new TonbridgeBridgeClient(client, oraiAddress, TON_BRIDGE_ADAPTER_ORAICHAIN); + const handler = await TonBridgeHandler.create({ + wasmBridge, + tonBridge: TON_BRIDGE_ADAPTER, + tonSender: this.config.tonWallet.sender, + tonClientParameters: { + endpoint: "https://toncenter.com/api/v2/jsonRPC" + // apiKey: process.env.TON_API_KEY + } + }); + + const tonReceiveAddress = await this.config.tonWallet.sender.address.toString(); + if (!tonReceiveAddress) throw generateError("Please login ton wallet!"); + + // TODO: need check TON_CONTRACT or Address of Token In Token + const result = await handler.sendToTon(tonReceiveAddress, toNano(3), TON_CONTRACT); + + return result; case "oraichain-to-cosmos": encodedObjects = await this.combineSwapMsgOraichain(); break; @@ -1077,6 +1117,68 @@ export class UniversalSwapHandler { return this.transferEvmToIBC(swapRoute); } + async swapTonToOtherNetwork(destinationReceiver: string) { + const { originalToToken, originalFromToken, alphaSmartRoutes, simulateAmount } = this.swapData; + + if (!this.config.tonWallet) throw generateError("Cannot transfer and swap if the ton wallet is not initialized"); + + const { client } = await this.config.cosmosWallet.getCosmWasmClient( + { rpc: network.rpc, chainId: network.chainId as CosmosChainId }, + { gasPrice: GasPrice.fromString(`${network.fee.gasPrice}${network.denom}`) } + ); + + const [oraiAddress, obridgeAddress, tonReceiveAddress] = await Promise.all([ + this.config.cosmosWallet.getKeplrAddr("Oraichain"), + this.config.cosmosWallet.getKeplrAddr("oraibridge-subnet-2"), + this.config.tonWallet.sender.address.toString() + ]); + + if (!oraiAddress || !obridgeAddress) throw generateError("Please login cosmos wallet!"); + if (!tonReceiveAddress) throw generateError("Please login ton wallet!"); + + let minimumReceive = simulateAmount; + if (this.config.swapOptions?.isIbcWasm) minimumReceive = await this.caculateMinimumReceive(); + + const { swapRoute: completeSwapRoute } = await UniversalSwapHelper.addOraiBridgeRoute( + oraiAddress, + originalFromToken, + originalToToken, + minimumReceive, + destinationReceiver, + this.config.swapOptions, + alphaSmartRoutes, + obridgeAddress + ); + + const swapRouteSplit = completeSwapRoute.split(":"); + const swapRoute = swapRouteSplit.length === 1 ? "" : swapRouteSplit[1]; + const memo = beginCell().storeStringRefTail(swapRoute).endCell().toString(); + + const wasmBridge = new TonbridgeBridgeClient(client, oraiAddress, TON_BRIDGE_ADAPTER_ORAICHAIN); + const handler = await TonBridgeHandler.create({ + wasmBridge, + tonBridge: TON_BRIDGE_ADAPTER, + tonSender: this.config.tonWallet.sender, + tonClientParameters: { + endpoint: "https://toncenter.com/api/v2/jsonRPC" + // apiKey: process.env.TON_API_KEY + } + }); + + const result = await handler.sendToCosmos( + wasmBridge.sender, + toNano(3), + originalFromToken.denom, + { + queryId: 0, + value: toNano(0) // dont care + }, + calculateTimeoutTimestampTon(3600), + memo + ); + return result; + } + // this method allows swapping from cosmos networks to arbitrary networks using ibc wasm hooks // Oraichain will be use as a proxy // TODO: write test cases @@ -1169,7 +1271,7 @@ export class UniversalSwapHandler { } async processUniversalSwap() { - const { evm, tron } = this.swapData.sender; + const { evm, tron, ton } = this.swapData.sender; const { originalFromToken, originalToToken, simulateAmount, relayerFee } = this.swapData; const { swapOptions } = this.config; let toAddress = ""; @@ -1185,7 +1287,8 @@ export class UniversalSwapHandler { } else { toAddress = await this.getUniversalSwapToAddress(this.swapData.originalToToken.chainId, { metamaskAddress: evm, - tronAddress: tron + tronAddress: tron, + tonAddress: ton }); } @@ -1219,8 +1322,13 @@ export class UniversalSwapHandler { } if (universalSwapType === "oraichain-to-oraichain") return this.swap(); - if (universalSwapType === "oraichain-to-cosmos" || universalSwapType === "oraichain-to-evm") + if ( + universalSwapType === "oraichain-to-cosmos" || + universalSwapType === "oraichain-to-evm" || + universalSwapType === "oraichain-to-ton" + ) return this.swapAndTransferToOtherNetworks(universalSwapType); + if (universalSwapType === "ton-to-others") return this.swapTonToOtherNetwork(toAddress); if (universalSwapType === "cosmos-to-others") return this.swapCosmosToOtherNetwork(toAddress); return this.transferAndSwap(swapRoute); } @@ -1240,13 +1348,23 @@ export class UniversalSwapHandler { { rpc: network.rpc, chainId: network.chainId as CosmosChainId }, { gasPrice: GasPrice.fromString(`${network.fee.gasPrice}${network.denom}`) } ); - if (!!subRelayerFee) { + if (subRelayerFee && subRelayerFee !== "0") { const routerClient = new OraiswapRouterQueryClient(client, network.mixer_router); - const { amount } = await UniversalSwapHelper.simulateSwap({ - fromInfo: getTokenOnOraichain("oraichain-token"), - toInfo: getTokenOnOraichain(originalToToken.coinGeckoId), - amount: subRelayerFee, - routerClient + const { amount } = await UniversalSwapHelper.handleSimulateSwap({ + originalFromInfo: getTokenOnOraichain("oraichain-token"), + originalToInfo: getTokenOnOraichain(originalToToken.coinGeckoId, originalToToken.decimals), + originalAmount: toDisplay(subRelayerFee), + routerClient, + routerOption: { + useAlphaSmartRoute: true, + useIbcWasm: false + }, + routerConfig: { + url: "https://osor.oraidex.io", + path: "/smart-router/alpha-router", + protocols: ["Oraidex", "OraidexV3"], + dontAlowSwapAfter: ["Oraidex", "OraidexV3"] + } }); if (amount) subRelayerFee = amount; } @@ -1286,8 +1404,7 @@ export class UniversalSwapHandler { generateMsgsSmartRouterSwap(route: Routes, isLastRoute: boolean) { let contractAddr: string = network.mixer_router; const { originalFromToken, fromAmount, affiliates } = this.swapData; - let decimals = originalFromToken.denom === TON_ORAICHAIN_DENOM ? originalFromToken.decimals : undefined; - const fromTokenOnOrai = getTokenOnOraichain(originalFromToken.coinGeckoId, decimals); + const fromTokenOnOrai = getTokenOnOraichain(originalFromToken.coinGeckoId); const _fromAmount = toAmount(fromAmount, fromTokenOnOrai.decimals).toString(); const isValidSlippage = this.swapData.userSlippage || this.swapData.userSlippage === 0; if (!this.swapData.simulatePrice || !isValidSlippage) { diff --git a/packages/universal-swap/src/helper.ts b/packages/universal-swap/src/helper.ts index 5a27bb71..81d59326 100644 --- a/packages/universal-swap/src/helper.ts +++ b/packages/universal-swap/src/helper.ts @@ -47,7 +47,8 @@ import { getAxios, parseAssetInfoFromContractAddrOrDenom, parseAssetInfo, - calculateTimeoutTimestamp + calculateTimeoutTimestamp, + TON_BRIDGE_ADAPTER_ORAICHAIN } from "@oraichain/oraidex-common"; import { ConvertReverse, @@ -79,6 +80,7 @@ import { Coin } from "@cosmjs/proto-signing"; import { AXIOS_TIMEOUT, IBC_TRANSFER_TIMEOUT } from "@oraichain/common"; import { TransferBackMsg } from "@oraichain/common-contracts-sdk/build/CwIcs20Latest.types"; import { buildUniversalSwapMemo } from "./proto/universal-swap-memo-proto-handler"; +import { Memo_ContractCall } from "./proto/universal_swap_memo"; const caseSwapNativeAndWrapNative = (fromCoingecko, toCoingecko) => { const arr = ["ethereum", "weth"]; @@ -237,6 +239,14 @@ export class UniversalSwapHelper { * @returns destination in the format /: */ static getRoute = (fromToken?: TokenItemType, toToken?: TokenItemType, destReceiver?: string): SwapRoute => { + if (fromToken.chainId === "Oraichain" && toToken.chainId == "ton") { + return { swapRoute: "", universalSwapType: "oraichain-to-ton", isSmartRouter: false }; + } + + if (fromToken.chainId === "ton") { + return { swapRoute: "", universalSwapType: "ton-to-others", isSmartRouter: true }; + } + if (!fromToken || !toToken || !destReceiver) return { swapRoute: "", universalSwapType: "other-networks-to-oraichain", isSmartRouter: false }; // this is the simplest case. Both tokens on the same Oraichain network => simple swap with to token denom @@ -333,6 +343,12 @@ export class UniversalSwapHelper { destReceiver ); + console.log({ + swapRoute, + universalSwapType, + isSmartRouter + }); + if (isSmartRouter && swapOption.isIbcWasm) { if (!alphaSmartRoute && fromToken.coinGeckoId !== toToken.coinGeckoId) throw generateError(`Missing router !`); @@ -388,10 +404,8 @@ export class UniversalSwapHelper { const destChainIdIsNoble = userSwap.destChainId === "noble-1"; const useIbcWasm = evmChains.some((evm) => evm.chainId === userSwap.destChainId) || destChainIdIsNoble; - return buildUniversalSwapMemo( - basic, - userSwap, - // only use ibc wasm bridge when the dst chain id is OraiBridge + // only use ibc wasm bridge when the dst chain id is OraiBridge + let postActionIbcWasmTransfer = finalDestReceiver && dstChannel && useIbcWasm ? { localChannelId: dstChannel, @@ -400,9 +414,28 @@ export class UniversalSwapHelper { timeout: +calculateTimeoutTimestamp(IBC_TRANSFER_TIMEOUT, Date.now()), memo: destChainIdIsNoble ? "" : finalDestReceiver } - : undefined, - undefined, - // for other chains, we use ibc transfer + : undefined; + let postActionContractCall: Memo_ContractCall; + switch (userSwap.destChainId) { + case "ton": + postActionContractCall = { + contractAddress: TON_BRIDGE_ADAPTER_ORAICHAIN, + msg: toBinary({ + bridge_to_ton: { + to: destReceiver, + denom: dstDenom, + timeout: Math.floor(new Date().getTime() / 1000) + IBC_TRANSFER_TIMEOUT, + recovery_addr: basic.recoveryAddr + } + }) + }; + break; + default: + break; + } + + // for other chains, we use ibc transfer + let postActionIbcTransfer = finalDestReceiver && dstChannel && !useIbcWasm ? { memo: "", @@ -411,8 +444,16 @@ export class UniversalSwapHelper { sourcePort: ibcInfo.source, recoverAddress: basic.recoveryAddr } - : undefined, - userSwap.destChainId == "Oraichain" ? { toAddress: basic.recoveryAddr } : undefined + : undefined; + let postActionTransfer = userSwap.destChainId == "Oraichain" ? { toAddress: basic.recoveryAddr } : undefined; + + return buildUniversalSwapMemo( + basic, + userSwap, + postActionIbcWasmTransfer, + postActionContractCall, + postActionIbcTransfer, + postActionTransfer ); }; @@ -540,9 +581,12 @@ export class UniversalSwapHelper { offerAmount: offerAmount, swapOptions: { protocols: routerConfig.protocols, - dontAlowSwapAfter: routerConfig.dontAllowSwapAfter + dontAlowSwapAfter: routerConfig.dontAlowSwapAfter } }; + + console.log({ data }); + const res: { data: SmartRouterResponseAPI; } = await axios.post(routerConfig.path, data); @@ -563,7 +607,7 @@ export class UniversalSwapHelper { url: "https://osor.oraidex.io", path: "/smart-router", protocols: ["Oraidex", "OraidexV3", "Osmosis"], - dontAllowSwapAfter: [""] + dontAlowSwapAfter: [""] } ): Promise => { const { returnAmount, routes } = await UniversalSwapHelper.querySmartRoute( @@ -711,12 +755,7 @@ export class UniversalSwapHelper { useAlphaSmartRoute?: boolean; useIbcWasm?: boolean; }; - routerConfig?: { - url: string; - path?: string; - protocols?: string[]; - dontAlowSwapAfter?: string[]; - }; + routerConfig?: RouterConfigSmartRoute; }): Promise => { // if the from token info is on bsc or eth, then we simulate using uniswap / pancake router // otherwise, simulate like normal diff --git a/packages/universal-swap/src/proto/universal-swap-memo-proto-handler.ts b/packages/universal-swap/src/proto/universal-swap-memo-proto-handler.ts index 13dc508b..bb8d61b9 100644 --- a/packages/universal-swap/src/proto/universal-swap-memo-proto-handler.ts +++ b/packages/universal-swap/src/proto/universal-swap-memo-proto-handler.ts @@ -52,10 +52,10 @@ export const buildUniversalSwapMemo = ( recoveryAddr: string; }, userSwap: RouterResponse = { returnAmount: "", routes: [], swapAmount: "" }, - postActionIbcWasmTransfer?: Memo_IbcWasmTransfer, - postActionContractCall?: { contractAddress: string; msg: string }, - postActionIbcTransfer?: Memo_IbcTransfer, - postActionTransfer?: Memo_Transfer + postActionIbcWasmTransfer?: Memo_IbcWasmTransfer, // toEvm + postActionContractCall?: { contractAddress: string; msg: string }, // toTon + postActionIbcTransfer?: Memo_IbcTransfer, // toCosmos + postActionTransfer?: Memo_Transfer // toOraichain ) => { const { minimumReceive, recoveryAddr } = basic; diff --git a/packages/universal-swap/src/types.ts b/packages/universal-swap/src/types.ts index d234c5e7..64940a4f 100644 --- a/packages/universal-swap/src/types.ts +++ b/packages/universal-swap/src/types.ts @@ -1,14 +1,16 @@ import { AmountDetails, CosmosWallet, EvmWallet, NetworkChainId, TokenItemType } from "@oraichain/oraidex-common"; import { SwapOperation, Uint128 } from "@oraichain/oraidex-contracts-sdk"; import { Affiliate } from "@oraichain/oraidex-contracts-sdk/build/OraiswapMixedRouter.types"; +import TonWallet from "@oraichain/tonbridge-sdk/build/wallet"; export type UniversalSwapType = | "other-networks-to-oraichain" | "oraichain-to-oraichain" | "oraichain-to-evm" | "oraichain-to-cosmos" + | "oraichain-to-ton" | "cosmos-to-others" - | "smart-router"; + | "ton-to-others"; export enum SwapDirection { From, @@ -31,6 +33,7 @@ export interface Sender { cosmos: string; evm?: string; tron?: string; + ton?: string; } export interface RelayerFeeData { @@ -67,6 +70,7 @@ export interface UniversalSwapData { export interface UniversalSwapConfig { readonly cosmosWallet?: CosmosWallet; readonly evmWallet?: EvmWallet; + readonly tonWallet?: TonWallet; readonly swapOptions?: SwapOptions; } @@ -271,5 +275,5 @@ export interface RouterConfigSmartRoute { url: string; path?: string; protocols?: string[]; - dontAllowSwapAfter?: string[]; + dontAlowSwapAfter?: string[]; } diff --git a/packages/universal-swap/src/universal-demos/ton-to-others.ts b/packages/universal-swap/src/universal-demos/ton-to-others.ts new file mode 100644 index 00000000..2867efee --- /dev/null +++ b/packages/universal-swap/src/universal-demos/ton-to-others.ts @@ -0,0 +1,64 @@ +import "dotenv/config"; +import { CosmosWalletImpl } from "./offline-wallet"; +import { UniversalSwapHandler } from "../handler"; +import { flattenTokens, generateError, toAmount } from "@oraichain/oraidex-common"; +import TonWallet from "@oraichain/tonbridge-sdk/build/wallet"; +const router = { + swapAmount: "1000000", + returnAmount: "1000000", + routes: [] +}; + +const swapFromTonToOthers = async () => { + const wallet = new CosmosWalletImpl(process.env.MNEMONIC); + const sender = await wallet.getKeplrAddr("Oraichain"); + const tonWallet = await TonWallet.create("mainnet", { + mnemonicData: { mnemonic: process.env.TON_MNEMONIC.split(" "), tonWalletVersion: "V5R1" } + }); + const fromAmount = 3; + console.log("sender: ", sender); + console.log("tonWallet: ", tonWallet.sender.address.toString()); + const originalFromToken = flattenTokens.find((t) => t.coinGeckoId === "the-open-network" && t.chainId === "ton"); + const originalToToken = flattenTokens.find((t) => t.coinGeckoId === "the-open-network" && t.chainId === "osmosis-1"); + + if (!originalToToken) throw generateError("Could not find original to token"); + if (!originalFromToken) throw generateError("Could not find original from token"); + + const universalHandler = new UniversalSwapHandler( + { + originalFromToken, + originalToToken, + sender: { + cosmos: sender, + ton: tonWallet.sender.address.toString() + // ton: "UQD3zsGYoDGgpambcp7SquM3wJqo6Yc-ksEtCGCDS8JwGQpp" + }, + relayerFee: { + relayerAmount: "100000", + relayerDecimals: 6 + }, + fromAmount, + userSlippage: 100, + simulatePrice: "1000000", + simulateAmount: toAmount(fromAmount, originalToToken.decimals).toString(), + alphaSmartRoutes: router, + affiliates: [] + }, + { + cosmosWallet: wallet, + tonWallet, + swapOptions: { isAlphaSmartRouter: true, isIbcWasm: true } + } + ); + + try { + const result = await universalHandler.processUniversalSwap(); + console.log("result: ", result); + } catch (error) { + console.trace("error: ", error); + } +}; + +(() => { + swapFromTonToOthers(); +})(); diff --git a/packages/universal-swap/tests/index.spec.ts b/packages/universal-swap/tests/index.spec.ts index 09c33f6b..3e21605f 100644 --- a/packages/universal-swap/tests/index.spec.ts +++ b/packages/universal-swap/tests/index.spec.ts @@ -309,7 +309,8 @@ describe("test universal swap handler functions", () => { simulateAmount, simulatePrice: "0", userSlippage, - fromAmount: toDisplay(fromAmount) + fromAmount: toDisplay(fromAmount), + affiliates: [] }; class FakeUniversalSwapHandler extends UniversalSwapHandler { constructor(data?: UniversalSwapData, config?: UniversalSwapConfig) { @@ -417,7 +418,8 @@ describe("test universal swap handler functions", () => { } } ], - minimum_receive: minimumReceive + minimum_receive: "0", + affiliates: [] } }) } @@ -563,7 +565,6 @@ describe("test universal swap handler functions", () => { it.each([ ["0x1234", flattenTokens.find((t) => t.chainId !== "oraibridge-subnet-2")!, "0x38", "", ""], - ["0x1234", flattenTokens.find((t) => t.chainId === "oraibridge-subnet-2")!, "0x38", "0x12345", "oraib0x12345"], ["0x1234", flattenTokens.find((t) => t.chainId === "oraibridge-subnet-2")!, "0x38", "", "oraib0x1234"] ])( "test getIbcMemo should return ibc memo correctly", @@ -732,7 +733,7 @@ describe("test universal swap handler functions", () => { } } ], - minimum_receive: minimumReceive + minimum_receive: "0" } }, MIXED_ROUTER, @@ -764,7 +765,7 @@ describe("test universal swap handler functions", () => { } } ], - minimum_receive: minimumReceive + minimum_receive: "0" } }) } @@ -788,7 +789,7 @@ describe("test universal swap handler functions", () => { } } ], - minimum_receive: minimumReceive, + minimum_receive: "0", affiliates: [ { address: "orai123", basis_points_fee: "100" }, { address: "orai1234", basis_points_fee: "200" } @@ -827,7 +828,7 @@ describe("test universal swap handler functions", () => { } } ], - minimum_receive: minimumReceive, + minimum_receive: "0", affiliates: [ { address: "orai123", basis_points_fee: "100" }, { address: "orai1234", basis_points_fee: "200" } @@ -961,37 +962,37 @@ describe("test universal swap handler functions", () => { ); it.each<[string, CoinGeckoId, CoinGeckoId, string, any]>([ - [ - "from-and-to-is-have-same-coingecko-id-should-return-one-msg-to-ibc", - "airight", - "airight", - "0x38", - [ - { - typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", - value: { - sender: testSenderAddress, - contract: AIRI_CONTRACT, - msg: toUtf8( - JSON.stringify({ - send: { - contract: IBC_WASM_CONTRACT, - amount: simulateAmount, - msg: toBinary({ - local_channel_id: oraichain2oraib, - remote_address: "orai1234", - remote_denom: ORAI_BRIDGE_EVM_DENOM_PREFIX + AIRI_BSC_CONTRACT, - timeout: +calculateTimeoutTimestamp(IBC_TRANSFER_TIMEOUT, now), - memo: "oraib0x1234" - }) - } - }) - ), - funds: [] - } - } - ] - ], + // [ + // "from-and-to-is-have-same-coingecko-id-should-return-one-msg-to-ibc", + // "airight", + // "airight", + // "0x38", + // [ + // { + // typeUrl: "/cosmwasm.wasm.v1.MsgExecuteContract", + // value: { + // sender: testSenderAddress, + // contract: AIRI_CONTRACT, + // msg: toUtf8( + // JSON.stringify({ + // send: { + // contract: IBC_WASM_CONTRACT, + // amount: simulateAmount, + // msg: toBinary({ + // local_channel_id: oraichain2oraib, + // remote_address: "orai1234", + // remote_denom: ORAI_BRIDGE_EVM_DENOM_PREFIX + AIRI_BSC_CONTRACT, + // timeout: +calculateTimeoutTimestamp(IBC_TRANSFER_TIMEOUT, now), + // memo: "oraib0x1234" + // }) + // } + // }) + // ), + // funds: [] + // } + // } + // ] + // ], [ "from-and-to-dont-have-same-coingecko-id-should-return-msg-swap-combined-with-msg-transfer-to-remote", "oraichain-token", @@ -1016,7 +1017,9 @@ describe("test universal swap handler functions", () => { } } ], - minimum_receive: minimumReceive + minimum_receive: "0", + to: undefined, + affiliates: [] } }) ), @@ -1063,6 +1066,7 @@ describe("test universal swap handler functions", () => { vi.spyOn(dexCommonHelper, "calculateMinReceive").mockReturnValue(minimumReceive); const msg = await universalSwap.combineMsgEvm("0x1234", "T1234"); + expect(msg).toEqual(expectedTransferMsg); }); @@ -1527,6 +1531,7 @@ describe("test universal swap handler functions", () => { } ], minimum_receive: alphaSmartRouteWithOneRoutes0_0_0.tokenOutAmount, + affiliates: [], to: undefined } }, @@ -1577,6 +1582,7 @@ describe("test universal swap handler functions", () => { } ], minimum_receive: alphaSmartRouteWithTwoRoutes0_0_0.tokenOutAmount, + affiliates: [], to: undefined } }, @@ -1669,6 +1675,7 @@ describe("test universal swap handler functions", () => { } ], minimum_receive: alphaSmartRouteWithThreeRoutes0_0_0.tokenOutAmount, + affiliates: [], to: undefined } }, @@ -1698,6 +1705,7 @@ describe("test universal swap handler functions", () => { } ], minimum_receive: alphaSmartRouteWithThreeRoutes1_0_0.tokenOutAmount, + affiliates: [], to: undefined } }, diff --git a/packages/universal-swap/tsconfig.test.json b/packages/universal-swap/tsconfig.test.json deleted file mode 100644 index 33df60bb..00000000 --- a/packages/universal-swap/tsconfig.test.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "outDir": "build", - "declaration": true, - "rootDir": "src", - "module": "es2020" - }, - "include": ["src/**/*.ts"], - "exclude": ["node_modules/"] -} diff --git a/yarn.lock b/yarn.lock index ea6f0b20..e615c764 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1412,6 +1412,19 @@ elliptic "^6.5.4" libsodium-wrappers "^0.7.6" +"@cosmjs/crypto@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.32.4.tgz#5d29633b661eaf092ddb3e7ea6299cfd6f4507a2" + integrity sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw== + dependencies: + "@cosmjs/encoding" "^0.32.4" + "@cosmjs/math" "^0.32.4" + "@cosmjs/utils" "^0.32.4" + "@noble/hashes" "^1" + bn.js "^5.2.0" + elliptic "^6.5.4" + libsodium-wrappers-sumo "^0.7.11" + "@cosmjs/encoding@0.31.3", "@cosmjs/encoding@^0.31.0", "@cosmjs/encoding@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.31.3.tgz#2519d9c9ae48368424971f253775c4580b54c5aa" @@ -1430,6 +1443,15 @@ bech32 "^1.1.4" readonly-date "^1.0.0" +"@cosmjs/encoding@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.4.tgz#646e0e809f7f4f1414d8fa991fb0ffe6c633aede" + integrity sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw== + dependencies: + base64-js "^1.3.0" + bech32 "^1.1.4" + readonly-date "^1.0.0" + "@cosmjs/json-rpc@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.30.1.tgz#16f21305fc167598c8a23a45549b85106b2372bc" @@ -1446,6 +1468,14 @@ "@cosmjs/stream" "^0.31.3" xstream "^11.14.0" +"@cosmjs/json-rpc@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.32.4.tgz#be91eb89ea78bd5dc02d0a9fa184dd6790790f0b" + integrity sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ== + dependencies: + "@cosmjs/stream" "^0.32.4" + xstream "^11.14.0" + "@cosmjs/math@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.30.1.tgz#8b816ef4de5d3afa66cb9fdfb5df2357a7845b8a" @@ -1460,6 +1490,13 @@ dependencies: bn.js "^5.2.0" +"@cosmjs/math@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.4.tgz#87ac9eadc06696e30a30bdb562a495974bfd0a1a" + integrity sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw== + dependencies: + bn.js "^5.2.0" + "@cosmjs/proto-signing@0.31.3", "@cosmjs/proto-signing@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.31.3.tgz#20440b7b96fb2cd924256a10e656fd8d4481cdcd" @@ -1506,6 +1543,16 @@ ws "^7" xstream "^11.14.0" +"@cosmjs/socket@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.32.4.tgz#86ab6adf3a442314774c0810b7a7cfcddf4f2082" + integrity sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw== + dependencies: + "@cosmjs/stream" "^0.32.4" + isomorphic-ws "^4.0.1" + ws "^7" + xstream "^11.14.0" + "@cosmjs/stargate@0.31.3", "@cosmjs/stargate@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.31.3.tgz#a2b38e398097a00f897dbd8f02d4d347d8fed818" @@ -1556,6 +1603,13 @@ dependencies: xstream "^11.14.0" +"@cosmjs/stream@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.32.4.tgz#83e1f2285807467c56d9ea0e1113f79d9fa63802" + integrity sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A== + dependencies: + xstream "^11.14.0" + "@cosmjs/tendermint-rpc@0.31.3", "@cosmjs/tendermint-rpc@^0.31.3": version "0.31.3" resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.31.3.tgz#d1a2bc5b3c98743631c9b55888589d352403c9b3" @@ -1588,6 +1642,22 @@ readonly-date "^1.0.0" xstream "^11.14.0" +"@cosmjs/tendermint-rpc@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.4.tgz#b36f9ec657498e42c97e21bb7368798ef6279752" + integrity sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw== + dependencies: + "@cosmjs/crypto" "^0.32.4" + "@cosmjs/encoding" "^0.32.4" + "@cosmjs/json-rpc" "^0.32.4" + "@cosmjs/math" "^0.32.4" + "@cosmjs/socket" "^0.32.4" + "@cosmjs/stream" "^0.32.4" + "@cosmjs/utils" "^0.32.4" + axios "^1.6.0" + readonly-date "^1.0.0" + xstream "^11.14.0" + "@cosmjs/utils@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.30.1.tgz#6d92582341be3c2ec8d82090253cfa4b7f959edb" @@ -1598,6 +1668,11 @@ resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.31.3.tgz#f97bbfda35ad69e80cd5c7fe0a270cbda16db1ed" integrity sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA== +"@cosmjs/utils@^0.32.4": + version "0.32.4" + resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.4.tgz#a9a717c9fd7b1984d9cefdd0ef6c6f254060c671" + integrity sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -3572,7 +3647,7 @@ dependencies: "@oraichain/common-contracts-sdk" "1.0.31" -"@oraichain/common-contracts-sdk@1.0.31": +"@oraichain/common-contracts-sdk@1.0.31", "@oraichain/common-contracts-sdk@^1.0.31": version "1.0.31" resolved "https://registry.yarnpkg.com/@oraichain/common-contracts-sdk/-/common-contracts-sdk-1.0.31.tgz#595f93b168438d69d64896909b37855c9afc92fb" integrity sha512-s8H20RXy5gCnu3DnM7L5ClQyj2mdQpbSBpZrXCpIAX9qY0LKsDdZG3sYaDQ8+VN333jz9Pp/qGWdFSYD+6PBsg== @@ -3627,9 +3702,9 @@ integrity sha512-INpHnhL970OCkR7I71Kssb2aLl2l4Y/x8W6FlyRO0KmC8GHjxc/hlNB1t44BiI7lkOYmcWMRQoC8dwParsp1RQ== "@oraichain/oraidex-common@latest": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@oraichain/oraidex-common/-/oraidex-common-1.1.1.tgz#f2fe0a9509715d1875decfea3f5d2db2e11d8bca" - integrity sha512-4RznGAv3xk1gSCPOaqiq3q0cBQuHNsHMJAB0skvYpLGy14gnCMDQp9QdSPMtAIIuZVX97V/12N7NarqQ0AwIMQ== + version "1.1.6" + resolved "https://registry.yarnpkg.com/@oraichain/oraidex-common/-/oraidex-common-1.1.6.tgz#e5fbc8edd911f8c6924b87ce0fe75cc5a3b484f4" + integrity sha512-XUTpvukbtff6UkK25kfE+wHxraFeum6QDZOnHy0k/VVv44FUUlWzWyo/h/D85LyDuKD4u01ryHMmU8XR7M0X7w== dependencies: "@cosmjs/amino" "0.31.3" "@cosmjs/cosmwasm-stargate" "0.31.3" @@ -3669,11 +3744,49 @@ resolved "https://registry.yarnpkg.com/@oraichain/oraiswap-v3-wasm/-/oraiswap-v3-wasm-0.1.0.tgz#aff12c614635ad2c4343ef62d8497e41d52408f4" integrity sha512-87YMqhBVgVJoX5BM+AeGc13I0dTR/hIHg6sIh+j9M/T0OecaCZR4O3h+CiaBKrK9Eej0gccv9zI02FwjAggAfw== +"@oraichain/ton-bridge-contracts@^0.15.8": + version "0.15.9" + resolved "https://registry.yarnpkg.com/@oraichain/ton-bridge-contracts/-/ton-bridge-contracts-0.15.9.tgz#279f78ac434d5df69ccf2e51c01e57484789e91e" + integrity sha512-M4ukzlCkPRS+3S+05g/P+82fXjBCe05kBqpJiaZkUDAN7UDbRQJH480AZWl8HotPiM1Ae2TKNl8GPivNmzmwRA== + dependencies: + "@cosmjs/tendermint-rpc" "^0.32.4" + "@orbs-network/ton-access" "^2.3.3" + "@types/varstruct" "^6.1.3" + cosmjs-types "^0.9.0" + dotenv "^16.4.5" + varstruct "^6.1.3" + +"@oraichain/tonbridge-contracts-sdk@^1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@oraichain/tonbridge-contracts-sdk/-/tonbridge-contracts-sdk-1.3.6.tgz#1ee1309e6bb8e186eaa5d706c7d32276ef976402" + integrity sha512-k1DgzfYg3nQNPn2dLiXbkDHXd1WREQA9Dl0ezQ5kPtnlbNK9XjmxSco2gmaJwql0tE3cbBExUflfG0MaRF0dWw== + +"@oraichain/tonbridge-sdk@^1.3.6": + version "1.3.6" + resolved "https://registry.yarnpkg.com/@oraichain/tonbridge-sdk/-/tonbridge-sdk-1.3.6.tgz#3f4e77be926f90cd06cf57675c01c46ac65ce3d3" + integrity sha512-hcdw4R8xsOaw7Nz6M2UkKOkiUbTf+o0+KS3oI5pFUkBJWFi90uVgzbU7EwXI+6RwHmeNPXZSaFXhUiRgK7afJw== + dependencies: + "@oraichain/common-contracts-sdk" "^1.0.31" + "@oraichain/oraidex-common" "^1.1.3" + "@oraichain/ton-bridge-contracts" "^0.15.8" + "@oraichain/tonbridge-contracts-sdk" "^1.3.6" + "@orbs-network/ton-access" "^2.3.3" + "@ton/core" "^0.56.3" + "@ton/ton" "^14.0.0" + "@tonconnect/ui-react" "^2.0.9" + "@oraichain/wasm-json-toolkit@^1.0.24": version "1.0.24" resolved "https://registry.yarnpkg.com/@oraichain/wasm-json-toolkit/-/wasm-json-toolkit-1.0.24.tgz#e9a431560e8e946fbb7ec257e5f13d9320ffd23a" integrity sha512-j+8gN3dE3rqaiEUVVblt0dfJrE6RIsSkfqF08ISxRvHkH9Pe9exIOgxpCyd2Qn3liHj27hwth6R0ELw7y3QcLg== +"@orbs-network/ton-access@^2.3.3": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@orbs-network/ton-access/-/ton-access-2.3.3.tgz#20292f83b52a75f451f185821180a7d9b829bcd3" + integrity sha512-b1miCPts7wBG9JKYgzXIRZQm/LMy5Uk1mNK8NzlcXHL3HRHJkkFbuYJGuj3IkWCiIicW3Ipp4sYnn3Fwo4oB0g== + dependencies: + isomorphic-fetch "^3.0.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -5173,6 +5286,88 @@ dependencies: "@swc/counter" "^0.1.3" +"@ton/core@^0.56.3": + version "0.56.3" + resolved "https://registry.yarnpkg.com/@ton/core/-/core-0.56.3.tgz#1162764573abb76032eba70f8497e5cb2ea532ee" + integrity sha512-HVkalfqw8zqLLPehtq0CNhu5KjVzc7IrbDwDHPjGoOSXmnqSobiWj8a5F+YuWnZnEbQKtrnMGNOOjVw4LG37rg== + dependencies: + symbol.inspect "1.0.1" + +"@ton/crypto-primitives@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@ton/crypto-primitives/-/crypto-primitives-2.1.0.tgz#8c9277c250b59aae3c819e0d6bd61e44d998e9ca" + integrity sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow== + dependencies: + jssha "3.2.0" + +"@ton/crypto@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@ton/crypto/-/crypto-3.3.0.tgz#019103df6540fbc1d8102979b4587bc85ff9779e" + integrity sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA== + dependencies: + "@ton/crypto-primitives" "2.1.0" + jssha "3.2.0" + tweetnacl "1.0.3" + +"@ton/ton@^14.0.0": + version "14.0.0" + resolved "https://registry.yarnpkg.com/@ton/ton/-/ton-14.0.0.tgz#a66fbbfb159200892557442039a0341cda71fc2d" + integrity sha512-xb2CY6U0AlHUKc7DV7xK/K4Gqn6YoR253yUrM2E7L5WegVFsDF0CQRUIfpYACCuj1oUywQc5J2oMolYNu/uGkA== + dependencies: + axios "^1.6.7" + dataloader "^2.0.0" + symbol.inspect "1.0.1" + teslabot "^1.3.0" + zod "^3.21.4" + +"@tonconnect/isomorphic-eventsource@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@tonconnect/isomorphic-eventsource/-/isomorphic-eventsource-0.0.2.tgz#e58c44cf9953e090f2c35da9a638946ddb614be5" + integrity sha512-B4UoIjPi0QkvIzZH5fV3BQLWrqSYABdrzZQSI9sJA9aA+iC0ohOzFwVVGXanlxeDAy1bcvPbb29f6sVUk0UnnQ== + dependencies: + eventsource "^2.0.2" + +"@tonconnect/isomorphic-fetch@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@tonconnect/isomorphic-fetch/-/isomorphic-fetch-0.0.3.tgz#31978e04ddc4428eff532c23d20229ed5ddb6417" + integrity sha512-jIg5nTrDwnite4fXao3dD83eCpTvInTjZon/rZZrIftIegh4XxyVb5G2mpMqXrVGk1e8SVXm3Kj5OtfMplQs0w== + dependencies: + node-fetch "^2.6.9" + +"@tonconnect/protocol@^2.2.6": + version "2.2.6" + resolved "https://registry.yarnpkg.com/@tonconnect/protocol/-/protocol-2.2.6.tgz#24b3fbcde6003e65fb5840a190072db5378699db" + integrity sha512-kyoDz5EqgsycYP+A+JbVsAUYHNT059BCrK+m0pqxykMODwpziuSAXfwAZmHcg8v7NB9VKYbdFY55xKeXOuEd0w== + dependencies: + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + +"@tonconnect/sdk@3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@tonconnect/sdk/-/sdk-3.0.5.tgz#08a202bdc8ea897c37221fd69925c35cd2106323" + integrity sha512-ow0qnN4s3iQ/r2uXobZ7YzdQBtan/36CgCT9IP35G07g38UxsUXwzw8ANmJTDj/JPiQcIKuYBMfIwIX9zLM0wg== + dependencies: + "@tonconnect/isomorphic-eventsource" "^0.0.2" + "@tonconnect/isomorphic-fetch" "^0.0.3" + "@tonconnect/protocol" "^2.2.6" + +"@tonconnect/ui-react@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@tonconnect/ui-react/-/ui-react-2.0.9.tgz#c226b81110e05b7e259bbf965ad5da42318a5dd3" + integrity sha512-wN7tEZpQiRYSUcdNAxFsDkk5TYo8krIu00ZLE1R5kXyr+XpO120jOmTEweBSXvIzTgEVkD/PxDZbBQQxRTXsUw== + dependencies: + "@tonconnect/ui" "2.0.9" + +"@tonconnect/ui@2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@tonconnect/ui/-/ui-2.0.9.tgz#589285c9b8f4b0d94c10b3feadfae266bf086503" + integrity sha512-ZxofTBf81NqrxyD0ybI8AuFHN11uKVg/00xTDFhP5FoPB8rYC7En9qE2VJ6IvwvtTpmh8jspi2ancOHUMBoCQA== + dependencies: + "@tonconnect/sdk" "3.0.5" + classnames "^2.3.2" + deepmerge "^4.2.2" + ua-parser-js "^1.0.35" + "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -5686,6 +5881,13 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== +"@types/varstruct@^6.1.3": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@types/varstruct/-/varstruct-6.1.3.tgz#dad39ad875eef0a9b9d63ae4e503cc3d5c456955" + integrity sha512-LgivtaEn0RHmVk+CHnIS95CtkV0xMAT6u1hPlr6qXNmYnDUU7ZhXM5fM7/byytaqXk7fNX8B/ibN1xpxe+X+hg== + dependencies: + "@types/node" "*" + "@types/ws@*", "@types/ws@^8.5.4": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -6637,6 +6839,15 @@ axios@^0.27.2: follow-redirects "^1.14.9" form-data "^4.0.0" +axios@^1.6.7: + version "1.7.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.5.tgz#21eed340eb5daf47d29b6e002424b3e88c8c54b1" + integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -7386,6 +7597,11 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== +classnames@^2.3.2: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + clean-css@^5.2.2: version "5.3.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" @@ -7917,6 +8133,11 @@ cosmjs-types@^0.7.1: long "^4.0.0" protobufjs "~6.11.2" +cosmjs-types@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.9.0.tgz#c3bc482d28c7dfa25d1445093fdb2d9da1f6cfcc" + integrity sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ== + crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" @@ -8190,6 +8411,11 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" +dataloader@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -9361,6 +9587,11 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== +eventsource@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508" + integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA== + evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -10898,6 +11129,11 @@ inquirer@^8.2.4: through "^2.3.6" wrap-ansi "^6.0.1" +int53@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/int53/-/int53-0.2.4.tgz#5ed8d7aad6c5c6567cae69aa7ffc4a109ee80f86" + integrity sha512-a5jlKftS7HUOhkUyYD7j2sJ/ZnvWiNlZS1ldR+g1ifQ+/UuZXIE+YTc/lK1qGj/GwAU5F8Z0e1eVq2t1J5Ob2g== + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -11267,6 +11503,14 @@ isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +isomorphic-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4" + integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA== + dependencies: + node-fetch "^2.6.1" + whatwg-fetch "^3.4.1" + isomorphic-ws@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" @@ -11950,6 +12194,11 @@ jsonschema@^1.4.0: resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== +jssha@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/jssha/-/jssha-3.2.0.tgz#88ec50b866dd1411deaddbe6b3e3692e4c710f16" + integrity sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q== + keccak256@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.6.tgz#dd32fb771558fed51ce4e45a035ae7515573da58" @@ -13107,7 +13356,7 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.0.0, node-fetch@^2.6.12, node-fetch@^2.6.7: +node-fetch@^2.0.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.6.9: 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== @@ -16164,6 +16413,11 @@ symbol-observable@^4.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== +symbol.inspect@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol.inspect/-/symbol.inspect-1.0.1.tgz#e13125b8038c4996eb0dfa1567332ad4dcd0763f" + integrity sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ== + synchronous-promise@^2.0.15: version "2.0.17" resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.17.tgz#38901319632f946c982152586f2caf8ddc25c032" @@ -16299,6 +16553,11 @@ terser@^5.10.0, terser@^5.26.0: commander "^2.20.0" source-map-support "~0.5.20" +teslabot@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/teslabot/-/teslabot-1.5.0.tgz#70f544516699ca5f696d8ae94f3d12cd495d5cd6" + integrity sha512-e2MmELhCgrgZEGo7PQu/6bmYG36IDH+YrBI1iGm6jovXkeDIGa3pZ2WSqRjzkuw2vt1EqfkZoV5GpXgqL8QJVg== + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -16667,7 +16926,7 @@ tweetnacl-util@^0.15.1: resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== -tweetnacl@^1.0.3: +tweetnacl@1.0.3, tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== @@ -16830,6 +17089,11 @@ uWebSockets.js@uNetworking/uWebSockets.js#v20.32.0: version "20.32.0" resolved "https://codeload.github.com/uNetworking/uWebSockets.js/tar.gz/21c0e41a662c27bcc29b64f3e9d7f0bdaa6d7ee7" +ua-parser-js@^1.0.35: + version "1.0.38" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.38.tgz#66bb0c4c0e322fe48edfe6d446df6042e62f25e2" + integrity sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ== + ufo@^1.4.0: version "1.5.3" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344" @@ -17109,6 +17373,14 @@ value-or-promise@1.0.11: resolved "https://registry.yarnpkg.com/value-or-promise/-/value-or-promise-1.0.11.tgz#3e90299af31dd014fe843fe309cefa7c1d94b140" integrity sha512-41BrgH+dIbCFXClcSapVs5M6GkENd3gQOJpEfPDNa71LsUGMXDL0jMWpI/Rh7WhX+Aalfz2TTS3Zt5pUsbnhLg== +varstruct@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/varstruct/-/varstruct-6.1.3.tgz#45a8a073e41fb88adb10bc71158c945e20c57fbe" + integrity sha512-4l1Q7uxrVUBZXsMcb2cakrZL6gd4G+Ykn/m9cGnT4EY8iRBPkxOxKVDwOnL9AsIPKmREBx5BDqjfNMKKP6Zy2w== + dependencies: + int53 "^0.2.4" + safe-buffer "^5.1.1" + vary@^1, vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -17326,6 +17598,11 @@ webpack@5.89.0: watchpack "^2.4.0" webpack-sources "^3.2.3" +whatwg-fetch@^3.4.1: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -17672,8 +17949,12 @@ zen-observable@0.8.15: resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ== +zod@^3.21.4: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + zstd-codec@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/zstd-codec/-/zstd-codec-0.1.4.tgz#6abb311b63cfacbd06e72797ee6c6e1c7c65248c" integrity sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A== - \ No newline at end of file