From 4c1b44aa2fff7266d2de43a180de6d394629758c Mon Sep 17 00:00:00 2001 From: trung2891 Date: Thu, 12 Sep 2024 16:44:37 +0700 Subject: [PATCH] chore: support convert to alloy token --- .gitignore | 2 + components/page/bridge/helper.ts | 18 +++ components/page/bridge/index.tsx | 212 ++++++++++++++++++++++++++----- constants/tokens.ts | 31 +++++ package.json | 4 +- yarn.lock | 75 +---------- 6 files changed, 240 insertions(+), 102 deletions(-) diff --git a/.gitignore b/.gitignore index fd3dbb5..b9f8d23 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ yarn-error.log* # typescript *.tsbuildinfo next-env.d.ts + +.env \ No newline at end of file diff --git a/components/page/bridge/helper.ts b/components/page/bridge/helper.ts index c5084d1..936e7b1 100644 --- a/components/page/bridge/helper.ts +++ b/components/page/bridge/helper.ts @@ -1,4 +1,11 @@ +import { token } from "@oraichain/oraidex-common/build/typechain-types/@openzeppelin/contracts"; +import { + AlloyedPool, + OsmosisAlloyedPools, + OsmosisTokenList, +} from "../../../constants/tokens"; import { fromBech32, toBech32 } from "@cosmjs/encoding"; +import { Environment } from "@/constants/ton"; export const getAddressCosmos = (addr, prefix = "osmo") => { if (!addr) throw "Address not found"; @@ -6,3 +13,14 @@ export const getAddressCosmos = (addr, prefix = "osmo") => { const cosmosAddress = toBech32(prefix, data); return cosmosAddress; }; + +export const canConvertToAlloyedToken = ( + coingeckoId: string +): AlloyedPool | undefined => { + const hasAlloyed = OsmosisTokenList(Environment.Mainnet).find( + (token) => token.coingeckoId == coingeckoId && token?.alloyedToken + ); + return hasAlloyed + ? OsmosisAlloyedPools.find((pool) => pool.alloyedToken == hasAlloyed.denom) + : undefined; +}; diff --git a/components/page/bridge/index.tsx b/components/page/bridge/index.tsx index 2839cd8..48783b2 100644 --- a/components/page/bridge/index.tsx +++ b/components/page/bridge/index.tsx @@ -29,7 +29,7 @@ import { useAuthOraiAddress, useAuthTonAddress, } from "@/stores/authentication/selector"; -import { toBinary } from "@cosmjs/cosmwasm-stargate"; +import { ExecuteInstruction, toBinary } from "@cosmjs/cosmwasm-stargate"; import { BigDecimal, CW20_DECIMALS, @@ -41,6 +41,8 @@ import { CosmosChainId, calculateTimeoutTimestamp, getCosmosGasPrice, + OSMOSIS_ROUTER_CONTRACT, + getEncodedExecuteContractMsgs, } from "@oraichain/oraidex-common"; import { BridgeAdapter, @@ -84,15 +86,17 @@ import { useCoinGeckoPrices } from "@/hooks/useCoingecko"; import SelectCommon from "@/components/commons/select"; import { NetworkWithIcon } from "@/constants/chainInfo"; import { + SwapAndAction, UniversalSwapHelper, buildUniversalSwapMemo, } from "@oraichain/oraidex-universal-swap"; -import { coin } from "@cosmjs/proto-signing"; +import { Coin, coin, coins } from "@cosmjs/proto-signing"; import { getCosmWasmClient } from "@/libs/cosmjs"; import { GasPrice } from "@cosmjs/stargate"; -import { getAddressCosmos } from "./helper"; +import { canConvertToAlloyedToken, getAddressCosmos } from "./helper"; import { ArrowDownIcon } from "@/assets/icons/arrow"; + const Bridge = () => { const oraiAddress = useAuthOraiAddress(); const tonAddress = useAuthTonAddress(); @@ -304,6 +308,46 @@ const Bridge = () => { } }; + const buildOsorSwapMsg = ({ user_swap, min_asset, timeout_timestamp, post_swap_action, affiliates }: SwapAndAction, isInitial: boolean, fromAddress?: string, funds?: Coin[]) => { + const msg = { + msg: { + swap_and_action: { + user_swap, + min_asset, + timeout_timestamp, + post_swap_action, + affiliates, + }, + } + }; + + if (isInitial) { + if (!fromAddress) { + throw new Error("Missing fromAddress"); + } + return { + msgActionSwap: { + sender: fromAddress, + contractAddress: OSMOSIS_ROUTER_CONTRACT, + funds, + ...msg + } + }; + } + + return { + msgActionSwap: { + wasm: { + contract: OSMOSIS_ROUTER_CONTRACT, + ...msg + } + } + }; + }; + + + + const handleBridgeFromTon = async () => { try { if (!oraiAddress) throw "Please connect OWallet or Kelpr!"; @@ -348,11 +392,46 @@ const Bridge = () => { : BRIDGE_TON_TO_ORAI_MINIMUM_GAS.toString(); const timeout = BigInt(Math.floor(new Date().getTime() / 1000) + 3600); + let memo = beginCell().endCell(); + if (toNetwork.id === NetworkList["osmosis-1"].id) { const osmosisAddress = await window.Keplr.getKeplrAddr(toNetwork.id); + let osmosisReceiver = osmosisAddress; if (!osmosisAddress) throw "Please connect OWallet or Kelpr!"; + let osorRouterMemo = ""; + let hasAlloyedPool = canConvertToAlloyedToken(token.coingeckoId); + if (hasAlloyedPool) { + osmosisReceiver = OSMOSIS_ROUTER_CONTRACT; + let { msgActionSwap } = buildOsorSwapMsg({ + user_swap: { + swap_exact_asset_in: { + swap_venue_name: "osmosis-poolmanager", + operations: [{ + pool: hasAlloyedPool.poolId, + denom_in: hasAlloyedPool.sourceToken, + denom_out: hasAlloyedPool.alloyedToken + }] + } + }, + min_asset: { + native: { + denom: hasAlloyedPool.alloyedToken, + amount: "0" + } + }, // consider add minimum receive (Currently, alloy pool is swap 1-1, so no't need to add min_asset + timeout_timestamp: Number(calculateTimeoutTimestamp(3600)), + post_swap_action: { + transfer: { + to_address: osmosisAddress, + }, + }, + affiliates: [] + }, false); + osorRouterMemo = JSON.stringify(msgActionSwap); + } + const buildMemoSwap = buildUniversalSwapMemo( { minimumReceive: "0", @@ -364,8 +443,8 @@ const Bridge = () => { { sourceChannel: "channel-13", sourcePort: "transfer", - receiver: osmosisAddress, - memo: "", + receiver: osmosisReceiver, + memo: osorRouterMemo, recoverAddress: oraiAddress, }, undefined @@ -541,24 +620,99 @@ const Bridge = () => { }, }); } + if (isFromOraichainToOsmosis) { + let hasAlloyedPool = canConvertToAlloyedToken(token.coingeckoId); + if (hasAlloyedPool) { + let { msgActionSwap } = buildOsorSwapMsg({ + user_swap: { + swap_exact_asset_in: { + swap_venue_name: "osmosis-poolmanager", + operations: [{ + pool: hasAlloyedPool.poolId, + denom_in: hasAlloyedPool.sourceToken, + denom_out: hasAlloyedPool.alloyedToken + }] + } + }, + min_asset: { + native: { + denom: hasAlloyedPool.alloyedToken, + amount: "0" + } + }, // consider add minimum receive (Currently, alloy pool is swap 1-1, so no't need to add min_asset + timeout_timestamp: Number(calculateTimeoutTimestamp(3600)), + post_swap_action: { + transfer: { + to_address: toAddress, + }, + }, + affiliates: [] + }, false); + memo = JSON.stringify(msgActionSwap); + toAddress = OSMOSIS_ROUTER_CONTRACT; + } + } + const ibcInfo = UniversalSwapHelper.getIbcInfo(fromChainId, toChainId); - const msgTransfer = [ - { - typeUrl: "/ibc.applications.transfer.v1.MsgTransfer", - value: MsgTransfer.fromPartial({ - sourcePort: ibcInfo.source, - sourceChannel: ibcInfo.channel, - token: coin( - toAmount(amount, token.decimal).toString(), - token.denom - ), - sender: fromAddress, - receiver: toAddress, - memo, - timeoutTimestamp: calculateTimeoutTimestamp(ibcInfo.timeout), - }), - }, - ]; + let executeMsg; + if (fromNetwork.id === NetworkList["osmosis-1"].id && token.alloyedToken) { + let hasAlloyedPool = canConvertToAlloyedToken(token.coingeckoId); + if (!hasAlloyedPool) throw new Error("AlloyPool does not exist!"); + // need convert from alloyed first + let { msgActionSwap } = buildOsorSwapMsg({ + user_swap: { + swap_exact_asset_in: { + swap_venue_name: "osmosis-poolmanager", + operations: [{ + pool: hasAlloyedPool.poolId, + denom_in: hasAlloyedPool.alloyedToken, + denom_out: hasAlloyedPool.sourceToken + }] + } + }, + min_asset: { + native: { + denom: hasAlloyedPool.sourceToken, + amount: "0" + } + }, // consider add minimum receive (Currently, alloy pool is swap 1-1, so no't need to add min_asset + timeout_timestamp: Number(calculateTimeoutTimestamp(3600)), + post_swap_action: { + ibc_transfer: { + ibc_info: { + source_channel: ibcInfo.channel, + receiver: toAddress, + memo, + recover_address: fromAddress + } + } + }, + affiliates: [] + }, true, fromAddress, coins( + toAmount(amount, token.decimal).toString(), + token.denom + )); + + executeMsg = getEncodedExecuteContractMsgs(fromAddress, [msgActionSwap as ExecuteInstruction]) + + } else + executeMsg = [ + { + typeUrl: "/ibc.applications.transfer.v1.MsgTransfer", + value: MsgTransfer.fromPartial({ + sourcePort: ibcInfo.source, + sourceChannel: ibcInfo.channel, + token: coin( + toAmount(amount, token.decimal).toString(), + token.denom + ), + sender: fromAddress, + receiver: toAddress, + memo, + timeoutTimestamp: calculateTimeoutTimestamp(ibcInfo.timeout), + }), + }, + ]; const findCosmosChain = cosmosChains.find( (chain) => chain.chainId === fromNetwork.id @@ -576,7 +730,7 @@ const Bridge = () => { ); const tx = await client.signAndBroadcast( fromAddress, - msgTransfer, + executeMsg, "auto" ); @@ -979,10 +1133,10 @@ const Bridge = () => { {/* 1 TON */} {toNetwork.id === NetworkList.ton.id || - fromNetwork.id === NetworkList.ton.id + fromNetwork.id === NetworkList.ton.id ? numberWithCommas(bridgeFee || 0, undefined, { - maximumFractionDigits: CW20_DECIMALS, - }) + maximumFractionDigits: CW20_DECIMALS, + }) : "0"}{" "} {token?.symbol} @@ -994,9 +1148,9 @@ const Bridge = () => { {!token ? "--" : formatDisplayNumber( - new BigDecimal(tokenFee).mul(amount || 0).toNumber(), - DECIMAL_TOKEN_FEE - )}{" "} + new BigDecimal(tokenFee).mul(amount || 0).toNumber(), + DECIMAL_TOKEN_FEE + )}{" "} {token?.symbol} diff --git a/constants/tokens.ts b/constants/tokens.ts index e39817d..06f1b83 100644 --- a/constants/tokens.ts +++ b/constants/tokens.ts @@ -13,6 +13,7 @@ export type TokenType = { denom: string; coingeckoId: string; decimal: number; + alloyedToken?: boolean; }; export const TON_DENOM = `factory/orai1wuvhex9xqs3r539mvc6mtm7n20fcj3qr2m0y9khx6n5vtlngfzes3k0rq9/ton`; @@ -72,9 +73,12 @@ export const OraichainTokenList = (network: Environment): TokenType[] => [ export const OsmosisTokenDenom = { [Environment.Mainnet]: { ton: "ibc/905889A7F0B94F1CE1506D9BADF13AE9141E4CBDBCD565E1DFC7AE418B3E3E98", + allTon: + "factory/osmo12lnwf54yd30p6amzaged2atln8k0l32n7ncxf04ctg7u7ymnsy7qkqgsw4/alloyed/allTON", }, [Environment.Staging]: { ton: "ibc/64BF62F8C7C0B1AADBCFBCB45E778DA144E86804420AC5AD4F29D141A14A031B", + alloyedTon: "", // not exist }, }; @@ -89,6 +93,17 @@ export const OsmosisTokenList = (network: Environment): TokenType[] => [ coingeckoId: "the-open-network", decimal: 9, }, + { + chainId: "osmosis-1", + name: "Alloyed Ton", + symbol: "allTON", + Icon: TonNetworkICon, + contractAddress: null, + denom: OsmosisTokenDenom[network].allTon, + coingeckoId: "the-open-network", + decimal: 9, + alloyedToken: true, + }, ]; export const TonTokenList = (network: Environment): TokenType[] => [ @@ -139,3 +154,19 @@ export const TonTokenList = (network: Environment): TokenType[] => [ // ] // : []), ]; + +export type AlloyedPool = { + poolId: string; + alloyedToken: string; + sourceToken: string; +}; + +export const OsmosisAlloyedPools: AlloyedPool[] = [ + { + poolId: "2161", + alloyedToken: + "factory/osmo12lnwf54yd30p6amzaged2atln8k0l32n7ncxf04ctg7u7ymnsy7qkqgsw4/alloyed/allTON", + sourceToken: + "ibc/905889A7F0B94F1CE1506D9BADF13AE9141E4CBDBCD565E1DFC7AE418B3E3E98", + }, +]; diff --git a/package.json b/package.json index adf1db3..e68396f 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,10 @@ "@leapwallet/cosmos-snap-provider": "^0.1.26", "@next/third-parties": "^14.2.5", "@noble/secp256k1": "^1.7.0", - "@oraichain/common-contracts-sdk": "^1.0.31", + "@oraichain/common-contracts-sdk": "1.0.31", "@oraichain/ethereum-multicall": "^1.0.2", "@oraichain/orai-bitcoin": "^2.0.0", - "@oraichain/oraidex-common": "^1.0.88-beta.1", + "@oraichain/oraidex-common": "^1.1.6", "@oraichain/oraidex-universal-swap": "^1.1.3", "@oraichain/ton-bridge-contracts": "^0.15.5", "@oraichain/tonbridge-contracts-sdk": "^1.3.1", diff --git a/yarn.lock b/yarn.lock index 3dedfb1..46313f7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1551,7 +1551,7 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.21.0.tgz#83f7479c524ab523ac2df702ade30b9724476c72" integrity sha512-lkC8kZYntxVKr7b8xmjCVUgE0a8xgDakPyDo9uSWavXPyYqLgYYGdEd2j8NxihRyb6UwpX3G/hFUF4/9q2V+/g== -"@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== @@ -1600,28 +1600,7 @@ serialize-error "^8.1.0" varuint-bitcoin "^1.1.2" -"@oraichain/oraidex-common@^1.0.88-beta.1": - version "1.0.88-beta.1" - resolved "https://registry.yarnpkg.com/@oraichain/oraidex-common/-/oraidex-common-1.0.88-beta.1.tgz#fe07c37a53c319500c9960815fc50adce39a38bb" - integrity sha512-Kl/pShde5yEP6OcPTaaBiIwJqX3/XxPByAmQQXw1D2n8CCyxVZcJOP8E0Iz4v4LkOVlWXh9c8WjhfhCyc4CxSQ== - dependencies: - "@cosmjs/amino" "0.31.3" - "@cosmjs/cosmwasm-stargate" "0.31.3" - "@cosmjs/crypto" "0.31.3" - "@cosmjs/proto-signing" "0.31.3" - "@cosmjs/stargate" "0.31.3" - "@cosmjs/tendermint-rpc" "0.31.3" - "@ethersproject/providers" "^5.0.10" - "@injectivelabs/sdk-ts" "1.12.1" - "@keplr-wallet/types" "^0.11.38" - "@oraichain/oraidex-contracts-sdk" latest - axios "0.26.1" - axios-extensions "3.1.3" - bignumber.js "^9.1.2" - cosmjs-types "0.8.0" - ethers "^5.0.15" - -"@oraichain/oraidex-common@^1.0.91": +"@oraichain/oraidex-common@^1.0.91", "@oraichain/oraidex-common@^1.1.6": 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== @@ -2006,11 +1985,6 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== -"@types/lru-cache@^4.1.1": - version "4.1.3" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-4.1.3.tgz#ec5eb6dd818b7a06336cfb7368723164b195f818" - integrity sha512-QjCOmf5kYwekcsfEKhcEHMK8/SvgnneuSDXFERBuC/DPca2KJIO/gpChTsVb35BoWLBpEAJWz1GFVEArSdtKtw== - "@types/mixpanel-browser@^2.49.1": version "2.49.1" resolved "https://registry.yarnpkg.com/@types/mixpanel-browser/-/mixpanel-browser-2.49.1.tgz#baf011f4f2818fda99d68874813914551e6c4442" @@ -2826,16 +2800,6 @@ axe-core@^4.9.1: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== -axios-extensions@3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/axios-extensions/-/axios-extensions-3.1.3.tgz#cd745bb7dc899743f85a2b5a291c7f36d9f41e12" - integrity sha512-/OB9OcJLNOIx9pdW4m4/hFRvNo12wlX5BaprIzqpMaLR02I88Mr98/wW4QN9rhx0/yg9rM7i6Af/RpV4MyxXjA== - dependencies: - "@types/lru-cache" "^4.1.1" - lru-cache "^5.1.1" - tslib "^1.9.0" - util "^0.11.1" - axios-extensions@3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/axios-extensions/-/axios-extensions-3.1.6.tgz#bfa72f65f44f0a3efa55a030cdaaa6451c246b1e" @@ -2861,13 +2825,6 @@ axios@0.21.4, axios@^0.21.0, axios@^0.21.2: dependencies: follow-redirects "^1.14.0" -axios@0.26.1: - version "0.26.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - axios@1.7.2, axios@^1.6.0, axios@^1.6.2, axios@^1.6.4, axios@^1.6.7: version "1.7.2" resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" @@ -5137,7 +5094,7 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.14.0, follow-redirects@^1.14.8, follow-redirects@^1.14.9, follow-redirects@^1.15.6: +follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.6: version "1.15.6" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== @@ -5791,11 +5748,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - ini@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" @@ -6722,13 +6674,6 @@ lru-cache@^10.2.0: resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.3.0.tgz#4a4aaf10c84658ab70f79a85a9a3f1e1fb11196b" integrity sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^7.14.0, lru-cache@^7.14.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" @@ -9287,7 +9232,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@1.14.1, tslib@^1.9.0: +tslib@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -9543,13 +9488,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.11.1: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - util@^0.12.3: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" @@ -9872,11 +9810,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"